简介
在本实验中,你将探索 Redis 的发布/订阅消息系统,学习如何订阅频道、发布消息以及取消订阅。实验将带你使用 SUBSCRIBE、PUBLISH、UNSUBSCRIBE 和 PSUBSCRIBE 命令,完成发布/订阅功能的基本操作。
使用 SUBSCRIBE 订阅频道
在本步骤中,你将学习如何使用 Redis 的 SUBSCRIBE 命令订阅频道。订阅频道后,你可以接收发布到该频道的消息。这是 Redis 发布/订阅消息系统中的一个基本概念。
终端 1:订阅频道
打开第一个终端(以下简称 终端 1)。你可以使用 LabEx 环境中提供的 Xfce 终端。
使用 redis-cli 命令连接 Redis 服务器:
redis-cli
你应该会看到 Redis 提示符:127.0.0.1:6379>。
使用 SUBSCRIBE 命令订阅名为 mychannel 的频道:
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 命令向频道发布消息。发布消息是发布/订阅系统的核心功能,可以将数据发送给特定频道的所有订阅者。
终端 2:发布消息
打开第二个终端(以下简称 终端 2)。你可以在 Xfce 终端中打开一个新标签页。
使用 redis-cli 命令连接 Redis 服务器:
redis-cli
你应该会看到 Redis 提示符:127.0.0.1:6379>。
现在,使用 PUBLISH 命令向 mychannel 频道发布一条消息:
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!"
重要提示:请保持 终端 1 和 终端 2 中的 redis-cli 会话处于活动状态。接下来的步骤仍会使用这两个终端。
使用 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:表示你当前订阅的频道数量。由于你已取消订阅mychannel,因此数量变为 0。
终端 2:测试取消订阅后的发布效果
现在切换到终端 2,再次向 mychannel 发布消息:
PUBLISH mychannel "Is anyone still there?"
终端 2 中的输出为:
(integer) 0
这表示没有客户端收到该消息,因为你已在终端 1中取消了对该频道的订阅。
确认未收到消息
查看终端 1,你应该会发现没有出现新消息,因为你已经取消了该频道的订阅。
这说明,取消频道订阅后,你将不再接收发布到该频道的消息;不过,发布者仍然可以发送消息,只是不会有任何订阅者收到。
重要提示:请保持两个终端及其中的 redis-cli 会话处于活动状态,以便完成下一步骤。
使用 PSUBSCRIBE 按模式订阅
在本步骤中,你将学习如何使用 Redis 的 PSUBSCRIBE 命令,通过模式订阅频道。PSUBSCRIBE 可以让你一次订阅多个符合指定模式的频道。当你希望接收一组相关频道的消息,而不想逐个订阅时,这项功能非常实用。
终端 1:按模式订阅
由于你在上一步中取消了对 mychannel 的订阅,终端 1 此时应该显示普通的 Redis 提示符。
在终端 1中,使用 PSUBSCRIBE 命令订阅符合 news.* 模式的频道:
PSUBSCRIBE news.*
输出结果应类似于:
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
下面说明各项输出的含义:
"psubscribe":表示你已成功订阅一个模式。"news.*":表示你订阅的模式。其中,.*是可以匹配任意字符的通配符。(integer) 1:表示你当前订阅的模式数量。
终端 2:向符合模式的频道发布消息
前往终端 2,使用 PUBLISH 命令向 news.sports 频道发布消息:
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 发布/订阅消息的基本功能。你学习了如何使用 SUBSCRIBE 命令订阅频道、使用 PUBLISH 命令向频道发布消息、使用 UNSUBSCRIBE 命令取消频道订阅,以及使用 PSUBSCRIBE 命令按模式订阅频道。这些命令是使用 Redis 构建实时消息应用的基础。


