Redis中的消息发布订阅
目录 ▼
什么是发布订阅模式
首先我们需要了解什么是发布订阅模式(Publish–Subscribe Pattern)。
Wiki百科如是说道:
在软件架构中,发布-订阅是一种消息传递模式,其中消息的发送者(称为发布者)不会将消息编程为直接发送给特定的接收者(称为订阅者),而是将已发布的消息分类到不知道哪些订阅者的情况下。 类似地,订阅者表示对一个或多个频道感兴趣并且只接收感兴趣的消息,而不知道有哪些发布者。
Redis中的发布订阅
在Redis中,以下命令
-
PSUBSCRIBE
-
PUBLISH
-
PUBSUB
-
PUNSUBSCRIBE
-
SUBSCRIBE
-
UNSUBSCRIBE
实现了发布订阅模式
例如,对于SUBSCRIBE命令,可以通过运行如下命令来订阅频道,后面可以接一个或者多个频道名
SUBSCRIBE channel1 channel2
取消订阅命令,与订阅命令一致,也可以接一个或者多个频道名
UNSUBSCRIBE channel1 channel2
当有客户端发送消息到这些频道时,Redis将会推送传入的消息给所有订阅这些频道的客户端。
正在订阅频道的客户端不应该发送除了订阅或取消订阅以外的命令。订阅和退订操作的执行结果以消息的形式返回,客户端可以读取收到消息的第一个元素来区分收到的是消息类型,还是订阅和退订操作执行结果。
进入订阅模式后,订阅客户端只能执行以下命令:
SUBSCRIBE, PSUBSCRIBE, UNSUBSCRIBE, PUNSUBSCRIBE, PING, RESET, QUIT
📌 注意:在>=6.2 版本才能使用 RESET 命令
下图为实例的实际效果

推送消息的格式说明
消息是一个带有三个元素的Array Reply
第一个元素只能是下面三种之一:
-
subscribe: 表示成功订阅到以第二个返回元素命名的频道。第三个元素表示客户端当前订阅频道总数。
-
unsubscribe: 表示成功退订以第二个返回元素命名的频道。第三个元素表示客户端当前订阅频道总数。当第三个参数为零的时候,表示客户端已退出Pub/Sub状态,不再订阅任何频道,可以发送订阅和退订以外的Redis 命令。
-
message: 表示收到其它某一个客户端用 PUBLISH 发布的消息,第二个元素是来源频道的名字,第三个参数是消息实际内容。
实际效果
客户端1——发布者

客户端2——订阅者

可以看到,发布者在channel1 与 channel 2频道各发送了两条信息,订阅者因为订阅两个频道,接收到四条信息。四个Array Reply。
带有模式匹配的订阅
可以看到,只是在SUBSCRIBE以及UNSUBSCRIBE前面增加了一个P,这里的P就是Pattern的意思,使用方法同SUBSCRIBE以及UNSUBSCRIBE,只是传参为Pattern模式
-
PSUBSCRIBE
-
PUNSUBSCRIBE
实现Redis中的发布订阅模式
订阅者
from redis_ins.client import Client
channel = "eachen_radio"
client = Client()
while True:
spub = client.instance.pubsub()
spub.subscribe(channel)
for items in spub.listen():
print(items)
发布者
from redis_ins.client import Client
channel = "eachen_radio"
client = Client()
while True:
my_input = input('请输入发布内容:')
client.instance.publish(channel, my_input)
同时运行两个客户端代码
在【发布者】的命令行中输入消息

在【订阅者】的命令行中可以看到收到了消息

发布者在频道eachen_radio上发布消息,订阅者在同一个频道上接受消息