Keyspace уведомления

Тема дорожной карты · Redis

Уведомления о пространстве ключей Redis позволяют клиентам подписываться на Pub/Sub-каналы, получающие события при выполнении определённых операций Redis над ключами, что обеспечивает реактивные паттерны без опроса. Уведомления включаются в redis.conf параметром notify-keyspace-events с комбинацией флагов: K для событий пространства ключей, E для событий keyevent, x для событий истечения ключей, g для общих команд и l для команд списков. Клиент, подписанный на __keyevent@0__:expired, получает сообщение при каждом истечении ключа в базе данных 0, что делает уведомления о пространстве ключей полезными для обратных вызовов инвалидации кэша и триггеров на основе TTL. Поскольку генерация уведомлений добавляет накладные расходы к каждой операции записи, уведомления о пространстве ключей по умолчанию отключены (notify-keyspace-events ""). Уведомления о пространстве ключей дополняют Redis Streams как лёгкий механизм поиска событий для простых рабочих процессов на основе триггеров.

Как это работает

Keyspace уведомления реализует простой pub/sub: SUBSCRIBE channel слушает; PUBLISH channel message шлёт. Подписчики получают сообщения в порядке прибытия; если subscriber медленный, сообщение сбрасывается (fire-and-forget). Паттерны: PSUBSCRIBE channel.* — wildcard. Для durable, replayable потоков с consumer groups + acks — Redis Streams (XADD/XREAD/XREADGROUP); они вытеснили pub/sub в большинстве production-кейсов.

Когда применять

Pub/sub — для fan-out уведомлений, где потеря допустима (live dashboard updates, "пользователь X печатает"). Redis Streams — когда важны гарантии доставки, порядок между consumer или replay (это большинство production-сценариев). Для cross-region или cross-cloud сообщений — Kafka или NATS; Redis это single-cluster.

Типичные ошибки

Ловушки Keyspace уведомления: event sourcing на pub/sub (он забывает — Streams); SUBSCRIBE на соединении, которое также делает обычные команды (нельзя — соединение в subscribe-mode); не обрабатывают reconnect (упавший TCP пропускает все сообщения за gap); высокий publish rate, который consumer не догоняет (нет backpressure — тихая потеря).

Связанные понятия

Полезные ресурсы