Что такое Redis Pub/Sub и для каких задач он используется

Ответ

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, которые реализуют очереди.