十四、Redis进阶-Redis“发布/订阅”模式

作者: 温新

分类: 【Redis】

阅读: 2272

时间: 2020-09-02 15:19:53

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis中提供了一组命令可以轻松实现“发布/订阅”模式。“发布/订阅”模式可以实现进程间的消息传递,原理如下:

发布订阅模式中包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或多个频道(channel),发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会接收到此消息。

发布订阅命令

psubscribe 订阅一个或多个频道

语法:psubscribe pattern [pattern ...]

每个模式以 * 作为匹配符,比如 it* 匹配所有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等)。 news.* 匹配所有以 news. 开头的频道( news.it 、 news.global.today 等等)

pubsub 查看订阅与发布系统状态

语法:pubsub subcommand [arg [arg ...]]

publish 将信息发送到指定的频道

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">127</span>.0.0.1:6379> publish channel1.1 hello</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">(integer) <span style="box-sizing: border-box;color: rgb(255, 83, 112)">0</span></span>

该命令返回接收到这条消息的订阅者数量。

语法:publish channel message

punsubscribe 定退所有给定模式的频道

语法:punsubscribe [pattern [pattern ...]]

unsubscribe 退订给定的一个或多个频道的信息

语法:unsubscribe [channel [channel ...]]

subscribe 订阅给定的一个或多个频道

语法:subscribe channel [channel ...]

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(103, 110, 149)"># 新开窗口B</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">Reading messages... (press Ctrl-C to quit)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"subscribe"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">2</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"channel.1"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">3</span>) (integer) <span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"message"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">2</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"channel.1"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">3</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"hello world"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(103, 110, 149)"># 窗口A</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">127</span>.0.0.1:6379> publish channel.1 <span style="box-sizing: border-box;color: rgb(195, 232, 141)">'hello world'</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">(integer) <span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span></span>

进入订阅后的客户端可能收到3种类型的回复。每种类型的回复都包含3个值,第一个值是消息的类型,根据消息类型的不同,第二、三个值的含义也不同。消息类型可能的取值有以下3个:

1)subscribe表示订阅成功的反馈消息。第二值是订阅成功的频道名称,第三个值是当前客户端的频道数量。

2)message这是我们最需要关心的类型,表示接收到的消息。第二值表示产生消息的频道名称,第三个值是消息的内容。

3)unsubscribe表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当值为0时客户端会退出订阅状态,之后就可以执行其他非“发布/订阅”模式的命令。

按照规则订阅

新开窗口C

<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(103, 110, 149)"># 窗口C</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">127</span>.0.0.1:6379> psubscribe channel.?*</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">Reading messages... (press Ctrl-C to quit)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"psubscribe"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">2</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"channel.?*"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">3</span>) (integer) <span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(103, 110, 149)"># 窗口A 发布消息</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">127</span>.0.0.1:6379> publish channel.1 <span style="box-sizing: border-box;color: rgb(195, 232, 141)">'hi qin'</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">(integer) <span style="box-sizing: border-box;color: rgb(255, 83, 112)">2</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(103, 110, 149)"># 窗口C接收</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">127</span>.0.0.1:6379> psubscribe channel.?*</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">Reading messages... (press Ctrl-C to quit)</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"psubscribe"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">2</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"channel.?*"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">3</span>) (integer) <span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">1</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"pmessage"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">2</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"channel.?*"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">3</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"channel.1"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(255, 83, 112)">4</span>) <span style="box-sizing: border-box;color: rgb(195, 232, 141)">"hi qin"</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span>


我是夕阳何处寻,期待和优秀的你一起同行!

小白

2020年09月02日

请登录后再评论