Обмен сообщениями Redis Pub/Sub

RedisBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы изучите систему обмена сообщениями Redis Pub/Sub. Вы узнаете, как подписываться на каналы, публиковать сообщения и отменять подписку. В ходе работы вы освоите основные операции с помощью команд SUBSCRIBE, PUBLISH, UNSUBSCRIBE и PSUBSCRIBE.

Подписка на канал с помощью SUBSCRIBE

На этом шаге вы узнаете, как подписаться на канал в Redis с помощью команды SUBSCRIBE. Подписка на канал позволяет получать сообщения, опубликованные в этом канале. Это один из ключевых принципов системы обмена сообщениями Redis Pub/Sub.

Терминал 1: подписка на канал

Откройте первый терминал — далее мы будем называть его Терминалом 1. В среде LabEx можно использовать предоставляемый терминал Xfce.

Подключитесь к серверу Redis с помощью команды redis-cli:

redis-cli

Вы должны увидеть приглашение Redis: 127.0.0.1:6379>.

Подпишитесь на канал с именем mychannel с помощью команды SUBSCRIBE:

SUBSCRIBE mychannel

Вывод будет выглядеть примерно так:

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1

Разберём этот вывод:

  • "subscribe": означает, что подписка на канал успешно оформлена.
  • "mychannel": имя канала, на который вы подписались.
  • (integer) 1: количество каналов, на которые вы подписаны в данный момент.

Важно: не закрывайте Терминал 1 и оставьте активной сессию redis-cli с подпиской на канал. Не закрывайте этот терминал и не нажимайте Ctrl+C, поскольку это отменит подписку. На следующем шаге для публикации сообщений мы воспользуемся вторым терминалом.

Публикация сообщений с помощью PUBLISH

На этом шаге вы узнаете, как публиковать сообщения в канал Redis с помощью команды PUBLISH. Публикация сообщений — основная функция системы Pub/Sub, позволяющая отправлять данные всем подписчикам определённого канала.

Терминал 2: публикация сообщений

Откройте второй терминал — далее мы будем называть его Терминалом 2. В терминале Xfce можно открыть новую вкладку.

Подключитесь к серверу Redis с помощью команды redis-cli:

redis-cli

Вы должны увидеть приглашение Redis: 127.0.0.1:6379>.

Теперь опубликуйте сообщение в канале mychannel с помощью команды PUBLISH:

PUBLISH mychannel "Hello, Redis!"

В Терминале 2 появится количество клиентов, получивших сообщение:

(integer) 1

В данном случае вывод содержит (integer) 1, поскольку на Терминале 1 с предыдущего шага есть активная подписка на mychannel.

Просмотр сообщения в Терминале 1

Переключитесь обратно на Терминал 1, где на шаге 1 вы подписались на mychannel. Вы должны увидеть только что опубликованное сообщение в режиме реального времени:

1) "message"
2) "mychannel"
3) "Hello, Redis!"

Это означает следующее:

  • "message": сообщение было опубликовано.
  • "mychannel": канал, в который было опубликовано сообщение.
  • "Hello, Redis!": фактическое содержимое сообщения.

Проверка обмена сообщениями в реальном времени

Теперь можно поэкспериментировать с обменом сообщениями в реальном времени. Вернитесь в Терминал 2, опубликуйте ещё несколько сообщений, а затем переключитесь на Терминал 1, чтобы сразу увидеть их. Попробуйте отправить разные сообщения и понаблюдайте за обменом данными в реальном времени.

Пример для Терминала 2:

PUBLISH mychannel "This is message 2"
PUBLISH mychannel "Real-time messaging works!"

Важно: оставьте активными сессии redis-cli в Терминале 1 и Терминале 2. На следующих шагах мы продолжим использовать оба терминала.

Отмена подписки с помощью UNSUBSCRIBE

На этом шаге вы узнаете, как отменить подписку на канал Redis с помощью команды UNSUBSCRIBE. Отмена подписки удаляет клиента из списка подписчиков определённого канала и не позволяет ему получать дальнейшие сообщения, опубликованные в этом канале.

Терминал 1: выход из режима подписки

Перейдите в Терминал 1, где сейчас оформлена подписка на mychannel. Вы должны видеть сообщение о состоянии подписки: "Reading messages... (press Ctrl-C to quit)".

Поскольку Терминал 1 находится в режиме подписки, выполнять обычные команды Redis напрямую нельзя. Нажмите Ctrl+C, чтобы выйти из режима подписки и вернуться к приглашению терминала. Затем снова подключитесь к Redis:

redis-cli

