Redis之發布與訂閱

2021-10-10 17:48:40 字數 1921 閱讀 9562

redis的發布訂閱功能由pubish,subscribe,psubscribe命令組成。

通過執行subscribe命令,客戶端可以訂閱乙個或者多個頻道,從而成為這些頻道的訂閱者(subscriber):每當有其他客戶端向被訂的頻道傳送訊息時,頻道的所有訂閱者都會收到這條訊息。

除了訂閱頻道之外,客戶端還可以通過執行psubscribe命令訂閱乙個或者多個模式,從而成為這些模式的訂閱者:每當有其他客戶端向莫格頻道傳送訊息時,訊息不僅會傳送給這個頻道的所有訂閱者,還會傳送給所有與這個模式相匹配的模式的訂閱者。

向「new.it"頻道傳送訊息"hello",那麼不僅正在訂閱」new.it「頻道的客戶端a會收到雄安熙,客戶端c和d也會收到訊息,因為這兩個客戶端正在訂閱匹配"new.it"頻道的"new.[ie]t"模式。

當乙個客戶端執行subscribe命令訂閱某個或者某些頻道時,這個客戶端與被訂閱頻道之間就建立了一種訂閱關係。

redis將所有頻道的訂閱關係都儲存在伺服器狀態的pubsub_channels字典裡面,這個字典的鍵是某個被訂閱的頻道,而鍵的值則是乙個鍊錶,鍊錶裡面記錄了所有訂閱這個頻道的客戶端:

struct redisserver 

;

每當客戶端執行subscribe命令訂閱某個或者某些頻道時,伺服器都會將客戶端與被訂閱的頻道在pubsub_channels字典進行關聯。

根據頻道頻道是否有其他訂閱者,關聯操作分為兩種情況執行:

unsubscribe命令的行為和subscribe命令的行為正好相反,當乙個客戶都安退訂某個或者某些頻道時,伺服器將從pubsub_channels中接觸客戶端與被退訂頻道之間的關聯:

伺服器將所有頻道的訂閱關係都儲存在伺服器狀態pubsub_channels屬性裡面,伺服器也將所有模式的訂閱關係都儲存在伺服器狀態的pubsub_patterns屬性裡面:

struct redisserver 

;

pubsub_patterns屬性是乙個鍊錶,鍊錶中的每個節點都包含著乙個pubsubpattern結構,這個結構pattern屬性記錄了被訂閱的模式,而client屬性則記錄了訂閱模式的客戶端:

typedef

struct pubsubpattern pubsubpattern;

每當客戶端執行psubscribe命令訂閱某個或者某些模式的時候,伺服器會對每個被訂閱的模式執行以下兩個操作:

模式的退訂命令punsubscribe是psubscribe命令的反操作:

當乙個客戶端退訂某個或者某些模式的時候,伺服器將在pubsub_patterns鍊錶中查詢並且刪除那些pattern屬性為退訂模式,並且client屬性為執行退訂命令的客戶端的pubsubpattern結構

當乙個redis客戶端執行publish命令將訊息message傳送給頻道channel時候,伺服器需要執行以下兩個動作:

因為伺服器狀態中的所有pubsub_channel字典記錄了所有頻道的訂閱關係,所以為了將訊息傳送給channel頻道的所有訂閱者,publish命令要做的就是在pubsub_channels字典裡面找到頻道channel訂閱者名單(乙個鍊錶,將訊息傳送給名單上的所有客戶端)

例如,執行以下命令:

publish 」new

.it「 "hello"

那麼publish命令將在pubsub_channels字典中查詢鍵」new.it「對應的鍊錶值,並且通過遍歷鍊錶將訊息"hello"傳送給訂閱者

因為伺服器狀態中的pubsub_patterns鍊錶記錄了所有模式的訂閱關係,所以為了將訊息傳送給所有與channel頻道相匹配的模式的訂閱者,publish命令要做的就i是遍歷整個鍊錶,查詢那些channel頻道相匹配的模式,並將訊息傳送給訂閱了這些模式的客戶端。

伺服器狀態在pubsub_channels字典中儲存了所有頻道的訂閱關係:

Redis 發布與訂閱

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

redis發布與訂閱

redis在2.8.0版本之後出了乙個新功能,叫pub sub,也叫 發布與訂閱 在這篇文章中不僅要介紹它是如何用的,更重要的是要介紹它的應用場景。在之前介紹websocket之用tubesock在rails實現聊天室 五 的時候,就用redis的pub sub實現過聊天室。相關的 是這樣的 red...

Redis發布與訂閱

訂閱 發布訊息圖 第乙個 訊息傳送者,第二個 頻道 第三個 訊息訂閱者!下圖展示了頻道 channel1 以及訂閱這個頻道的三個客戶端 client2 client5 和 client1 之間的關係 當有新訊息通過 publish 命令傳送給頻道 channel1 時,這個訊息就會被傳送給訂閱它的三...