介绍

Redis订阅发布模型比较简单,结构如下:

redis pub sub断连问题 redis的pubsub_Redis

消息通道(channel)作为消息中转站,它不关心消息的发布者(publisher)是谁,也不关心订阅者(subscriber)有没有成功的消费掉消息。publisher负责发送消息,subscriber负责接收消息。

命令介绍

Redis订阅发布核心的两个命令就是: SUBSCRIBEPUBLISH

顾名思义,SUBSCRIBE 就是订阅消息,PUBLISH 就是发布消息。

Tips:订阅消息会阻塞连接,一旦开启订阅就不能执行其他的命令(订阅发布命令除外)。

订阅消息(SUBSCRIBE)

SUBSCRIBE channel [channel...]

channel 表示消息通道。消息通道可以是一个,也可以是多个,多个消息通道之间用空格隔开。一个消息通道同时可以被多个客户端订阅,消息通道对于客户端来说是共享的,非独享。

打开终端,连接到Redis服务器:

weis-MacBook-Pro:~ weihan$ redis-cli 
127.0.0.1:6379>

接着输入如下命令,订阅消息通道 chatroom

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

出现上面显示就表示已成功订阅消息通道 chatroom 的消息,数字1表示连接成功。此时可以看到当前连接处在阻塞状态,可以按 Ctrl + C 键退出订阅状态。

发布消息(PUBLISH)

PUBLISH channel message

channel 表示消息通道

message 表示待发布的消息内容

重新打开一个终端,连接到Redis服务器,并输入下面命令:

127.0.0.1:6379> publish chatroom "Hi"
(integer) 1

上面的命令表示向消息通道 chatroom 中发布一条 Hi 的文本消息。数字1表示成功收到消息的订阅者数量。

接着切换到刚刚订阅消息的终端,可以看到下面消息:

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

此时我们已经收到了刚刚发布的消息,消息内容为 Hi

怎么样,是不是很简单?

除了 SUBSCRIBEPUBLISH两个命令外,Redis还为我们提供了一些列的监控命令:

查询消息通道(PUBSUB CHANNELS)

PUBSUB CHANNELS [pattern]

pattern 表示匹配规则,此参数为选填,若不指定匹配规则,则默认查询所有激活状态的消息通道。

激活状态的消息通道:至少存在一个订阅者的消息通道才算是激活状态的消息通道

在发布消息的终端,输入如下命令:

127.0.0.1:6379> pubsub channels
1) "chatroom"

可以看到已经查询出我们刚刚创建的消息通道 chatroom

查询消息通道订阅者数量(PUBSUB NUMSUB)

PUBSUB NUMSUB [channel...]

channel:消息通道名称,

在发布消息的终端,输入如下命令:

127.0.0.1:6379> pubsub numsub chatroom
1) "chatroom"
2) (integer) 1

数字1表示消息通道 chatroom 的订阅者数量为1个