Skip to content

Политика работы с 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:
    1. Удаляет весь marv:cache:* (через cachekeys.Build("*")).
    2. Обрабатывает 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 устанавливается до конца следующего дня при первом инкременте.
  • Любые другие долгоживущие структуры размещайте здесь, если их нельзя терять на рестарте.