type
status
date
slug
summary
tags
category
icon
password
什么是发布订阅模式
首先我们需要了解什么是发布订阅模式(Publish–Subscribe Pattern)。
Wiki百科如是说道:
在软件架构中,发布-订阅是一种消息传递模式,其中消息的发送者(称为发布者)不会将消息编程为直接发送给特定的接收者(称为订阅者),而是将已发布的消息分类到不知道哪些订阅者的情况下。 类似地,订阅者表示对一个或多个频道感兴趣并且只接收感兴趣的消息,而不知道有哪些发布者。发布-订阅是消息队列范式的兄弟,通常是更大的面向消息的中间件系统的一部分。 大多数消息传递系统在其 API 中同时支持发布/订阅和消息队列模型; 例如,Java 消息服务 (JMS)。这种模式提供了更大的网络可扩展性和更动态的网络拓扑,从而降低了修改发布者和发布数据结构的灵活性。
Redis中的发布订阅
在Redis中,以下命令
实现了发布订阅模式
例如,对于
SUBSCRIBE
命令,可以通过运行如下命令来订阅频道,后面可以接一个或者多个频道名取消订阅命令,与订阅命令一致,也可以接一个或者多个频道名
当有客户端发送消息到这些频道时,Redis将会推送传入的消息给所有订阅这些频道的客户端。
正在订阅频道的客户端不应该发送除了订阅或取消订阅以外的命令。订阅和退订操作的执行结果以消息的形式返回,客户端可以读取收到消息的第一个元素来区分收到的是消息类型,还是订阅和退订操作执行结果。
进入订阅模式后,订阅客户端只能执行以下命令:
注意:在>=6.2 版本才能使用 RESET 命令
下图为实例的实际效果
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F3f18a281-69e1-42ca-980d-fd8f5e38ccbb%2FUntitled.png?table=block&id=188f6658-7d96-4703-8b64-9e1f56a2650c&t=188f6658-7d96-4703-8b64-9e1f56a2650c&width=526&cache=v2)
推送消息的格式说明
消息是一个带有三个元素的Array Reply
第一个元素只能是下面三种之一:
subscribe
: 表示成功订阅到以第二个返回元素命名的频道。第三个元素表示客户端当前订阅频道总数。
unsubscribe
: 表示成功退订以第二个返回元素命名的频道。第三个元素表示客户端当前订阅频道总数。当第三个参数为零的时候,表示客户端已退出Pub/Sub状态,不再订阅任何频道,可以发送订阅和退订以外的Redis 命令。
message
: 表示收到其它某一个客户端用 PUBLISH 发布的消息,第二个元素是来源频道的名字,第三个参数是消息实际内容。
实际效果
客户端1——发布者
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbd6dbc49-676e-42f1-8619-2e641b554075%2FUntitled.png?table=block&id=c5fd6d6d-1dac-47c3-a7cb-af94a45c690f&t=c5fd6d6d-1dac-47c3-a7cb-af94a45c690f&width=464&cache=v2)
客户端2——订阅者
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb1ec6dc0-6113-4ff8-b5c5-8839ec663c30%2FUntitled.png?table=block&id=dacee36a-3748-4bac-8e2b-ab33ab05bc2d&t=dacee36a-3748-4bac-8e2b-ab33ab05bc2d&width=483&cache=v2)
可以看到,发布者在channel1 与 channel 2频道各发送了两条信息,订阅者因为订阅两个频道,接收到四条信息。四个Array Reply。
带有模式匹配的订阅
可以看到,只是在
SUBSCRIBE
以及UNSUBSCRIBE
前面增加了一个P
,这里的P
就是Pattern的意思,使用方法同SUBSCRIBE
以及UNSUBSCRIBE
,只是传参为Pattern模式- PSUBSCRIBE
PSUBSCRIBE pattern [pattern ...]
- 订阅符合模式的对应的频道,支持glob
h?llo
subscribes tohello
,hallo
andhxllo
h*llo
subscribes tohllo
andheeeello
h[ae]llo
subscribes tohello
andhallo,
but nothillo
- PUNSUBSCRIBE
PUNSUBSCRIBE [pattern [pattern ...]]
- 取消订阅符合模式的对应的频道,如果为空,则取消所有
实现Redis中的发布订阅模式
订阅者
发布者
同时运行两个客户端代码
在【发布者】的命令行中输入消息
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F1104e3ee-424a-46a0-a1f0-4b40a29a8f47%2FUntitled.png?table=block&id=fec15862-12d1-4cec-9f49-e650b3df36bf&t=fec15862-12d1-4cec-9f49-e650b3df36bf&width=800&cache=v2)
在【订阅者】的命令行中可以看到收到了消息
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fdc96497c-69e8-4c66-85f2-84556024619f%2FUntitled.png?table=block&id=118ba1c0-1400-47c4-9e66-732cbd27a109&t=118ba1c0-1400-47c4-9e66-732cbd27a109&width=3060&cache=v2)
发布者在频道
eachen_radio
上发布消息,订阅者在同一个频道上接受消息- 作者:eachenkuang
- 链接:https://kuangyichen.com/article/redis-message-pub-sub?target=comment
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。