Ответ
Redis Pub/Sub (Publish/Subscribe) — это реализация паттерна "издатель-подписчик", позволяющая организовать обмен сообщениями в реальном времени. Издатели (publishers) отправляют сообщения в именованные каналы, не зная о подписчиках. Подписчики (subscribers) получают сообщения из каналов, на которые они подписаны.
Ключевые характеристики:
- Разделение компонентов (Decoupling): Издатели и подписчики не знают о существовании друг друга, они взаимодействуют только через каналы.
- "Fire-and-forget" модель: Redis не хранит сообщения. Если подписчик не в сети в момент отправки сообщения, он его не получит. Гарантии доставки нет.
- Высокая скорость: Сообщения доставляются практически мгновенно, что идеально для систем реального времени.
Типичные сценарии использования:
- Системы мгновенных уведомлений.
- Чаты и онлайн-игры.
- Обновление данных на дашбордах в реальном времени.
- Рассылка событий в распределенных системах (например, инвалидация кэша).
Пример на Python с redis-py
:
Подписчик (subscriber):
import redis
r = redis.Redis()
# Создаем объект pubsub и подписываемся на канал 'notifications'
p = r.pubsub()
p.subscribe('notifications')
print("Listening for messages on 'notifications'...")
for message in p.listen():
# Пропускаем системные сообщения о подписке
if message['type'] == 'message':
print(f"Received: {message['data'].decode('utf-8')}")
Издатель (publisher) (запускается в другом терминале):
import redis
import time
r = redis.Redis()
print("Publishing a message...")
r.publish('notifications', 'New user registered!')
time.sleep(1)
r.publish('notifications', 'System maintenance will start in 5 minutes.')
Важное ограничение: Redis Pub/Sub не подходит для задач, где важна гарантия доставки (например, обработка заказов). Для таких сценариев лучше использовать полноценные брокеры сообщений, такие как RabbitMQ или Kafka, которые реализуют очереди.