Skip to content

Политика работы с Redis‑кэшем

Документ описывает, как мы именуем, наполняем и очищаем Redis в проекте MARV. Соблюдайте единые правила — это избавляет от конфликтов и непредсказуемых очисток.


1. Пространства ключей

ПрефиксНазначениеПримерОчищается при старте
marv:cache:*Волатильные данные, которые можно удалятьmarv:cache:users:1:12345Да, полностью
marv:persist:*Очереди/служебные флаги, которые должны жить долгоmarv:persist:updates:users:42Нет
  • Любые устаревшие cache:* ключи нормализуются в marv:cache:* через cachekeys.Normalize.
  • Всё, что должно переживать рестарт, хранится под marv:persist:*.

2. Сборка ключей (domain/shared/cachekeys)

  • Build(parts ...any) — собирает ключ в marv:cache.
  • Pattern(parts ...any) — аналог для SCAN/KEYS.
  • Normalize(key string) — приводит произвольную строку к корректному namespace.
  • Для персистентных структур используйте LeaderElectionKey, UserUpdatesKey и др.

Правило: никаких ручных конкатенаций строк — только 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_acp_user_id:<acp_id>
  • Инвалидация: все операции domain/services/users, плюс глобальная очистка.

Миры

  • marv:cache:worlds:<api_type>:<api_uid>:<type>
  • Очищается репозиторием миров и при рестарте.

Remote Configs

  • marv:cache:remote_configs:<api_type> (включая global)
  • Инвалидация при create/update/delete и на старте.

Сообщения

  • marv:cache:messages:uncompleted:global:<api_type>
  • marv:cache:messages:uncompleted:personal:<api_type>:<api_uid>
  • Чистятся при доставке сообщений и глобальной очисткой.

События / Event Results

  • marv:cache:events:active:<YYYYMMDD>
  • 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:<api_type>:<api_uid>
  • Очищаются сервисами Streams/Inputs и при старте.

Traffic Flow

  • marv:cache:traffic_flows:*
  • marv:cache:traffic_flow_entries:<api_type>:<api_uid>
  • Инвалидация при любых мутациях и при рестарте.

Rivals

  • marv:cache:rivals:<api_type>:<api_uid>:<limit>
  • Чистится при справочных операциях и при запуске.

Transactions

  • marv:cache:transactions:<api_type>:<api_uid>
  • Удаляется после завершения транзакции и на старте.

Ads

  • marv:cache:ads:enabled
  • Инвалидация при любой операции над объявлениями + общий вайп.

5. Персистентные ключи (не очищаются)

  • marv:persist:updates:users:<user_id> — очередь отложенных обновлений (читается задачей user_data_batch_update).
  • marv:persist:leader[:suffix] — ключи выборов лидера (internal/infrastructure/leader, значение = app.server.id).
  • Любые другие долгоживущие структуры размещайте здесь, если их нельзя терять на рестарте.

6. Рекомендации

  1. Всегда используйте cachekeys для генерации ключей и паттернов.
  2. Всё, что должно пережить рестарт, храните под marv:persist.
  3. Документируйте новые семейства (здесь или в README конкретного сервиса).
  4. Если нужно выбратьочную очистку, добавьте паттерны в конфиг, либо храните ключи в другом пространстве.

Соблюдая эти правила, мы сохраняем предсказуемое поведение кэшей на всех окружениях.