Redis 的發佈/訂閱(pub/sub)模式

pub/sub

發佈者將消息發佈到channels,而不用關心訂閱者是誰。
訂閱者可以訂閱一個或多個channels,並且值接收訂閱channels的消息,而不關心是誰發佈的。
消息的發佈者和訂閱者之間是解耦的。

  • 客戶端執行訂閱以後,除了可以繼續訂閱(SUBSCRIBE或者PSUBSCRIBE),取消訂閱(UNSUBSCRIBE或者PUNSUBSCRIBE), PING命令和結束連接(QUIT)外, 不能執行其他操作,客戶端將阻塞直到訂閱通道上發佈消息的到來.
  • 發佈的消息在Redis系統中不存儲.因此,必須先執行訂閱,再等待消息發佈. 但是,相反的順序則不支持.
  • 訂閱的通道名稱支持glob模式匹配.如果客戶端同時訂閱了glob模式的通道和非glob模式的通道,並且名稱存在交集,則對於一個發佈的消息,該執行訂閱的客戶端接收到兩個消息.

頻道訂閱

例如,使用SUBSCRIBE訂閱 foo 和bar 頻道(channel

SUBSCRIBE foo bar

當其他client將消息發送到channel後,Redis會將這些消息推送給該channel的所有訂閱者。

需要注意的是,在訂閱模式下,redis-cli將不接受任何命令,並且只能使用Ctrl-C退出該模式。

消息的格式

message是一個3個元素構成的數組。消息種類有3種類:subscribe, unsubscribe, message

  1. subscribe消息。表示訂閱成功的反饋信息。數組中第一個值就是"subscribe",第二個值是訂閱成功的頻道名,第三個值是當前客戶端訂閱的頻道數。如下圖
    消息種類  訂閱的頻道數

  2. unsubscribe消息。表示成功取消訂閱某個頻道。數組中第一個值就是"unsubscribe",第二個值是取消訂閱成功的頻道名,第三個值是當前客戶端訂閱的頻道數。當訂閱頻道數爲0時,客戶端會退出訂閱狀態,之後就可以執行其他非"發佈/訂閱"模式的命令了。

  3. message消息。表示接收到的消息。數組中第一個值就是"message",第二個值是產生消息的頻道名,第三個值是消息的內容。

模式匹配訂閱

PSUBSCRIBE
PUNSUBSCRIBE

例如:

# 訂閱所有new.的頻道
psubscribe new.*
# 取消訂閱所有new.的頻道
punsubscribe new.*

PSUBSCRIBEPUNSUBSCRIBE消息的格式和subscribeunsubscribe消息的格式是類似的,只是第一個值變爲psubscribepunsubscribe

pmessage消息的格式,第一個值是"pmessage",第二個值是匹配的原始模式,第三個值是頻道名,第四個值是消息內容。

同時符合模式和頻道訂閱的消息

如果client 通過模式訂閱和頻道訂閱 訂閱了同一個頻道,那麼同一條消息會收到多次。如下,兩個方式都訂閱了foo頻道,則foo頻道的同一個消息該client會收到兩次。

SUBSCRIBE foo
PSUBSCRIBE f*

模式匹配的訂閱計數的意義

實際上,該數字是客戶端仍訂閱的頻道和模式的總數。 因此,僅當由於取消訂閱所有頻道和模式而導致計數降至零時,客戶端纔會退出發佈/訂閱狀態。

參考文獻

[1] Redis 官方文檔
[2] 深入理解Redis的發佈/訂閱機制(pub/sub)
[3] redis實現消息隊列&發佈/訂閱模式使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章