本系列已通过半了,这一篇咱们来看看redis好玩的发布订阅模式,其实在不少的MQ产品中都存在这样的一个模式,咱们常听到的一个例子redis
就是邮件订阅的场景,什么意思呢,也就是说100我的订阅了你的博客,若是博主发表了文章,那么100我的就会同时收到通知邮件,除了这个数组
场景还能找到其余场景么,固然有啦,你想一想,若是你要在内存里面作一个读写分离的程序,为了维持数据的完整性,你是否是须要保证在写入spa
的时候,也要分发到各个读内存的程序中呢?因此说场景仍是不少的,在于你的挖掘~~~ 下面仍是从基本命令入手:code
一:命令简介blog
从redis手册上面能够看到,其实“发布、订阅”模式才区区6个命令,下面听我一一解说下哈~~~内存
1. subscribeci
SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。
从上面的官方解释上来看,它的玩法有一点像现实生活中咱们听收音机一个道理,要想听收音机,咱们要作什么?确定就是调频啦,只有在正源码
确的频道上面,咱们才能听获得好听的节目,因此说subscribe首先要订阅一个频道(channel),下面我举个例子,开两个client,分别订阅着博客
msg 这个频道,好比下面这样:产品
2.publish
到如今为止,这两个subscibe都在监视着msg这个频道,接下来,若是msg频道有消息传出,一定会被subscribe接收到,先咱们仍是看看
redis手册上怎么用这个命令。
PUBLISH channel message
将信息 message 发送到指定的频道 channel 。
看到上面命令的用法,我也就放心了。
看到么有,publish在msg这个频道上面发送消息后,被subscribe监视到了,而后就被分别打印输出了,好了,到如今为止,最基本的发布
订阅模式就是这样,是否是很简单哈。。。其实呢??? 也就是这么简单呐,可是呢,有时候咱们还有这样一个需求,就是我能不能模糊匹
配key呢???举了例子,就是要求订阅china为前缀的全部频道,若是这样也能够作到的话,那确实是很牛逼啦。。。我要是回答的话,当
然啦,强大的redis天然会作到这一点,它提供了的命令就是:Psubscribe。
3. Psubscribe
PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道。 每一个模式以 * 做为匹配符,好比 it* 匹配全部以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配全部以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类。
看到上面的解释,你内心可能就在想,这不就是正则匹配么。。。并且前缀“P”就是Pattern的意思,对吧,接下来我就订阅一下全部china为
前缀的channel。
好了,最经常使用的也就是这三个命令,接下来咱们简单分析一下代码。
二: 源码简单分析
其实redis的发布订阅模式,使用RedisServer下面的 pubsub_channels字典 和 pubsub_patterns数组存放的,全部的操做代码都
在pubsub.c文件下,以下图:
1. pubsub_channels
能够看到,它是一个字典结构,经过注释你应该明白,它的key为channel,value为list。
2. pubsub_patterns
一样从注释中,你能够看到,其实它就是存放模式匹配的subscribe的clients列表,对吧,用一个list数组实现。
3. subcribeCommand
经过下面的代码,你是否是在脑子里面颇有轮廓了???其实这个pubsub_channels果真就是key=channel,value=list的存放模式,
这个list就是所谓的clients列表,这样的话,你就知道了哪些key挂了哪些clients,对吧,若是再publish的话,只须要遍历一下这个list就知
道结果了。
4. publishCommand
先前也说了,publish的原理很简单,就是找到字典中的channel这个key,获取到clients以后,遍历client的来发送信息。
一样的道理,pubsub_patterns也是差很少的实现,只要你们简单看一下pubsub.c这个源代码文件,差很少都会懂得,没啥好说的,
但愿这篇对你有用~