《Redis源码学习笔记》发布/订阅
《Redis源码学习笔记》文章列表
Redis的SUBSCRIBE命令,可以让客户端订阅任意数量的频道,每当有新消息发送到某个频道时,Redis就会把这消息发送给所有订阅该频道的客户端;如下图:客户端Client_1,Client_2,Client_3都订阅了频道channel,当有消息PUBLISH到频道channel时,这三个客户端都将收到消息:
原理:RedisServer内部维护了一个pubsub_channels字典,其中字典的键就是被订阅的频道,而键值就是订阅该频道的客户端列表;
这样,当一个客户端执行PUBLISH channel_name命令时,Redis就可以根据channel_name在pubsub_channels中找到与其关联的客户端列表,然后把消息发送给它们,伪代码;
def publishCommand(channel, msg):# 获取订阅channel的所有客户端列表 client_list = redisServer.pubsub_channels.get(channel) if client_list is None: return # 向每个客户端发送消息 for client in client_list: client.sendMessage(msg) # 遍历pubsub_patterns for pattern, client in redisServer.pubsub_patterns: # 若模式与channel匹配,则把消息发送给订阅该模式的客户端 if pattern.match(channel): client.sendMessage(msg)