Гайды
Redis Pub/Sub и очереди через Lists
SUBSCRIBE и ограничения, BRPOP и BRPOPLPUSH, сравнение с Streams, когда смотреть на внешний брокер.
~10 мин чтения
Redis Pub/Sub и очереди через Lists
Два разных паттерна: Pub/Sub — сообщения «здесь и сейчас» подписчикам; Lists — структура для простых очередей с блокирующим чтением. Базовые типы и кеш — в «Основы Redis: кеш и структуры данных». Для очередей с группами и ack чаще смотрят на Redis Streams (отдельная тема; ниже — краткое сравнение). Для распределённого журнала уровня Kafka — введение в Kafka.
1. Pub/Sub: fire and forget
PUBLISH в канал; подписчики SUBSCRIBE получают копию только если подключены в момент публикации.
SUBSCRIBE news.alerts
# в другом клиенте:
PUBLISH news.alerts "service degraded in eu-west"
Ограничения
- Нет персистентности — отвалился подписчик, сообщения потеряны.
- По сути at-most-once для доставки до приложения.
- В режиме
SUBSCRIBEто же соединение не выполняет обычные команды — нужен второй клиент или пул.
Когда уместно
Инвалидация кеша по каналу, сигналы «перечитай конфиг», уведомления, где потеря единичного сообщения допустима.
2. PSUBSCRIBE
PSUBSCRIBE news.*
Следите за числом паттернов и нагрузкой на CPU.
3. Очередь на Lists: producer / consumer
LPUSH q:email:pending "{\"id\":1,\"to\":\"a@b.c\"}"
BRPOP q:email:pending 30
BRPOP — блокировка до таймаута; удобно для цикла worker без busy-wait.
Несколько consumer'ов на одном ключе — Redis раздаёт задачи; идемпотентность обработки на приложении всё равно нужна.
4. Надёжность: RPOPLPUSH / BRPOPLPUSH
Атомарный перенос в список «в обработке»:
BRPOPLPUSH q:email:pending q:email:processing 30
LREM q:email:processing 1 "{\"id\":1,...}"
При старте worker — восстановление из processing по таймауту (visibility timeout вручную).
5. Ограничения List-очередей
| Аспект | Lists |
|---|---|
| Персистентность | Зависит от RDB/AOF Redis |
| Повторная доставка | Проектировать явно |
| Consumer groups | Нет как в Streams |
| Приоритеты | Несколько списков или ZSET по score |
6. Redis Streams (ориентир)
Streams (XADD, XREADGROUP, XACK): лог с ID, consumer groups, ack, MAXLEN. Для очередей с подтверждением Streams обычно удобнее «голого» List.
Минимальный producer / consumer group:
XADD orders * order_id 1001 status created
XGROUP CREATE orders cg1 $ MKSTREAM
XREADGROUP GROUP cg1 consumer1 COUNT 10 BLOCK 5000 STREAMS orders >
XACK orders cg1 <id-из-ответа-XREADGROUP>
BLOCK даёт почти тот же UX, что BRPOP, но с pending entries list (PEL) для незавершённых сообщений. Периодически вызывайте XAUTOCLAIM или обходите PEL по таймауту visibility.
7. Сравнение сценариев
| Задача | Инструмент в Redis |
|---|---|
| Broadcast без гарантии | Pub/Sub |
| Простая очередь | List + BRPOP / BRPOPLPUSH |
| Очередь с группами и ack | Streams |
| События с долгой ретенцией и множество сервисов | Часто внешний брокер — см. Kafka: основы |
8. Операционные советы
- Префиксы ключей по окружению (
q:prod:…). LLENи latencyBRPOP.- Большие payload — в объектное хранилище, в очереди ссылка.
- Pub/Sub при высокой частоте — сеть и число подписчиков.