Redis消息队列
Redis的消息队列使用简单,没有什么配置,比ActiveMQ要轻量级太多,当然功能也比较简单,如果只需要简单的订阅以及发布,可以考虑使用它。
订阅操作
命令为:subscribe [channel] [channel] ..,如【代码1】所示,即成功订阅频道[redis.blog]。
发布操作
命令为publish [channel] [message],如【代码2】所示,【图1】为订阅的客户端展示效果。
【代码1】:
subscribe "redis. blog"
【代码2】
publish "redis.blog" "hello redis"
【图1】
退订操作<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KCjxwPsP8we7OqqO6dW5zdWJzY3JpYmUgW2NoYW5uZWxdIFtjaGFubmVsXSAuLqOsyOehvrT6wuszob/L+cq+oaMgPGJyPgqhvrT6wuszob88L3A+CgoKCjxwcmUgY2xhc3M9"brush:sql;"> 模式订阅 命令为:psubscribe [pattern] [pattern]…,如【代码4】所示,如果发布的消息符合当前订阅的模式,亦会收到消息通知,如【图2】所示。 【图2】 模式退订 数据结构 频道是一个dict,pubsub_channels中key为频道名称,value为一个list,list中存储了所有订阅当前频道的client机器; 模式是一个list,list中每个node为一个pubsubPattern结构,定义如下: 订阅模式:即是在当前list队尾插入一个pubsubPattern; 发送消息 另外的三个命令 至于如何将发布的消息及时反馈给所有订阅者,redis是通过服务器的文件事件来操作的,不单单是消息队列功能,所有的get,set操作都是通过文件事件(file event)来驱动的,事件会单独开一篇来介绍。 unsubscribe "redis.blog"
【代码4】psubscribe "redis.*"
命令为:punsubscribe [pattern] [pattern]…,如【代码5】所示。
【代码5】punsubscribe "redis.*"
关于频道以及模式,redis通过两个struct实现,在redisServer中是如下定义的:struct rediServer{
dict *pubsub_channels;
list *pubsub_patterns;
}
订阅:如果当前频道还不存在,则subscribe操作即为一次dictAdd操作,如果存在,则相当于将当前的client append到当前channel对应的value list中;
退订:从dict中get(channel)获得list,从list中删除当前client,如果删除后list为空,则表示当前频道已经没有订阅者了,此时将会删除当前channel。typedef struct pubsubPattern{
redisClient *client;
robj *pattern;
}
退订模式:则是遍历list删除匹配节点的过程。
即使不同client订阅同一个模式,也是两个不同的node,或者同一个client订阅2个不同模式,亦为两个node,这一点从pubsubPattern的数据结构上能看出来。
发布一条信息,redis服务器会执行2个操作:
以当前频道为key,在当前pubsub_channels字典中找到对应的value,value为一个订阅者list,遍历该list,将消息发送给所有的订阅者;
将消息发送给与当前频道相匹配的所有模式,具体操作为:
以当前频道为key,在当前pubsub_patterns列表中遍历所有节点,如果某个节点(pubsubPattern)的pattern值和key匹配,则将消息发送给当前节点的client,遍历结束为止。