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

Ответ 18+ 🔞

Слушай, а вот есть у Редиса такая штука — Pub/Sub, паттерн «издатель-подписчик». Представь себе, блядь, как на базаре: один орет «Огурцы свежие!», а те, кто уши навострил, этот крик слышат. Вот и тут так же, ёпта. Один скрипт (издатель) орет в какой-то канал, а другие (подписчики), которые на этот канал подписаны, его слышат. И они друг о друге нихуя не знают! Полная анонимность, как в подъезде после трёх ночи.

Что тут важно, а?

  • Развязаны по полной (Decoupling): Издатель пиздит в пустоту, подписчик слушает пустоту. Они в одной системе, но друг про друга — ни хуя. Общаются только через канал.
  • Выстрелил и забыл (Fire-and-forget): Редис — не почта России, блядь. Отправил сообщение — и похуй. Если подписчик в этот момент был offline, вырублен или просто тупил — сообщение улетело в никуда, гарантий доставки — ноль ебать. Сообщения не хранятся.
  • Скорость, блядь: Всё происходит почти мгновенно. Идеально для какой-нибудь хуйни в реальном времени.

Где это применить-то?

Ну, типа:

  • Чтобы уведомления на сайте всплывали, не перезагружая страницу.
  • Для какого-нибудь простенького чата, где не жалко, если сообщение потеряется.
  • Чтобы дашборд какой-нибудь сам обновлялся, когда данные поменялись.
  • Рассылка событий внутри системы: «Эй, все, кеш по такому-то ключу — инвалидирован, идите нахуй!»

Смотри, как на Python (redis-py) это выглядит:

Подписчик (тот, кто слушает):

import redis

r = redis.Redis()

# Создаём объект pubsub и подписываемся на канал 'notifications'
p = r.pubsub()
p.subscribe('notifications')

print("Слушаю канал 'notifications'...")
for message in p.listen():
    # Пропускаем служебные сообщения о самой подписке
    if message['type'] == 'message':
        print(f"Получено: {message['data'].decode('utf-8')}")

Издатель (тот, кто орет) (запускай в другом окне терминала):

import redis
import time

r = redis.Redis()

print("Отправляю сообщение...")
r.publish('notifications', 'Новый пользователь зарегистрирован!')
time.sleep(1)
r.publish('notifications', 'Технические работы начнутся через 5 минут.')

НО, ВНИМАНИЕ, ПИЗДЕЦ ВАЖНО: Эта штука — не для серьёзных дел, где каждое сообщение должно дойти. Для заказов, платежей или логирования — это пиздец, а не решение. Тут сообщение может запросто потеряться, как носки в стиралке. Для таких дел нужны нормальные брокеры вроде RabbitMQ или Kafka, у них там очереди, подтверждения и прочая серьёзная хуйня. А Редисовский Pub/Sub — это для быстрых и не очень важных плюшек.