Топология Redis и единый реестр ключей: какие физические инстансы держит модуль, какие ключи в них живут и сколько. Опирается на ось «система записи vs быстрый производный» — водораздел ниже.
потеря болезненна, но восстановима темпом
источник истины, терять нельзя
Доступ. Оба инстанса — только во внутренней сети,
наружу не публикуются; вход по паролю (requirepass), в
проде канал под TLS. В Redis лежат счётчики rate-limit и
blacklist токенов
v2 — читать их извне нельзя.
maxmemory + noeviction · AOF-персист · переживает рестартmaxmemory политика noeviction отклоняет новую запись с ошибкой, а не выкидывает данные. Продьюсеры упираются в отказ и тормозят (backpressure) — инстанс не растёт без предела и не уходит под OOM-killer. Глубину очереди всё равно держим под мониторингом, чтобы до потолка не доходить.maxmemory + allkeys-lru · без персистаЧасть состояния живёт ровно столько, сколько окно, в которое оно что-то значит — TTL сам убирает ключ, отдельной уборки не нужно.
job_id — один прогон. Окно
отсекает дубль-постановку той же задачи; полная механика —
на единственности.
Единая конвенция префиксов: namespace по двоеточию задаёт инстанс, срок жизни и владельца. Новый ключ — новая строка здесь, не свободное имя в коде.
| Namespace | Назначение | Инстанс | TTL | Владелец |
|---|---|---|---|---|
| q: | очередь задач — полезная нагрузка прогонов | durable | до завершения | очереди |
| rl: | счётчики rate-limit (token-bucket · скользящее окно) | durable | окно лимита | rate-limit |
| brute: | состояние brute-force барьера — окно по IP, счётчик и задержка по аккаунту, попытки кода привязки | durable | окно барьера | Auth & Security |
| grace: | грация ротации refresh — старый токен → новая пара на ~10 с | durable | окно грации | Auth & Security |
| bl: v2 | blacklist отозванных jti |
durable | lifetime access-токена | Auth & Security |
| cache: | кэш кандидатов поиска | cache | per-key (+ LRU) | кэш |
| lock: | координационный замок для обслуживания — один держатель одновременно (maintenance-режим · restore KS) | durable | на время операции | прогоны |
| dedup:webhook: | дедуп входящих webhook-доставок — одно событие, одна обработка | durable | окно приёма | Harvester |
| dedup:slack-event: | дедуп входящих событий Slack-бота — повтор не отвечает дважды | durable | окно приёма | Slack |
| dedup:telegram-update: | идемпотентность повторов апдейтов Telegram (по update_id) — повтор не отвечает дважды |
durable | окно приёма | Telegram |
| telegram:active-conv:chat_id | указатель активной беседы для chat_id — реплики продолжают её; /new его сбрасывает, следующее сообщение откроет новую (дом истины беседы — Postgres conversations) |
cache | скользящий, на время беседы | Telegram |
| cache:mattermost:listener | флаг здоровья WebSocket-слушателя Mattermost — heartbeat-JSON; истёкший ключ читается как «не запущен» (производное состояние — терять безопасно) | cache | 90 с | Mattermost |
| dedup:job: | идемпотентность постановки job_id — один прогон |
durable | ~24ч (успешный прогон) | жизненный цикл |
| push: | pub/sub-канал — сигнал новой строки в ленте | cache | эфемерный (pub/sub) | Notifications |
Память кэша. maxmemory — через env:
dev 256mb · prod 512mb, потолок ≤ 70 % памяти контейнера.
Подбор по метрикам в работе (keyspace_hits/misses,
evicted_keys), не фиксированным числом — вмещаем горячее
рабочее множество, не все запросы. Тюнинг по метрикам — про
redis-cache; у redis-durable тот же
maxmemory служит жёстким потолком с отказом записи
(noeviction), а не вытеснением.