天天看點

15天玩轉redis —— 第九篇 釋出/訂閱模式

本系列已經過半了,這一篇我們來看看redis好玩的釋出訂閱模式,其實在很多的mq産品中都存在這樣的一個模式,我們常聽到的一個例子

就是郵件訂閱的場景,什麼意思呢,也就是說100個人訂閱了你的部落格,如果部落客發表了文章,那麼100個人就會同時收到通知郵件,除了這個

場景還能找到其他場景麼,當然有啦,你想想,如果你要在記憶體裡面做一個讀寫分離的程式,為了維持資料的完整性,你是不是需要保證在寫入

的時候,也要分發到各個讀記憶體的程式中呢?是以說場景還是很多的,在于你的挖掘~~~ 下面還是從基本指令入手:

一:指令簡介

15天玩轉redis —— 第九篇 釋出/訂閱模式

從redis手冊上面可以看到,其實“釋出、訂閱”模式才區區6個指令,下面聽我一一解說下哈~~~

1. subscribe

從上面的官方解釋上來看,它的玩法有一點像現實生活中我們聽收音機一個道理,要想聽收音機,我們要做什麼?肯定就是調頻啦,隻有在正

确的頻道上面,我們才能聽得到好聽的節目,是以說subscribe首先要訂閱一個頻道(channel),下面我舉個例子,開兩個client,分别訂閱着

msg 這個頻道,比如下面這樣:

15天玩轉redis —— 第九篇 釋出/訂閱模式

2.publish

到現在為止,這兩個subscibe都在監視着msg這個頻道,接下來,如果msg頻道有消息傳出,必定會被subscribe接收到,先我們還是看看

redis手冊上怎麼用這個指令。

看到上面指令的用法,我也就放心了。

15天玩轉redis —— 第九篇 釋出/訂閱模式

看到麼有,publish在msg這個頻道上面發送消息後,被subscribe監視到了,然後就被分别列印輸出了,好了,到現在為止,最基本的釋出

訂閱模式就是這樣,是不是很簡單哈。。。其實呢??? 也就是這麼簡單呐,但是呢,有時候我們還有這樣一個需求,就是我能不能模糊匹

配key呢???舉了例子,就是要求訂閱china為字首的所有頻道,如果這樣也可以做到的話,那确實是很牛逼啦。。。我要是回答的話,當

然啦,強大的redis自然會做到這一點,它提供了的指令就是:psubscribe。

3. psubscribe

看到上面的解釋,你心裡可能就在想,這不就是正則比對麼。。。而且字首“p”就是pattern的意思,對吧,接下來我就訂閱一下所有china為

字首的channel。

15天玩轉redis —— 第九篇 釋出/訂閱模式

好了,最常用的也就是這三個指令,接下來我們簡單分析一下代碼。

二: 源碼簡單分析

  其實redis的釋出訂閱模式,使用redisserver下面的 pubsub_channels字典 和 pubsub_patterns數組存放的,所有的操作代碼都

在pubsub.c檔案下,如下圖:

15天玩轉redis —— 第九篇 釋出/訂閱模式

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就知

道結果了。

15天玩轉redis —— 第九篇 釋出/訂閱模式

4. publishcommand

  先前也說了,publish的原理很簡單,就是找到字典中的channel這個key,擷取到clients之後,周遊client的來發送資訊。

15天玩轉redis —— 第九篇 釋出/訂閱模式

同樣的道理,pubsub_patterns也是差不多的實作,隻要大家簡單看一下pubsub.c這個源代碼檔案,差不多都會懂得,沒啥好說的,

希望這篇對你有用~

繼續閱讀