Политика работы с 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:- Удаляет весь
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_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. Рекомендации
- Всегда используйте
cachekeysдля генерации ключей и паттернов. - Всё, что должно пережить рестарт, храните под
marv:persist. - Документируйте новые семейства (здесь или в README конкретного сервиса).
- Если нужно выбратьочную очистку, добавьте паттерны в конфиг, либо храните ключи в другом пространстве.
Соблюдая эти правила, мы сохраняем предсказуемое поведение кэшей на всех окружениях.
