Redis笔记之发布与订阅

1. 概念

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
在这里插入图片描述
下图展示了频道channel1,以及订阅这个频道的三个客户端——client2、client5 和 client1 之间的关系:
在这里插入图片描述
当有新消息通过publish 命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端:
在这里插入图片描述

2. 命令

命令说明
psubscribe pattern [ pattern… ]订阅一个或多个符合给定模式的频道
punsubscribe pattern [ pattern… ]退订一个或多个符合给定条件的频道
pubsub subcommand [ argument [argument ] ]查看订阅与发布系统状态
publish channel message向指定频道发布消息
subscribe channel [ channel… ]订阅给定的一个或多个频道
unsubscribe channel [ channel… ]退订一个或多个频道

3. 案例

订阅者

127.0.0.1:6379> subscribe channelT  # 订阅channelT频道
Reading messages... (press Ctrl-C to quit) # 等待接收消息
1) "subscribe"
2) "channelT"
3) (integer) 1
1) "message"  # 接收到channelT频道发来的消息“hello redis!”
2) "channelT"
3) "hello redis!"
1) "message" # 接收到channelT频道发来的消息“helloWorld!”
2) "channelT"
3) "helloWorld!"

发布者

127.0.0.1:6379> publish channelT "hello redis!" # 向channelT频道发送消息
(integer) 1
127.0.0.1:6379> publish channelT "helloWorld!"
(integer) 1

查看当前活跃的频道

127.0.0.1:6379> pubsub channels
 1) "channelT" 

4. 原理

每个Redis服务器进行都维持着一个表示服务器状态的redis.h/redisServer 结构,结构的pubsub_channels 属性是一个字典,这个字典就用于保存订阅频道的信息,其中,字典的键为正在被订阅的频道,而字典的值则是一个链表,链表中保存了所有订阅这个频道的客户端。
在这里插入图片描述
客户端订阅,就被链接到对应频道的链表的尾部,退订则就是将客户端节点从链表中移除。(观察者模式)

5. 缺点

  1. 如果一个客户端订阅了频道,但自己读取消息的速度却不够快的话,那么不断积压的消息会使redis输出缓冲区的体积变得越来越大,这可能使得redis本身的速度变慢,甚至直接崩溃。
  2. 这和数据传输可靠性有关,如果在订阅方端详,那么他将会丢失所有在断线期间发布者发布的消息。

6. 应用

  1. 消息订阅:公众号订阅,微博关注等等(起始更多是使用消息队列来进行实现)
  2. 多人在线聊天室

稍微复杂的场景,我们就会使用消息中间件MQ处理。

posted on   JAVA开发区  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示