Redis實現消息的發佈訂閱原理分析
一、什麼是發佈和訂閱
- Redis 發佈訂閱 (pub/sub) 是一種
消息通信模式
:發送者 (pub) 發送消息,訂閱者 (sub) 接收消息。 特點:
Redis 客戶端可以訂閱任意數量的頻道。- 這就好比粉絲們關註瞭我,當我寫完文章發佈的時候,你們打開CSDN也會接收到我寫的文章。此時,我就是發送者(pub);粉絲們就是訂閱者(sub)。
結構圖如下:發佈者發送自己的消息到redis服務器,訂閱者從redis服務器中獲取發佈者發佈的消息
二、Redis的發佈和訂閱
為瞭方便後面講解發佈和訂閱命令行的使用,我先用兩張圖簡單的介紹redis實現發佈和訂閱的整體流程。
客戶端可以訂閱頻道如下圖:
當給這個頻道發佈消息後,消息就會發送給訂閱的客戶端,如下圖:
三、redis 發佈訂閱常用命令
下表列出瞭 redis 發佈訂閱常用命令:
四、命令實戰
在演示redis消息的發佈和訂閱之前,我們需要打開兩個客戶端,一個充當消息發佈者,一個充當消息接受者。
1、基本使用
先用一個客戶端訂閱頻道csdn_blog
,等待消息:
127.0.0.1:6379> SUBSCRIBE csdn_blog Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "csdn_blog" 3) (integer) 1
接著一個客戶端在csdn_blog
頻道發送消息hello,cabbage
:
127.0.0.1:6379> PUBLISH csdn_blog "hello,cabbage" (integer) 1
最後接受者接收到消息:
1) "message"
2) "csdn_blog" # 接收消息所在的頻道
3) "hello,cabbage" # 接收到的消息
2、訂閱符合要求的頻道
訂閱以csdn
開頭的頻道,*
表示任意字符
127.0.0.1:6379> PSUBSCRIBE csdn* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "csdn*" 3) (integer) 1
發佈者在兩個頻道發佈消息:
127.0.0.1:6379> PUBLISH csdn_blog "hello" (integer) 1 127.0.0.1:6379> PUBLISH csdn_sing "sing" (integer) 1
最後訂閱者接收到兩個頻道的消息:
1) "pmessage"
2) "csdn*"
3) "csdn_blog"
4) "hello"
1) "pmessage"
2) "csdn*"
3) "csdn_sing"
4) "sing"
3、查看活躍頻道
訂閱者訂閱兩條頻道:
127.0.0.1:6379> SUBSCRIBE csdn_one csdn_two Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "csdn_one" 3) (integer) 1 1) "subscribe" 2) "csdn_two" 3) (integer) 2
發佈者在三條頻道發送消息:
127.0.0.1:6379> PUBLISH csdn_one "one" (integer) 1 127.0.0.1:6379> PUBLISH csdn_two "two" (integer) 1 127.0.0.1:6379> PUBLISH csdn_three "three" (integer) 0
在發佈者客戶端顯示活躍的頻道:
127.0.0.1:6379> PUBSUB channels 1) "csdn_one" 2) "csdn_two"
五、發佈訂閱原理
每個Redis服務器進程都維持著一個表示服務器狀態的redis.h
/redisServer
結構, 結構的pubsub_channels
屬性是一個字典, 這個字典就用於保存訂閱頻道的信息,其中,字典的鍵為正在被訂閱的頻道
, 而字典的值則是一個鏈表, 鏈表中保存瞭所有訂閱這個頻道的客戶端
。
1、訂閱頻道原理
假設訂閱頻道前有如下圖所示的頻道和訂閱該頻道的客戶端:從圖中可以清楚的知道,channelA頻道有三個人訂閱;channelB頻道沒有人訂閱;channelC頻道有兩個人訂閱。
當客戶端clientF
調用SUBSCRIBE
命令時,程序就將客戶端和要訂閱的頻道在 pubsub_channels
字典中關聯起來。執行以下指令,對應的結果圖為:
127.0.0.1:6379> SUBSCRIBE channelB channelC channelA
結論:通過pubsub_channels
字典, 程序隻要檢查某個頻道是否為字典的鍵,就可以知道該頻道是否正在被客戶端訂閱; 隻要取出某個鍵的值, 就可以得到所有訂閱該頻道的客戶端的信息。
2、發佈信息原理
原理說明:
當調用PUBLISH channel message
命令, 程序首先根據channel
定位到字典的鍵, 然後將信息發送給字典值鏈表中的所有客戶端。
對於上圖來說,如果客戶端channelA執行命令PUBLISH channelA “hello,cabbage”,那麼clientA
,clientB
,clientC
,clientF
這四個客戶端都將接收到"hello,cabbage"信息,通過遍歷訂閱頻道的所有客戶端。
3、退訂信息原理
原理:
使用UNSUBSCRIBE
命令可以退訂指定的頻道,這個命令執行的是訂閱的反操作: 它從pubsub_channels
字典的給定頻道(鍵)中, 刪除關於當前客戶端的信息, 這樣被退訂頻道的信息就不會再發送給這個客戶端。
參考文章:http://t.zoukankan.com/rxbook-p-12652198.html
到此這篇關於Redis實現消息的發佈訂閱的文章就介紹到這瞭,更多相關Redis 消息發佈訂閱內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- redis實現隊列的阻塞、延時、發佈和訂閱
- python使用redis模塊來跟redis實現交互
- Go並發控制Channel使用場景分析
- 淺談Redis在直播場景的實踐方案
- redis鍵空間通知使用實現