Введение
В этой лабораторной работе вы изучите систему обмена сообщениями 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.


