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

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

Введение

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

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

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

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

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

Подключитесь к серверу 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, потому что у вас есть активная подписка на mychannel в Терминале 1 из предыдущего шага.

Наблюдение за сообщением в Терминале 1

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

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

Это показывает:

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

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

Теперь вы можете поэкспериментировать с обменом сообщениями в реальном времени:

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

Пример — в Терминале 2:

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

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

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

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

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

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

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

  1. Нажмите Ctrl+C, чтобы выйти из режима подписки.

  2. Вы должны увидеть, что сессия redis-cli завершилась и вернулась к приглашению терминала.

  3. Переподключитесь к Redis:

    redis-cli
  4. Теперь вы можете выполнить команду UNSUBSCRIBE (хотя это и не обязательно, поскольку отключение уже отписало вас):

    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.