Redis 发布/订阅消息

RedisBeginner
立即练习

简介

在本实验中,你将探索 Redis 的发布/订阅消息系统,学习如何订阅频道、发布消息以及取消订阅。实验将带你使用 SUBSCRIBEPUBLISHUNSUBSCRIBEPSUBSCRIBE 命令,完成发布/订阅功能的基本操作。

使用 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 构建实时消息应用的基础。