Redis发布与订阅
发布与订阅
Redis的发布与订阅功能主要由PUBLISH、SUBCRIBE、PSUBCRIBE等命令组成:
-
PUBLISH:客户端发送给频道命令
-
SUBCRIBE:客户端用于订阅某个频道命令
-
PSUBCRIBE:客户端用于订阅某个模式或者多个模式命令
-
UNSUBCRIBE:退订频道
-
PUNSUBCRIBE:退订模式
-
PUBSUB:Redis2.8新增命令,客户端查看频道或者模式的相关信息
发布与订阅的基本模式是:当客户端订阅了一个频道或者模式之后,若有其他客户端向该频道或者模式发送消息,这些消息会传播至所有作为订阅者的客户端以及所有与这个频道相匹配的模式的订阅者中。
由于有客户端的概念,实质上担任频道或者订阅模式的是服务器
1、频道的订阅与退订
Redis将所有频道的订阅关系保存在结构体redisServer状态的pubsub_channels字典中,此字典键是订阅的频道,值是订阅该频道的客户端链表。
订阅的流程,主要是在服务器中这个字典的操作:
-
如果订阅的频道没有订阅者,即是一个新的频道,将会在字典中新创建一个字典,然后将客户端作为节点加入链表中;
-
如果有订阅者,即存在一个客户端链表,此时只需要将客户端作为一个元素加载客户端链表的尾部
退订的流程与订阅流程相反,也是在对服务器的字典进行操作:
-
先根据频道找到客户端链表,进行客户端信息删除;
-
如果删除后,链表成为空链表,则将对应频道的键进行删除,表示没有订阅者了。
2、模式的订阅与退订
与服务器将频道的订阅保存在pubsub_channels字典中类似,服务器会将客户端对于模式的订阅保存在服务器状态redisServer的pubsub_patterns链表中,此链表的每一个节点包含一个pubsubPattern结构,结构中pattern属性,记录了被订阅的模式,client属性记录订阅该模式的客户端。

订阅的流程:
-
新建一个pubsubPattern节点结构,将pattern属性设置为订阅的模式,client属性设置为客户端(意味着多个客户端订阅同一个模式时,会有多个节点)
-
然后将此节点加入pubsub_patterns链表尾部
退订的流程:
-
先在链表中找到对应客户端的节点,再检查要退订的模式是否与节点中pattern属性一致
-
一致则进行删除节点,没有一致则继续遍历。
3、发送消息
Redis客户端执行命令 PUBLISH <channel> <message>命令时,将消息发送给频道时,实质是发送给服务器,然后服务器根据所建立的pubsub_channels字典和pubsub_patterns链表进行两个操作:
-
将message发送给该channel的所有订阅者;
-
将message发送给与channel频道相匹配的所有模式的订阅者
4、查看订阅信息
PUBSUB:Redis2.8新增命令,客户端查看频道或者模式的相关信息,也是实质是发送给服务器,然后服务器根据所建立的pubsub_channels字典和pubsub_patterns链表进行两个操作。
-
PUBSUB CHANNELS[pattern] :用于返回服务器目前被订阅的频道,如果pattern参数不给定,返回所有频道;如果给定,返回与之匹配的所有频道;
-
PUBSUB NUMSUB[channel-1 channel-2...channel-n] 子命令接受任意多个频道作为输入参数,并返回这些频道的订阅者数量
-

浙公网安备 33010602011771号