Redis订阅与发布

Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。通过SUBSCRIBE命令,客户端可以订阅一个或者多个频道,每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到消息。另外,客户端还可以通过PSUBSCRIBE订阅一个或多个模式。


Redis订阅与发布_第1张图片
image

频道的订阅与退订

Redis将所有频道的订阅关系都保存在服务器状态的pubsub_channels字典里,键为频道,值为一个链表,链表节点是订阅了该频道的客户端:

struct redisServer {
    ... ...
    dict *pubsub_channels;       // 保存所有频道的订阅关系    
    list *pubsub_patterns;         // 保存所有模式订阅关系
    ... ....
};

每当客户端执行SUBSCRIBE命令时,服务器都会将客户端与被订阅的频道在pubsub_channels里关联:

  • 若频道已有其他订阅者,则pubsub_channels字典中必有相应的订阅着链表,只需将客户端添加到链表的末尾;
  • 若频道还未有订阅者,则需先在pubsub_channels中为该频道创建一个键,值设置为空,再将客户端添加进链表。

客户端可通过UNSUBSCRIBE命令退订频道,服务器将从pubsub_channels中解除客户端与被退订频道之间的关联:

  • 在pubsub_channels中找到频道对应的订阅者链表,然后删除链表中退订客户端信息;
  • 若删除退订客户端之后,对应链表变成空链表,则从pubsub_channels中删除对应的键。


    Redis订阅与发布_第2张图片
    image

模式的订阅与退订

服务器将所有模式的订阅关系都保存在服务器状态的pubsub_patterns属性中,pubsub_patterns是一个链表,链表节点是一个pubsubPattern结构:

typedef struct pubsubPattern {
    redisClient *client;     // 订阅模式的客户端
    robj *pattern;             // 被订阅的模式 
} pubsubPattern;

每当客户端执行PSUBSCRIBE命令订阅某个或某些模式时,服务器会对每个订阅模式执行以下操作:

  • 新建一个pubsubPattern结构,将结构中的pattern设置为被订阅的模式,client设置为订阅模式的客户端;
  • 将pubsubPattern结构添加到pubsub_patterns的末尾。

当客户端执行PUNSUBSCRIBE命令退订模式时,服务器将在pubsub_patterns链表中查找并删除pattern为被退订模式,client为执行退订命令的客户端的pubsubPattern结构。


Redis订阅与发布_第3张图片
image

发送消息

当一个Redis客户端执行以下命令发送消息时,服务器需执行以下操作:

PUBLISH  
  1. 将消息message发送给channel频道的所有订阅者;
  2. 如果有模式与频道channel相匹配,那么将message发送给pattern模式的订阅者。

你可能感兴趣的:(Redis订阅与发布)