Redis Pub/Sub 消息传递

RedisBeginner
立即练习

介绍

在本实验中,你将探索 Redis 的发布/订阅 (Pub/Sub) 消息系统。你将学习如何订阅频道、发布消息以及取消订阅。本实验将引导你通过 SUBSCRIBEPUBLISHUNSUBSCRIBEPSUBSCRIBE 命令完成基本操作。

使用 SUBSCRIBE 订阅频道

在本步骤中,你将学习如何使用 SUBSCRIBE 命令在 Redis 中订阅一个频道。订阅频道允许你接收发布到该频道的消息。这是 Redis 发布/订阅 (Pub/Sub) 消息系统中的一个基本概念。

终端 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 发布消息

在本步骤中,你将学习如何使用 PUBLISH 命令在 Redis 中向频道发布消息。发布消息是发布/订阅 (Pub/Sub) 系统的核心功能,它允许你将数据发送给特定频道的所有订阅者。

终端 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!":实际的消息内容

测试实时消息

你现在可以尝试实时消息传递:

  1. 返回 终端 2 并发布更多消息
  2. 切换到 终端 1 查看它们是否立即出现
  3. 尝试发布不同的消息来观察实时通信

示例 - 在 终端 2 中:

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

重要提示:保持 终端 1终端 2 的 redis-cli 会话都处于活动状态。在接下来的步骤中,我们将继续使用这两个终端。

使用 UNSUBSCRIBE 取消订阅

在本步骤中,你将学习如何使用 UNSUBSCRIBE 命令在 Redis 中取消订阅一个频道。取消订阅会将一个客户端从特定频道的订阅者列表中移除,阻止其接收发布到该频道的新消息。

终端 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 进行模式订阅

在本步骤中,你将学习如何使用 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 Pub/Sub 消息传递的基础知识。你学习了如何使用 SUBSCRIBE 命令订阅频道,使用 PUBLISH 命令向频道发布消息,使用 UNSUBSCRIBE 命令取消订阅频道,以及使用 PSUBSCRIBE 命令通过模式订阅频道。这些命令对于使用 Redis 构建实时消息应用程序至关重要。