Введение
В этой лабораторной работе вы познакомитесь с системой обмена сообщениями Redis Pub/Sub (публикация-подписка). Вы узнаете, как подписываться на каналы, отправлять (публиковать) сообщения и отменять подписку. В ходе работы вы освоите базовые операции с помощью команд 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, потому что на предыдущем шаге в Терминале 1 у вас оформлена активная подписка на канал mychannel.
Просмотр сообщения в Терминале 1
Теперь переключитесь обратно в Терминал 1 (где вы подписались на mychannel на Шаге 1). Вы увидите только что опубликованное сообщение в режиме реального времени:
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!"
Важно: Оставьте оба терминала (Терминал 1 и Терминал 2) с активными сеансами
redis-cli. Мы продолжим использовать оба терминала на следующих этапах.
Отмена подписки с помощью команды UNSUBSCRIBE
На этом этапе вы узнаете, как отменить подписку на канал в Redis с помощью команды UNSUBSCRIBE. Отмена подписки удаляет клиента из списка подписчиков конкретного канала, предотвращая получение им дальнейших сообщений, публикуемых в этом канале.
Терминал 1: Выход из режима подписки
Перейдите в Терминал 1 (где вы в данный момент подписаны на mychannel). Вы должны видеть статус подписки «Reading messages... (press Ctrl-C to quit)».
Поскольку Терминал 1 находится в режиме подписки, вы не можете выполнять обычные команды Redis напрямую. Чтобы отписаться, сначала нужно выйти из режима подписки:
Нажмите
Ctrl+C, чтобы выйти из режима подписки.Вы увидите, что сеанс
redis-cliзавершился и вернулся к обычной командной строке терминала.Повторно подключитесь к Redis:
redis-cliТеперь вы можете выполнить команду
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.*": Шаблон, на который вы подписались. Символ.*является подстановочным знаком (wildcard), который соответствует любым символам.(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.


