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這個源代碼文件,差很少都會懂得,沒啥好說的,

但願這篇對你有用~

相關文章
相關標籤/搜索