redis的發布訂閱模式

2021-08-28 15:13:19 字數 2674 閱讀 9309

發布訂閱模式:就是乙個發布者發布訊息,多個訂閱者進行訊息的訂閱,目的是為了訊息的傳送,

主要包含三個部分:發布者,訂閱者和channel。

結合上圖和訊息中介軟體,可以將channel和訊息中介軟體中的topic主題對應起來

命令用例和描述

subscribe

subscribe channel [channel …] 訂閱乙個或多個頻道

unsubscribe

unsubscribe [channel [channel …]] 退訂頻道,如果沒有指定頻道,則退訂所有的頻道

publish

publish channel message 給指定的頻道發訊息

psubscribe

psubscribe pattern [pattern …] 訂閱給定模式相匹配的所有頻道

punsubscribe

punsubscribe [pattern [pattern …]] 退訂給定的模式,如果沒有指定模式,則退訂所有模式

(1)傳送訊息 

redis採用publish命令傳送訊息,其返回值為接收到該訊息的訂閱者的數量。 

(2)訂閱某個頻道 

redis採用subscribe命令訂閱某個頻道,其返回值包括客戶端訂閱的頻道,目前已訂閱的頻道數量,以及接收到的訊息,其中subscribe表示已經成功訂閱了某個頻道。 

上圖 指令說明 subscribe first second 表示訂閱者訂閱 訂閱的 channel,這裡可以多個,因為語法中這個是channel型別

返回的話,一般是三行式:第一行:subscribe 作為一種回應告訴是訂閱,第二行 代表訂閱的內容,訊息,第三個 訂閱的個數

(3)模式匹配 

模式匹配功能允許客戶端訂閱符合某個模式的頻道,redis採用psubscribe訂閱符合某個模式所有頻道,用「」表示模式,「」可以被任意值代替。 

假設客戶端同時訂閱了某種模式和符合該模式的某個頻道,那麼傳送給這個頻道的訊息將被客戶端接收到兩次,只不過這兩條訊息的型別不同,乙個是message型別,乙個是pmessage型別,但其內容相同。 

(4)取消訂閱 

redis採用unsubscribe和punsubscribe命令取消訂閱,其返回值與訂閱類似。 

由於redis的訂閱操作是阻塞式的,因此一旦客戶端訂閱了某個頻道或模式,就將會一直處於訂閱狀態直到退出。在subscribe,psubscribe,unsubscribe和punsubscribe命令中,其返回值都包含了該客戶端當前訂閱的頻道和模式的數量,當這個數量變為0時,該客戶端會自動退出訂閱狀態

每個 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 命令的實現就非常簡單了: 當呼叫 publish channel message 命令, 程式首先根據 channel 定位到字典的鍵, 然後將資訊傳送給字典值煉表中的所有客戶端。

比如說,對於以下這個 pubsub_channels 例項, 如果某個客戶端執行命令 publish channel1 "hello moto" ,那麼 client2 、 client5 和 client1 三個客戶端都將接收到 "hello moto" 資訊:

退訂頻道

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

4. redis的發布訂閱和activemq的區別

參照部落格:

Redis發布訂閱模式

publish subscribe 發布訂閱模式的原理 包含兩個角色,乙個是發布者,乙個是訂閱者 訂閱者可以訂閱乙個或者多個頻道channel 發布者可以向指定頻道發布資訊 通過publish發布訊息 publish channel message publish channel1.1 maizie...

redis訂閱發布模式

理論遲點再補,先上 直接上 demopub.php 發布者 redis new redis redis connect localhost 6379 redis publish mcs 麒麟之才 demosub.php 訂閱者 redis new redis redis connect 127.0....

redis發布訂閱模式

發布 訂閱 模式包含兩種角色,分別是發布者和訂閱者。訂閱者可以訂閱乙個或者多個頻道 channel 而發布者可以向指定的頻道 channel 傳送訊息,所有訂閱此頻道的訂閱者都會收到此訊息。此模式允許生產者只生產一次訊息,由中介軟體負責將訊息複製到多個訊息佇列,每個訊息佇列由對應的消費組消費。模糊匹...