Теперь выполните команду UNSUBSCRIBE. Хотя отключение уже удалило подписку, эта команда демонстрирует ответ Redis при отмене подписки:

UNSUBSCRIBE mychannel

Примечание: после нажатия Ctrl+C вы фактически уже отключились от всех подписок. Команда UNSUBSCRIBE приведена для демонстрации, но на практике отключение автоматически отменяет подписку на все каналы.

В Терминале 1 появится примерно такой вывод:

1) "unsubscribe"
2) "mychannel"
3) (integer) 0

Разберём этот вывод:

  • "unsubscribe": означает, что подписка на канал отменена.
  • "mychannel": имя канала, подписка на который была отменена.
  • (integer) 0: количество каналов, на которые вы подписаны в данный момент. Теперь оно равно 0, поскольку подписка на mychannel отменена.

Терминал 2: проверка публикации после отмены подписки

Переключитесь на Терминал 2 и опубликуйте ещё одно сообщение в mychannel:

PUBLISH mychannel "Is anyone still there?"

В Терминале 2 появится:

(integer) 0

Это означает, что сообщение не получил ни один клиент, поскольку на Терминале 1 подписка на канал была отменена.

Проверка отсутствия сообщения

Посмотрите на Терминал 1 — новых сообщений появиться не должно, поскольку подписка на канал отменена.

Так вы убедитесь, что отмена подписки на канал прекращает получение дальнейших сообщений, опубликованных в этом канале. При этом издатель по-прежнему может отправлять сообщения, но получателей у них не будет.

Важно: оставьте оба терминала и их сессии redis-cli активными для следующего шага.

Подписка по шаблону с помощью PSUBSCRIBE

На этом шаге вы узнаете, как подписываться на каналы по шаблону с помощью команды PSUBSCRIBE в Redis. Команда PSUBSCRIBE позволяет подписаться сразу на несколько каналов, соответствующих заданному шаблону. Это удобно, когда нужно получать сообщения из группы связанных каналов, не оформляя подписку на каждый из них отдельно.

Терминал 1: подписка по шаблону

Поскольку на предыдущем шаге вы отменили подписку на mychannel, в Терминале 1 теперь должно отображаться обычное приглашение Redis.

В Терминале 1 подпишитесь на каналы, соответствующие шаблону news.*, с помощью команды PSUBSCRIBE:

PSUBSCRIBE news.*

Вывод будет выглядеть примерно так:

Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1

Разберём этот вывод:

  • "psubscribe": означает, что подписка на шаблон успешно оформлена.
  • "news.*": шаблон, на который вы подписались. Символы .* выступают подстановочным знаком и соответствуют любым символам.
  • (integer) 1: количество шаблонов, на которые вы подписаны в данный момент.

Терминал 2: публикация в каналы, соответствующие шаблону

Перейдите в Терминал 2 и опубликуйте сообщение в канале news.sports с помощью команды PUBLISH:

PUBLISH news.sports "Sports news update!"

В Терминале 2 появится количество подписчиков, получивших сообщение:

(integer) 1

Проверка соответствия шаблону

Переключитесь обратно на Терминал 1, где вы подписались на шаблон. Вы должны увидеть только что опубликованное сообщение:

1) "pmessage"
2) "news.*"
3) "news.sports"
4) "Sports news update!"

Это означает следующее:

  • "pmessage": сообщение соответствует подписанному шаблону.
  • "news.*": шаблон, которому соответствует сообщение.
  • "news.sports": фактический канал, в который было опубликовано сообщение.
  • "Sports news update!": содержимое сообщения.

Проверка нескольких каналов

В Терминале 2 попробуйте опубликовать сообщения в разных каналах, соответствующих шаблону:

PUBLISH news.technology "New AI breakthrough!"
PUBLISH news.weather "Sunny skies ahead!"
PUBLISH sports.basketball "This won't match the pattern"

В Терминале 1 убедитесь, что отображаются сообщения только из каналов news.*. Сообщение из sports.basketball не будет получено, поскольку этот канал не соответствует шаблону news.*.

Важно: оставьте оба терминала и их сессии redis-cli активными. Подписка по шаблону показывает, как можно одновременно отслеживать несколько связанных каналов.

Итоги

В этой лабораторной работе вы изучили основы обмена сообщениями Redis Pub/Sub. Вы узнали, как подписываться на каналы с помощью команды SUBSCRIBE, публиковать сообщения в каналы с помощью PUBLISH, отменять подписку с помощью UNSUBSCRIBE, а также подписываться на каналы по шаблонам с помощью PSUBSCRIBE. Эти команды необходимы для создания приложений обмена сообщениями в реальном времени на базе Redis.