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
。
-
subscribe
消息。表示訂閱成功的反饋信息。數組中第一個值就是"subscribe"
,第二個值是訂閱成功的頻道名,第三個值是當前客戶端訂閱的頻道數。如下圖
-
unsubscribe
消息。表示成功取消訂閱某個頻道。數組中第一個值就是"unsubscribe"
,第二個值是取消訂閱成功的頻道名,第三個值是當前客戶端訂閱的頻道數。當訂閱頻道數爲0時,客戶端會退出訂閱狀態,之後就可以執行其他非"發佈/訂閱"模式的命令了。 -
message
消息。表示接收到的消息。數組中第一個值就是"message"
,第二個值是產生消息的頻道名,第三個值是消息的內容。
模式匹配訂閱
PSUBSCRIBE
PUNSUBSCRIBE
例如:
# 訂閱所有new.的頻道
psubscribe new.*
# 取消訂閱所有new.的頻道
punsubscribe new.*
PSUBSCRIBE
, PUNSUBSCRIBE
消息的格式和subscribe
,unsubscribe
消息的格式是類似的,只是第一個值變爲psubscribe
和punsubscribe
。
pmessage
消息的格式,第一個值是"pmessage"
,第二個值是匹配的原始模式,第三個值是頻道名,第四個值是消息內容。
同時符合模式和頻道訂閱的消息
如果client 通過模式訂閱和頻道訂閱 訂閱了同一個頻道,那麼同一條消息會收到多次。如下,兩個方式都訂閱了foo頻道,則foo頻道的同一個消息該client會收到兩次。
SUBSCRIBE foo
PSUBSCRIBE f*
模式匹配的訂閱計數的意義
實際上,該數字是客戶端仍訂閱的頻道和模式的總數。 因此,僅當由於取消訂閱所有頻道和模式而導致計數降至零時,客戶端纔會退出發佈/訂閱狀態。
參考文獻
[1] Redis 官方文檔
[2] 深入理解Redis的發佈/訂閱機制(pub/sub)
[3] redis實現消息隊列&發佈/訂閱模式使用