redis發布訂閱模式

2021-09-28 21:21:01 字數 3499 閱讀 3797

"發布/訂閱"模式包含兩種角色,分別是發布者和訂閱者。訂閱者可以訂閱乙個或者多個頻道(channel),而發布者可以向指定的頻道(channel)傳送訊息,所有訂閱此頻道的訂閱者都會收到此訊息。

此模式允許生產者只生產一次訊息,由中介軟體負責將訊息複製到多個訊息佇列,每個訊息佇列由對應的消費組消費。

模糊匹配

psubscribe pattern [pattern ...] :訂閱乙個或多個符合給定模式的頻道。

每個模式以 * 作為匹配符,比如 it* 匹配所有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類。

萬用字元中?表示1個佔位符,*表示任意個佔位符(包括0),?*表示1個以上佔位符

注意:

(1)使用psubscribe命令可以重複訂閱同乙個頻道,如客戶端執行了psubscribe c? c?*。這時向c1發布訊息客戶端會接受到兩條訊息,而同時publish命令的返回值是2而不是1。.同樣的,如果有另乙個客戶端執行了subscribe c1 和psubscribe c?*的話,向c1傳送一條訊息該客戶端也會收到兩條訊息(但是是兩種型別:message和pmessage),同時publish命令也返回2.

(2)punsubscribe命令可以退訂指定的規則,用法是: punsubscribe [pattern [pattern …]],如果沒有引數則會退訂所有規則

(3)使用punsubscribe只能退訂通過psubscribe命令訂閱的規則不會影響直接通過subscribe命令訂閱的頻道,同樣unsubscribe命令也不會影響通過psubscribe命令訂閱的規則。

另外需要注意punsubscribe命令退訂某個規則時不會將其中的萬用字元展開,而是進行嚴格的字串匹配,所以punsubscribe *無法退訂c規則,而是必須使用punsubscribe c*才可以退訂

底層是通過字典(圖中的pubsub_channels)實現的,這個字典就用於儲存訂閱頻道的資訊:字典的鍵為正在被訂閱的頻道, 而字典的值則是乙個鍊錶, 鍊錶中儲存了所有訂閱這個頻道的客戶端

​​當客戶端呼叫 subscribe 命令時, 程式就將客戶端和要訂閱的頻道在 pubsub_channels 字典中關聯起來

舉個例子,如果客戶端 client10086 執行命令subscribe channel1 channel2 channel3,那麼前面展示的 pubsub_channels 將變成下面這個樣子:

當呼叫publish channel message命令, 程式首先根據 channel 定位到字典的鍵, 然後將資訊傳送給字典值煉表中的所有客戶端。

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

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

底層是pubsubpattern節點的鍊錶。

struct redisserver ;

@pdai: **已經複製到剪貼簿

鍊錶中的每個節點都包含乙個 redis.h/pubsubpattern 結構:

typedef struct pubsubpattern  pubsubpattern;

@pdai: **已經複製到剪貼簿

client 屬性儲存著訂閱模式的客戶端,而 pattern 屬性則儲存著被訂閱的模式

每當呼叫 psubscribe 命令訂閱乙個模式時, 程式就建立乙個包含客戶端資訊和被訂閱模式的 pubsubpattern 結構, 並將該結構新增到 redisserver.pubsub_patterns 鍊錶中。

作為例子,下圖展示了乙個包含兩個模式的 pubsub_patterns 鍊錶, 其中 client123 和 client256 都正在訂閱 tweet.shop.* 模式:

如果這時客戶端 client10086 執行psubscribe broadcast.list.*, 那麼 pubsub_patterns 鍊錶將被更新成這樣:

通過遍歷整個 pubsub_patterns 鍊錶,程式可以檢查所有正在被訂閱的模式,以及訂閱這些模式的客戶端。

傳送資訊到模式的工作也是由 publish 命令進行的, 顯然就是匹配模式獲得channels,然後再把訊息發給客戶端。

使用 punsubscribe 命令可以退訂指定的模式, 這個命令執行的是訂閱模式的反操作: 程式會刪除 redisserver.pubsub_patterns 鍊錶中, 所有和被退訂模式相關聯的 pubsubpattern 結構, 這樣客戶端就不會再收到和模式相匹配的頻道發來的資訊。

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發布訂閱模式

127.0 0.1 6379 subscribe tuonas 訂閱了乙個tuonas的頻道 subscribe tuonas 1127.0 0.1 6379 publish tuonas hello 向tuonas這個頻道發布一條hello的訊息 integer 1127.0 0.1 6379 s...