15天玩转redis —— 第九篇 发布/订阅模式

  本系列已通过半了,这一篇咱们来看看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这个源代码文件,差很少都会懂得,没啥好说的,

但愿这篇对你有用~

相关文章
相关标签/搜索