Redis 发布订阅

发布订阅(pub/sub)是一种消息范式,消息的发送者(称为发布者 publish)不会将消息直接发送给特定的接收者(称为订阅者 subscribe)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者(如果有的话)存在。

Redis 也提供了发布订阅功能,可以用于消息的传输。Redis 的发布订阅机制包括三个部分,如下:

(1)发布者:发布一个消息到 Channel 中;

(2)订阅者:订阅一个或多个 Channel,并从 Channel 中接收消息;

(3)Channel: 频道,可以理解为一个主题,将同类型的消息发往同一个主题,有兴趣的用户可以订阅它;

其中,发布者和订阅者都是 Redis 客户端,Channel 则为Redis服务器端,发布者将消息发送到某个的频道(Channel),订阅了这个频道的订阅者就能接收到这条消息。Redis 的这种发布订阅机制与基于主题的发布订阅类似,Channel 相当于主题。

注意:一个 Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅 channel1 频道的三个客户端(client2 、 client5 和 client1)之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

实例

以下实例演示了发布订阅是如何工作的,如下:

(1)使用 redis-cli 连接到 Redis,然后使用 subscribe 命令创建和订阅频道 redisChat,如下:

127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

(2)现在我们重新打开一个 redis-cli 连接到 Redis,然后使用 publish 命令在 redisChat 频道中发布消息 “Hi! Redis.”,如下:

127.0.0.1:6379> publish redisChat "Hi! Redis."
(integer) 1

此时,订阅者能接收到如下消息:

127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
1) "message"
2) "redisChat"
3) "Hi! Redis."

Redis 发布订阅命令

下表列出了 Redis 发布订阅常用命令:

SUBSCRIBE命令

订阅给定的一个或多个频道的信息。语法如下:

SUBSCRIBE channel [channel ...]

实例:

127.0.0.1:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

UNSUBSCRIBE命令

指退订给定的频道。语法如下:

UNSUBSCRIBE [channel [channel ...]]

实例:

127.0.0.1:6379> unsubscribe redisChat
1) "unsubscribe"
2) "redisChat"
3) (integer) 0

PUBLISH命令

将信息发送到指定的频道。语法如下:

PUBLISH channel message

实例:

127.0.0.1:6379> publish redisChat "Hi! Redis."
(integer) 1

PUBSUB命令

查看订阅与发布系统状态。语法如下:

PUBSUB subcommand [argument [argument ...]]

其中,subcommand 命令可选值为 channels、numpat、numsub,如下:

  • PUBSUB CHANNELS [pattern] 列出当前活动的频道。一个活跃的频道是有一个或多个订阅者的Pub/Sub频道(不包括订阅模式的客户端)。

  • PUBSUB NUMPAT 返回客户端订阅的唯一模式数(使用 PSUBSCRIBE 命令执行)。注意,这不是订阅模式的客户端计数,而是所有客户端订阅的唯一模式的总数。

  • PUBSUB NUMSUB [channel [channel ...]] 返回指定频道的订阅者数量(不包括订阅模式的客户)。注意,在没有频道的情况下,调用这个命令也是有效的。在这种情况下,它只会返回一个空列表。

实例:

127.0.0.1:6379> pubsub channels
1) "redisChat"
127.0.0.1:6379> pubsub numpat
(integer) 1
127.0.0.1:6379> pubsub numsub redisChat
1) "redisChat"
2) (integer) 1

PSUBSCRIBE命令

订阅一个或多个符合给定模式的频道。语法如下:

PSUBSCRIBE pattern [pattern ...]

实例:

127.0.0.1:6379> psubscribe work-*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "work-*"
3) (integer) 1

PUNSUBSCRIBE命令

退订所有给定模式的频道。语法如下:

PUNSUBSCRIBE [pattern [pattern ...]]

实例:

127.0.0.1:6379> punsubscribe redis*
1) "punsubscribe"
2) "redis*"
3) (integer) 0

更多命令请访问 https://redis.io/commands  进行参考。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号