发布订阅(pub/sub)是一种消息通信模式,主要目的是解除消息发布者、消息订阅者之间的耦合
pub/sub的特点
(1)时间非耦合
发布者和订阅者不必同时在线,它们不必同时参与交互
(2)空间非耦合
发布者和订阅者不必相互知道对方所在的位置
(3)同步非耦合
发布者/订阅者是异步模式,发布者可不断地生产消息,订阅者则可异步地得到消息通知
pub/sub的使用场景
基于pub/sub的特点,他的典型使用场景就是实时消息系统,比如即时聊天,群聊等功能
还常用作减轻高并发的I/O写压力,例如大量的写日志操作,如果实时写入日志文件或者数据库,会造成I/O超负荷,降低系统性能,那么就可以用pub/sub方式,写日志时先不进行写操作,而是向日志频道发布一条日志消息,然后有一个单独的日志程序来订阅日志频道,异步的读取日志消息写入文件或数据库
redis pub/sub的实现方式
(1)频道
SUBSCRIBE channel
通过 SUBSCRIBE 命令来订阅一个或多个频道
例如
redis> SUBSCRIBE news.it news.sport
那么当其中任何一个频道有新消息的时候,此客户端都会收到
redis 将所有频道的订阅关系都保存在pubsub_channels 字典里面
这个字典的键是某个被订阅的频道,而键的值则是一个链表,链表里面记录了所有订阅这个频道的客户端
当某频道有新消息时,就会查找对应的链表,向链表中每个客户端发送通知
(2)模式
PSUBSCRIBE pattern
通过 PSUBSCRIBE 命令来订阅所有名称符合模式的频道
例如 订阅所有名称为‘news.’开头的频道
redis> PSUBSCRIBE news.*
模式的订阅关系都保存在 pubsub_patterns 属性里面
pubsub_patterns 属性是一个链表,链表中的每个节点都包含着模式、订阅了此模式的客户端
当某频道发布新消息时,就是查找此链表,对频道名称和模式匹配,如果匹配成功,就向订阅了此模式的客户端发送通知