读书人

《Redis源码学习札记》发布/订阅

发布时间: 2013-10-05 17:54:48 作者: rapoo

《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中找到与其关联的客户端列表,然后把消息发送给它们,伪代码;



所以完整的PUBLISH命令伪代码如下:
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)

更多细节请看:pubsub.c/publishCommand函数

总结:
1. 熟悉发布订阅相关命令:subscribe/unsubscribe psubscribe/punsubscribe publish;
2. 了解发布订阅实现原理;

读书人网 >开源软件

热点推荐