Redis3 0 發布與訂閱

2021-09-26 15:30:07 字數 2181 閱讀 3496

redis的發布與訂閱功能由publish、subscribe、psubscribe等命令組成。

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

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

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

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

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

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

當乙個客戶端退訂某個或某些頻道的時候,伺服器將從pubsub_channels中解除客戶端與被退訂頻道之間的關聯:

伺服器將所有模式的訂閱關係儲存再伺服器狀態的pubsub_patterns屬性裡面:

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

typedef struct pubsubpattern  pubsubpattern;
訂閱模式(psubscribe)

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

1)新建乙個pubsubpattern結構,將結構的pattern屬性設定為被訂閱的模式,client屬性設定為訂閱模式的客戶端。

2)將pubsubpattern結構新增到pubsub_patterns鍊錶的表尾。

退訂模式(punsubscribe)

模式的退訂命令punsubscribe是psubscribe命令的反操作:當乙個客戶端退訂某個或某些模式的時候,伺服器將在pubsub_patterns鍊錶中查詢並刪除哪些pattern屬性為被退訂模式,並且client屬性為執行退訂命令的客戶端的pubsubpattern結構。

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

1)將訊息message傳送給channel頻道的所有訂閱者。

2)如果有乙個或多個模式pattern與頻道channel相匹配,那麼訊息message傳送給pattern模式的訂閱者。

將訊息傳送給頻道訂閱者

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

將訊息傳送給模式訂閱者

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

客戶端可以通過這個命令來檢視頻道或者模式的相關訊息,比如某個頻道目前有多少訂閱者,又或者某個模式目前有多少訂閱者。

pubsub channels

pubsub channels[pattern]子命令用於返回伺服器當前被訂閱的頻道,其中pattern引數是可選的:

pubsub numsub

&pubsub numsub [channel-1 channel-2 … channel-n]子命令接受任意多個頻道作為輸入引數,並返回這些頻道的訂閱者數量。

pubsub numpat

pubsub numpat子命令用於返回伺服器當前被訂閱模式的數量。

《redis設計與實現》

redis 二 發布訂閱

參考資料 redis 4.x cookbook 中文版 redis官方文件 注 本文redis的版本為 5.0.3 注意,如果先發布訊息,然而頻道沒有訂閱者,這時的訊息會被丟失 redis的發布訂閱是乙個訊息推送的機制 發布者 publisher 向指定頻道 channel 發布訊息 message...

Redis七(發布訂閱)

redis 通過 publish subscribe 等命令實現了訂閱與發布模式,這個功能提供兩種資訊機制,分別是訂閱 發布到頻道和訂閱 發布到模式 訂閱者可以訂閱乙個或多個頻道,發布者向乙個頻道傳送訊息後,所有訂閱這個頻道的訂閱者都將收到訊息,而發布者也將收到乙個數值,這個數值是收到訊息的訂閱者的...

Redis學習 4 發布訂閱

redis 發布訂閱 pub sub 是一種訊息通訊模式 傳送者 pub 傳送訊息,訂閱者 sub 接收訊息。redis 客戶端可以訂閱任意數量的頻道。當有新訊息通過 publish 命令傳送給頻道 channel1 時,這個訊息就會被傳送給訂閱它的三個客戶端 訂閱乙個或多個符合給定模式的頻道。pu...