Политика работы с Redis‑кэшем
Документ описывает, как мы именуем, наполняем и очищаем Redis в проекте MARV. Соблюдайте единые правила — это избавляет от конфликтов и непредсказуемых очисток.
1. Пространства ключей
| Префикс | Назначение | Пример | Очищается при старте |
|---|---|---|---|
marv:cache:* | Волатильные данные, которые можно удалять | marv:cache:users:1:12345 | Да, полностью |
marv:persist:* | Очереди/служебные флаги, которые должны жить долго | marv:persist:updates:users:42 | Нет |
cachekeys.Normalizeпереписывает только устаревшиеcache:*ключи вmarv:cache:*; ключи с префиксомmarv:пропускаются как есть, любые другие строки остаются без изменений (функция не оборачивает произвольные строки в namespace).- Всё, что должно переживать рестарт, хранится под
marv:persist:*.
2. Сборка ключей (pkg/cachekeys)
Build(parts ...any)— собирает ключ вmarv:cache:<parts...>(разделитель:).Normalize(key string)— нормализует legacy-ключи (см. ниже).- Паттерны для SCAN/KEYS собираются тем же
Build, где последним сегментом идёт"*"(напримерBuild("messages", "unread", "*")). - Для персистентных структур есть отдельные хелперы:
UserUpdatesKey/UserUpdatesPattern,OnlineKey/OnlinePattern,SessionsDayKey,LeaderElectionKey.
Правило: никаких ручных конкатенаций строк — только cachekeys.
3. Очистка при запуске
- Конфиг
app.cache_clear.enabled(по умолчанию true) включает/выключает очистку. application/container.Container.clearVolatileCaches:- Удаляет весь
marv:cache:*(черезcachekeys.Build("*")). - Обрабатывает
app.cache_clear.patterns. Строки безmarv:автоматически оборачиваются вcachekeys.Build(...).
- Удаляет весь
- Пространство
marv:persist:*не затрагивается.
Пример настройки:
yaml
app:
cache_clear:
enabled: true
patterns:
- "marv:cache:legacy_service:*"
- "tmp:*" # станет marv:cache:tmp:*4. Семейства кэшей
Пользователи
marv:cache:users:<api_type>:<api_uid>marv:cache:users:by_operator_email:<email>- Инвалидация: все операции
domain/services/users, плюс глобальная очистка.
Миры
marv:cache:worlds:<user_id>:<type>(<user_id>— внутренний числовой ID пользователя)- Очищается репозиторием миров и при рестарте.
Remote Configs
marv:cache:remote_configs:<api_type>(включаяglobal)- Инвалидация при create/update/delete и на старте.
Сообщения
marv:cache:messages:unread:<user_id>(<user_id>— внутренний числовой ID пользователя)- Чистятся при доставке сообщений и глобальной очисткой.
События / Event Results
marv:cache:events:active:<YYYYMMDD>marv:cache:events:lookback:<YYYYMMDD>marv:cache:events:starting:<YYYYMMDD>:<YYYYMMDD>(диапазон from:to)marv:cache:event_results:table:<event_id>:<group>:<group_num>:<with_data>- Инвалидация в сервисах + при рестарте.
Потоки и live inputs
marv:cache:streams:list,marv:cache:streams:id:<id>marv:cache:stream_inputs:<user_id>:<stream_id>(<user_id>— внутренний числовой ID пользователя)marv:cache:stream_inputs:list:<user_id>- Очищаются сервисами Streams/Inputs и при старте.
Traffic Flow
marv:cache:traffic_flows:*marv:cache:traffic_flow_entries:<user_id>(<user_id>— внутренний числовой ID пользователя)- Инвалидация при любых мутациях и при рестарте.
Rivals
marv:cache:rivals:<user_id>(<user_id>— внутренний числовой ID пользователя)- Чистится при справочных операциях и при запуске.
Transactions
marv:cache:transactions:<api_type>:<api_uid>- Удаляется после завершения транзакции и на старте.
Ads
marv:cache:ads:enabled- Инвалидация при любой операции над объявлениями + общий вайп.
Эксперименты (A/B)
marv:cache:experiments:list— полный список экспериментов.marv:cache:experiments:<id>— эксперимент по ID.- Инвалидация при create/update/delete/toggle, изменении назначений и на старте.
Планировщик
marv:cache:scheduler:manual_run:<tag>— очередь ручных запусков leader-only задач (нелидер кладёт тег, лидер вычитывает и выполняет). TTL 10 минут.
5. Персистентные ключи (не очищаются)
marv:persist:updates:users:<user_id>— очередь отложенных обновлений (читается задачейuser_data_batch_update).marv:persist:leader[:suffix]— ключи выборов лидера (реализация — общий модульshared/leader, ключ строитLeaderElectionKeyизpkg/cachekeys; значение =app.server.id).marv:persist:online:<user_id>— маркер присутствия пользователя онлайн. Устанавливается с TTL (app.online_ttl, по умолчанию 5 мин) при каждом аутентифицированном V2-запросе и при логине. ИспользуетсяOnlineTrackerдля подсчёта пользователей онлайн черезKEYS marv:persist:online:*.marv:persist:sessions:<YYYY-MM-DD>— счётчик сессий за день. Инкрементируется (INCR) при каждом успешном/v2/login. TTL устанавливается до конца следующего дня при первом инкременте.- Любые другие долгоживущие структуры размещайте здесь, если их нельзя терять на рестарте.
