文章目录
- 1、什么是发布与订阅
- 2、指令与描述
- 3、指令测试
1、什么是发布与订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 的 subscribe 命令可以让客户端订阅任意数量的频道,
每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
三个「订阅者」订阅「Channel1」频道:
当 Channel1 的后台发送了一个数据到 Channel1 的频道中,这三个订阅了 Channel1 的客户端就会同时收到这个数据:
2、指令与描述
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern …] | 订阅一个或多个符合给定模式的频道 |
PUBSUB subcommand [argument [argument …]] | 查看订阅与发布系统状态 |
PUBLISH channel message | 将信息发送到指定的频道 |
PUNSUBSCRIBE [pattern [pattern …]] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel …] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel …]] | 退订给定的频道,说明:若没有指定channel,则默认退订所有频道 |
3、指令测试
查看活跃的频道
通过 SUBSCRIBE 命令订阅某频道后,redis-server 里维护了一个字典,字典的键就是一个个 channel ,而字典的值则是一个链表,链表中保存了所有订阅这个 channel 的客户端。SUBSCRIBE 命令的关键,就是将客户端添加到给定 channel 的订阅链表中。
客户端订阅,就被链接到对应频道的链表的尾部,退订则就是将客户端节点从链表中移除。
缺点:
- 客户端订阅了channel之后,如果接收消息不及时,可能导致消息堆积,当达到消息堆积阈值(默认值为32MB),或者达到某种程度(默认8MB)一段时间(默认为1分钟)后,服务器端会自动断开该客户端连接,避免导致内部内存耗尽。
- 当连接断开之后,客户端需要使用subscribe或者psubscribe重新进行订阅,否则无法继续接收消息
- Redis的pubsub不是一种可靠的消息系统。当出现客户端连接退出,或者极端情况下服务端发生主备切换时,未消费的消息会被丢弃
应用场景:
1、实时沟通消息系统
2、个人博客系统(粉丝关注博主,博主发送一篇博客,订阅的用户就可以监听到)
3、电商中,用户下单成功之后向指定频道发送消息,下游业务订阅支付结果这个频道处理自己相关业务逻辑
Redis的pubsub不是一种可靠的消息系统。如果场景复杂,可以使用消息中间件来做,kafka RabbitMQ ActiveMQ RocketMQ …等