redis 發布與訂閱原理分析

2022-07-02 17:36:11 字數 2003 閱讀 8859

一、訂閱頻道和資訊發布

功能說明:redis 的 subscribe 命令可以讓客戶端訂閱任意數量的頻道, 每當有新資訊傳送到被訂閱的頻道時, 資訊就會被傳送給所有訂閱指定頻道的客戶端。

訂閱例子示意圖:下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:

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

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

說明:每個 redis 伺服器程序都維持著乙個表示伺服器狀態的 redis.h/redisserver 結構, 結構的 pubsub_channels 屬性是乙個字典, 這個字典就用於儲存訂閱頻道的資訊,其中,字典的鍵為正在被訂閱的頻道, 而字典的值則是乙個鍊錶, 鍊錶中儲存了所有訂閱這個頻道的客戶端。

例子示意圖:在下圖展示的這個pubsub_channels示例中,client2client5client1就訂閱了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還有一種基於模式的訂閱與資訊傳送。帶後續補上。

Redis訂閱與發布原理

記錄下來以後方便回憶,需要時隨時翻閱 redis 訂閱與發布 原理 client pubsub channels是客戶端維護的乙個以dict結構的維護的訂閱頻道雜湊表,val是null,不需要值。server pubsub channels是服務端維護的乙個以dict結構的維護的訂閱頻道雜湊表,va...

Redis發布與訂閱命令和原理

本篇部落格是對 redis設計與實現 的學習總結 日期 2020 12 11 redis版本 3.0.6 訂閱 subscribe channel channel 訂閱乙個或多個頻道,返回訂閱的頻道數 發布publish channel message向乙個頻道發布訊息,返回向多少個客戶端傳送了訊息...

Redis 發布與訂閱

redis 自從2.0版本後,增加發布與訂閱等新特性,該功能有點類似設計模式中的觀察者模式,對訊息的生產者與接收者進行松耦合。也可以用該特性實現系統與系統之間的訊息傳遞,該功能的 的實現非常實用和高效。下面我們介紹一下,如何使用發布與訂閱 redis提供發布與訂閱幾個命令 subscribe cha...