redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)
Redis Pub/Sub 简介:PUBLISH、SUBSCRIBE、PSUBSCRIBE
Redis Pub/Sub 是一种强大的消息传递范例,可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石,允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis Pub/Sub,重点介绍核心命令:PUBLISH、``SUBSCRIBE
和 PSUBSCRIBE
。我们将探讨这些命令的工作原理、它们的用例以及如何有效地实现它们。
了解 Pub/Sub 范例
Pub/Sub 是 Publish/Subscription 的缩写,是一种消息传递模式,其中消息的发送者(发布者)不对消息进行编程,以直接发送给特定的接收者(订阅者)。相反,发布者将消息分类到通道中,订阅者表示对一个或多个通道感兴趣。当发布者向通道发送消息时,该通道的所有订户都会收到该消息。
关键概念
- Publisher: 将消息发送到特定通道的实体。
- Subscriber: 从一个或多个通道接收消息的实体。
- Channel: 一个命名的虚拟 “主题” 或 “源” ,用于发布消息。订阅者收听这些频道。
- Message: 从发布服务器传输到订阅服务器的数据。
Redis Pub/Sub 的工作原理
Redis Pub/Sub 直接在 Redis 服务器中实现。客户端连接到 Redis 服务器,并将消息发布到频道或订阅频道以接收消息。Redis 服务器充当消息代理,将消息从发布者路由到订阅者。
- 异步通信: Pub/Sub 本质上是异步的。发布者不会等待订阅者接收消息,订阅者会在消息发布时接收消息。
- 解耦: Pub/Sub 将发布者和订阅者分离。发布者不需要了解订阅者的任何信息,订阅者也不需要了解发布者的任何信息。这使得构建可扩展且可维护的系统变得更加容易。
- 一对多通信: 发布到频道的单条消息可以被多个订阅者接收。
PUBLISH
命令
PUBLISH
命令用于向特定通道发送消息。
语法
PUBLISH channel message
channel
:消息将发布到的通道的名称。message
:需要发送的消息内容。
例
PUBLISH mychannel "Hello, subscribers!"
此命令将消息 “Hello, subscribers!” 发布到名为 “mychannel” 的频道。该命令返回一个整数,表示收到消息的订阅者数量。
实际演示
-
打开两个
redis-cli
终端。 -
在第一个终端中,订阅频道 “mychannel”:
SUBSCRIBE mychannel
终端现在将进入侦听状态,等待 “mychannel” 上的消息。
-
在第二个终端中,向 “mychannel” 发布一条消息:
PUBLISH mychannel "This is a test message"
第一个终端将收到以下消息:
1. "message" 2. "mychannel" 3. "This is a test message"
第二个终端中的
PUBLISH
命令将返回1
,表示一个订阅者收到了该消息。
重要注意事项
- 消息传递: Redis Pub/Sub 提供至少一次交付。保证将消息传送到在发布消息时连接的所有订阅者。但是,如果订阅者断开连接并重新连接,则可能会错过在断开连接时发布的消息。Redis Pub/Sub 不会持久保存消息。
- 消息格式: 消息可以是任何字符串。Redis 不强制执行任何特定格式。但是,对于复杂数据,通常使用 JSON 等结构化格式。
SUBSCRIBE
命令
SUBSCRIBE
命令用于订阅一个或多个通道。当客户端订阅频道时,它将接收发布到该频道的所有消息。
语法
SUBSCRIBE channel [channel ...]
channel
:要订阅的频道的名称。您可以通过在SUBSCRIBE
命令后列出多个频道来订阅这些频道。
例
SUBSCRIBE news updates
此命令为客户端订阅两个频道:“news”和“updates”。
实际演示
-
打开
3 个 redis-cli
终端。 -
在第一个终端中,订阅 “news” 频道:
SUBSCRIBE news
-
在第二个终端中,订阅 “news” 和 “updates” 频道:
SUBSCRIBE news updates
-
在第三个终端中,向 “news” 频道发布一条消息:
PUBLISH news "Breaking news!"
第一个和第二个终端将接收该消息。
-
在第三个终端中,向 “updates” 频道发布一条消息:
PUBLISH updates "Software update available"
只有第二个终端会收到此消息。
取消订阅
要取消订阅频道,请使用 UNSUBSCRIBE
命令:
UNSUBSCRIBE channel [channel ...]
如果未指定频道,则客户端将取消订阅当前订阅的所有频道。
重要注意事项
- 阻塞作:
SUBSCRIBE
命令是一个阻塞作。一旦客户端订阅了一个或多个频道,它将进入侦听状态,并且在取消订阅之前无法执行其他 Redis 命令。 - 专用连接: 通常的做法是将专用的 Redis 连接用于 Pub/Sub 作。这可以防止阻止应用程序中需要执行常规 Redis 命令的其他部分。
PSUBSCRIBE
命令
PSUBSCRIBE
命令用于订阅使用模式的通道。这允许您订阅与特定模式匹配的多个频道。
语法
PSUBSCRIBE pattern [pattern ...]
pattern
:一种 glob 样式模式,指定要订阅的频道。
例
PSUBSCRIBE order.*
此命令为客户端订阅所有以 “order.” 开头的频道,例如 “order.created”、“order.updated” 和 “order.deleted”。
实际演示
-
打开两个
redis-cli
终端。 -
在第一个终端中,订阅 “order.*” 模式:
PSUBSCRIBE order.*
-
在第二个终端中,将消息发布到不同的 “order” 频道:
PUBLISH order.created "New order created" PUBLISH order.updated "Order updated" PUBLISH order.deleted "Order deleted"
第一个终端将接收所有 3 条消息。
-
在第二个终端中,将消息发布到与模式不匹配的通道:
PUBLISH product.created "New product created"
第一个终端_将不会_收到此消息。
取消订阅模式
要取消订阅模式,请使用 PUNSUBSCRIBE
命令:
PUNSUBSCRIBE pattern [pattern ...]
如果未指定模式,则 Client 端将取消订阅当前订阅的所有模式。
检查 Pub/Sub 状态
打开第三个 redis-cli
终端。
检查员(3 号航站楼):
PUBSUB CHANNELS
此命令将列出活动通道。如果终端 1 中的订阅者订阅了 news:*
和 chat:room1
,并且没有其他客户端正在使用 Pub/Sub,则输出可能是:
1) "news:sports"
2) "news:politics"
3) "chat:room1"
请注意,列出的通道是消息已发布到的通道,以及有活动订阅者的通道。
PUBSUB NUMPAT
此命令将返回活动模式订阅的数量。在这种情况下,它将返回 1
,因为终端 1 中的订阅者订阅了 news:*
模式。
PUBSUB NUMSUB chat:room1 news:sports
此命令将返回 chat:room1
和 news:sports
频道的订阅者数量。输出可能是:
1) "chat:room1"
2) "1"
3) "news:sports"
4) "1"
这表示每个频道都有一个订阅者。
重要注意事项
- 模式匹配: Redis 对
PSUBSCRIBE
使用 glob 样式模式。以下字符具有特殊含义:*
:匹配零个或多个字符。?
:只匹配一个字符。[]
:匹配括号内的字符之一。
- 多种模式: 您可以使用单个
PSUBSCRIBE
命令订阅多个模式。 - 操作顺序: 如果客户端同时订阅了直接通道(使用
SUBSCRIBE
)和匹配同一通道的模式(使用PSUBSCRIBE),
它将收到两次消息:一次用于直接订阅,一次用于模式 subscription。
实践练习
- 简单的聊天应用程序: 构建一个简单的聊天应用程序,用户可以在其中向特定频道发送消息,订阅该频道的所有用户都将收到这些消息。使用
PUBLISH
和SUBSCRIBE
命令。 - 实时更新: 模拟股票行情的实时更新。将股票价格发布到不同的渠道(例如,“stock.AAPL“, ”股票。GOOG“),并让客户端订阅他们感兴趣的频道。使用
PUBLISH
和PSUBSCRIBE
命令。 - 事件通知系统: 设计一个事件通知系统,其中应用程序的不同部分可以将事件发布到特定通道(例如,“user.created”、“order.placed”),并且应用程序的其他部分可以订阅这些通道以接收通知。使用
PUBLISH、``SUBSCRIBE
和PSUBSCRIBE
命令。