Redis Pub/Sub 是一种强大的消息传递范例,可在应用程序的不同部分之间实现实时通信。它是构建可扩展和响应式系统的基石,允许组件在没有直接依赖的情况下进行交互。本章将全面介绍 Redis Pub/Sub,重点介绍核心命令:PUBLISH、``SUBSCRIBE
和 PSUBSCRIBE
。我们将探讨这些命令的工作原理、它们的用例以及如何有效地实现它们。
Pub/Sub 是 Publish/Subscription 的缩写,是一种消息传递模式,其中消息的发送者(发布者)不对消息进行编程,以直接发送给特定的接收者(订阅者)。相反,发布者将消息分类到通道中,订阅者表示对一个或多个通道感兴趣。当发布者向通道发送消息时,该通道的所有订户都会收到该消息。
Redis Pub/Sub 直接在 Redis 服务器中实现。客户端连接到 Redis 服务器,并将消息发布到频道或订阅频道以接收消息。Redis 服务器充当消息代理,将消息从发布者路由到订阅者。
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
,表示一个订阅者收到了该消息。
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 命令。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 端将取消订阅当前订阅的所有模式。
打开第三个 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"
这表示每个频道都有一个订阅者。
PSUBSCRIBE
使用 glob 样式模式。以下字符具有特殊含义:
*
:匹配零个或多个字符。?
:只匹配一个字符。[]
:匹配括号内的字符之一。PSUBSCRIBE
命令订阅多个模式。SUBSCRIBE
)和匹配同一通道的模式(使用 PSUBSCRIBE),
它将收到两次消息:一次用于直接订阅,一次用于模式 subscription。PUBLISH
和 SUBSCRIBE
命令。PUBLISH
和 PSUBSCRIBE
命令。PUBLISH、``SUBSCRIBE
和 PSUBSCRIBE
命令。