命令介绍
Redis的发布与订阅由PUBLISH、SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE。
- PUBLISH:往频道发送一条消息。
PUBLISH <channel> <msg>
- SUBSCRIBE:订阅某一个频道的消息。
- UNSUBSCRIBE:取消订阅某一个频道。
- PSUBSCRIBE:通过模式订阅频道。
- PUNSUBSCRIBE:取消某一个模式。
概念解释: - 频道:类似消息中间件中topic的概念,订阅频道之后可以收到在该频道上发布的消息,在Redis内部中,频道其实就是channel字典中的key。
- 模式:模式是一个类似正则表达式的概念,频道匹配某一个模式时,也会发消息给订阅该模式的客户端。
SUBSCRIBE和UNSUBSCRIBE(订阅和取消)
在redisServer(redis服务器对象)中存在pubsub_channels
属性,该属性是一个字典对象,其中字典key为频道名,value为一个链表(由所有订阅该频道的客户端形成)。
假如client1、client2、client3订阅了频道“news.it”,那么就会形成以下架构。
SUBSCRIBE
那么SUBSCRIBE的行为就很好理解了,当客户端执行以下命令时,服务器将会发生的操作:
SUBSCRIBE "news.other"
- 先判断"news.other"作为key是否存在pubsub_channels字典中。
- 存在则表示这个频道已经有客户端订阅,那么拿到该频道对应的链表,将节点加到链表尾部。
- 如果不存在,表示该频道第一次订阅,以频道名做key,用该客户端为头部节点的链表做value,加入到pubsub_channels字典中。
UNSUBSCRIBE
客户端执行UNSUBSCRIBE时,要找到该频道,并把客户端从链表中移除,如果移除之后链表为空,那么就把该频道表示的键值对在pubsub_channels字典中删除。
PSUBSCRIBE和PUNSUBSCRIBE(模式的订阅和取消)
当用模式去订阅和取消,实际上是在操作redisServer对象的pubsub_patterns
属性,该属性是一个链表,聊表对象包含表达式和客户端对象。
PSUBSCRIBE
用模式表达式和客户端产生一个链表节点,加入到pubsub_patterns
属性中。
PUNSUBSCRIBE
在链表中移除匹配的节点。
PUBLISH
当客户端执行发布命令时,具体流程如下:
PUBLISH "news.it" "hello"
- 取得频道名“news.it”。
- 在
pubsub_channels
字典中获取该频道对应的客户端链表,遍历该链表,将消息发送该客户端。 - 循环
pubsub_patterns
链表,检查频道名与模式表达式是否匹配,匹配就将消息发送给节点记录的客户端。
发布订阅模型图示
发布消息到频道“news.et”,那么客户端B、C、D都会受到消息。