前言推送
什么是“发布 - 订阅 模式”? 答:你知道“观察者模式”吗?
“发布 - 订阅 模式用来干嘛”? 答:你知道消息队列(MQ)的削峰、异步、解耦合吗?
redis的配置文件中是怎么来描述这个特性的? 答:可曾欣赏过redis.conf 吗?
这一切的一切,我都给你准备好了。
传送门:
用C++跟你聊聊“观察者模式”
消息队列:削峰、异步、解耦,以及该如何选择MQ
redis.conf翻译与配置(五)
切入正题:发布/订阅
先来这么几张图:
Redis 的 SUBSCRIBE 命令可以让客户端订阅任意数量的频道, 每当有新信息发送到被订阅的频道时, 信息就会被发送给所有订阅指定频道的客户端。
在上面的两张图里面,很明显那个频道是channel1,而客户端就那三儿。
至于谁来发布消息啊?那自然也是一个充当“发布者”角色的客户端。
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端。
废话不多说,直接看操作:
Redis的消息机制:发布订阅
一publish: 发布消息
语法: publish channel名称"消息的内容”
一subscribe:订阅消息
语法: subscribe channel 名称
——psubsribe:使用通配符来订阅消息
语法: psubsribe channel*名称
退订频道
使用 UNSUBSCRIBE 命令可以退订指定的频道, 这个命令执行的是订阅的反操作: 它从 pubsub_channels 字典的给定频道(键)中, 删除关于当前客户端的信息, 这样被退订频道的信息就不会再发送给这个客户端。
使用 PUNSUBSCRIBE 命令可以退订指定的模式, 这个命令执行的是订阅模式的反操作: 程序会删除 redisServer.pubsub_patterns 链表中, 所有和被退订模式相关联的 pubsubPattern 结构, 这样客户端就不会再收到和模式相匹配的频道发来的信息。
由于Redis的订阅操作是阻塞式的,因此一旦客户端订阅了某个频道或模式,就将会一直处于订阅状态直到退出。在SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE和PUNSUBSCRIBE命令中,其返回值都包含了该客户端当前订阅的频道和模式的数量,当这个数量变为0时,该客户端会自动退出订阅状态。
发布 - 订阅 实现
1)SUBSCRIBE
2)PSUBSCRIBE
3)PUBLISH
应用场景
构造实时消息系统,例如:即时聊天,群聊
文章推送
集中配置中心管理,当配置信息发生更改后,订阅配置信息的节点都可以收到
and so on.
Redis的发布订阅功能与Redis中的数据存储时无关的,它不会影响Redis的key space,即不会影响Redis中存储的数据,但通过发布订阅机制,Redis还提供了另一个功能,即Keyspace Notification,允许客户端通过订阅特定的频道,从而得知是否有改变Redis中的数据的事件。