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. 缺点
- 如果一个客户端订阅了频道,但自己读取消息的速度却不够快的话,那么不断积压的消息会使redis输出缓冲区的体积变得越来越大,这可能使得redis本身的速度变慢,甚至直接崩溃。
- 这和数据传输可靠性有关,如果在订阅方端详,那么他将会丢失所有在断线期间发布者发布的消息。
6. 应用
- 消息订阅:公众号订阅,微博关注等等(起始更多是使用消息队列来进行实现)
- 多人在线聊天室
稍微复杂的场景,我们就会使用消息中间件MQ处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构