Redis发布订阅模式原理与运用

y123132 社区新秀 2022-08-18 09:10:06

Redis 发布订阅简介

Redis 发布订阅(Pus/Sub)是一种消息通信模式:发送者通过 PUBLISH发布消息,订阅者通过 SUBSCRIBE 订阅接收消息或通过UNSUBSCRIBE 取消订阅。

主要包含三个部分组成:「发布者」、「订阅者」、「Channel」。

发布者和订阅者属于客户端,Channel 是 Redis 服务端,发布者将消息发布到频道,订阅这个频道的订阅者则收到消息。

如下图所示,三个「订阅者」订阅「ChannelA」频道:

 

 

这时候,小组长往「ChannelA」发布消息,这个消息的订阅者就会收到消息「关注码哥字节,提升技术」:

 

Pub/Sub 实战

废话不多说,知道基本概念以后,学习一个技术第一步先把它跑起来,接着才是探索原理,从而达到「知其然,知其所以然」的境界 。

一共有两种模式实现「发布\订阅」:

  • 使用频道(Channel)的发布订阅;
  • 使用模式(Pattern)的发布订阅。

需要注意的是,发布订阅机制与 db 空间无关,比如在 db 10 发布, db0 的订阅者也会收到消息。

通过频道(Channel)实现

三步走:

  1. 订阅者订阅频道;
  2. 发布者向「频道」发布消息;
  3. 所有订阅「频道」的订阅者收到消息。

订阅者订阅频道

使用 SUBSCRIBE channel [channel ...]订阅一个或者多个频道,O(n) 时间复杂度,n = 订阅的 Channel 数量。

SUBSCRIBE develop
Reading messages... (press Ctrl-C to quit)
1) "subscribe" // 消息类型
2) "develop" // 频道
3) (integer) 1 // 消息内容

执行该指令后,客户端进入订阅状态,订阅者只能使用subscribeunsubscribepsubscribepunsubscribe这四个属于"发布/订阅" 的指令。

客户端「肖菜鸡」订阅了 「develop」频道接受组长的消息,消息响应体分别表示:

  • 消息类型:subscribe、message、unsubscribe
  • 频道
  • 消息内容:随着消息类型不同代表不同含义。

进入订阅后的客户端可以收到 3 种类型的消息回复:

  1. subscribe:订阅成功的反馈消息,第二个值是订阅成功的频道名称,第三个是当前客户端订阅的频道数量。
  2. message:客户端接收到消息,第二个值表示产生消息的频道名称,第三个值是消息的内容。
  3. unsubscribe:表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅的频道数量,当此值为 0 时客户端会退出订阅状态,之后就可以执行其他非"发布/订阅"模式的命令了。

发布者发布消息

小组长使用 PUBLISH channel message 向指定 「develop」频道发布消息。

PUBLISH develop 'do job'
(integer) 1

需要注意的是,发布的消息并不会持久化,消息发布之后还有新「开发」靓仔订阅的话,只能接收后续发布到该频道的消息。

好一个「不问过往,只争当下」。

订阅者接受消息

关注了「develop」频道的订阅者将会收到「do job」消息。

// 订阅 develop 频道
SUBSCRIBE develop
Reading messages... (press Ctrl-C to quit)
1) "subscribe" // 订阅频道成功
2) "develop" // 频道
3) (integer) 1
// 当发布者发布消息,订阅者读取到的消息如下
1) "message" // 接受到消息
2) "develop" // 频道名称
3) "do job" // 消息内容

退订频道

订阅的反向操作,「65 哥」天天在朋友圈秀恩爱,受不了了,取消订阅他的朋友圈。

使用 UNSUBSCRIBE 命令可以退订指定的「模式」不会影响通过 `subscribe 命令订阅的频道。

同样 unsubscribe命令也不会影响通过psubscribe命令订阅的规则。

 

...全文
121 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

31,081

社区成员

发帖
与我相关
我的任务
社区描述
永远相信美好的事情,即将发生
spring cloudspring bootspring 个人社区 山东省·济南市
社区管理员
  • Somnus_小凯
  • 18岁程序员想打职业
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