redis 發布與訂閱原理分析


前言:用了redis也有一段時間了,但是發布與訂閱的使用頻率也不高,趁着這次空閑,深究下redis的發布與訂閱模式。

 

一、訂閱頻道和信息發布

功能說明:Redis 的 SUBSCRIBE 命令可以讓客戶端訂閱任意數量的頻道, 每當有新信息發送到被訂閱的頻道時, 信息就會被發送給所有訂閱指定頻道的客戶端。 訂閱例子示意圖:下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:

發布例子示意圖:當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端:

 

 二、訂閱頻道結構原理解析

 

說明:每個 Redis 服務器進程都維持着一個表示服務器狀態的 redis.h/redisServer 結構, 結構的 pubsub_channels 屬性是一個字典, 這個字典就用於保存訂閱頻道的信息,其中,字典的鍵為正在被訂閱的頻道, 而字典的值則是一個鏈表, 鏈表中保存了所有訂閱這個頻道的客戶端。

例子示意圖:在下圖展示的這個 pubsub_channels 示例中, client2 、 client5 和 client1 就訂閱了 channel1 , 而其他頻道也分別被別的客戶端所訂閱。

操作:當客戶端調用 SUBSCRIBE 命令時, 程序就將客戶端和要訂閱的頻道在 pubsub_channels 字典中關聯起來。

示意圖:如果客戶端 client10086 執行命令 SUBSCRIBE channel1 channel2 channel3 ,那么前面展示的 pubsub_channels 將變成下面這個樣子,通過遍歷所有輸入頻道。

結論:通過 pubsub_channels 字典, 程序只要檢查某個頻道是否為字典的鍵, 就可以知道該頻道是否正在被客戶端訂閱; 只要取出某個鍵的值, 就可以得到所有訂閱該頻道的客戶端的信息。

 

 三、發布信息到頻道結構解析

原理說明:當調用 PUBLISH channel message 命令, 程序首先根據 channel 定位到字典的鍵, 然后將信息發送給字典值鏈表中的所有客戶端。

例子示意圖:對於以下這個 pubsub_channels 實例, 如果某個客戶端執行命令 PUBLISH channel1 "hello moto" ,那么 client2 、 client5 和 client1 三個客戶端都將接收到 "hello moto" 信息,通過遍歷訂閱頻道的所有客戶端。

 

四、退訂頻道

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

 

以上就是本篇文章的全部了,其中redis還有一種基於模式的訂閱與信息發送。帶后續補上。

 

參考鏈接:https://redisbook.readthedocs.io/en/latest/feature/pubsub.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM