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命令订阅的规则。

 

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

33,910

社区成员

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

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