首頁 > 軟體

Redis實現訊息的釋出訂閱原理分析

2022-07-25 14:04:14

一、什麼是釋出和訂閱

  • 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”,那麼clientAclientBclientCclientF這四個使用者端都將接收到"hello,cabbage"資訊,通過遍歷訂閱頻道的所有使用者端。

3、退訂資訊原理

原理:使用UNSUBSCRIBE命令可以退訂指定的頻道,這個命令執行的是訂閱的反操作: 它從pubsub_channels字典的給定頻道(鍵)中, 刪除關於當前使用者端的資訊, 這樣被退訂頻道的資訊就不會再傳送給這個使用者端。

參考文章:http://t.zoukankan.com/rxbook-p-12652198.html

到此這篇關於Redis實現訊息的釋出訂閱的文章就介紹到這了,更多相關Redis 訊息釋出訂閱內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com