本篇部落格是對《redis設計與實現》的學習總結訂閱日期:2020-12-11
redis版本:3.0.6
subscribe channel [channel ...]
訂閱乙個或多個頻道,返回訂閱的頻道數
發布
publish channel message
向乙個頻道發布訊息,返回向多少個客戶端傳送了訊息
按照模式訂閱
psubscribe pattern [pattern ...]
如果 publish 命令傳送的頻道和訂閱的模式成功匹配,那麼客戶端就會接收到發布的訊息
檢視頻道
pubsub channels [pattern]
返回有客戶端訂閱的頻道,是用 pattern 引數,只返回與模式匹配的有客戶端訂閱的頻道
檢視頻道的訂閱數
pubsub numsub [channel ...]
返回頻道和其訂閱數
檢視模式的訂閱數
pubsub numpat
redis將訂閱關係儲存在乙個字典裡面(redis的字典是用雜湊表實現的,基本可以認為字典就是雜湊表),其中鍵是字串型別就是頻道名,值是乙個鍊錶存著所有訂閱了該頻道的客戶端指標。
圖一如上圖所示,有三個頻道:aaa,bbb和ccc。其中client-1訂閱了全部三個頻道,client-2訂閱了 aaa 和 bbb,client-3訂閱了 aaa。其中客戶端指標指向客戶端狀態結構,這個結構中儲存著套接字描述符以及各種其他資訊,redis可以通過此結構提供的資訊向客戶端傳送資料。
頻道訂閱
當訂閱乙個頻道的時候,只需要將客戶端指標新增到該頻道對應的鍊錶的末尾即可,如果該頻道還不是字典的鍵,那麼建立鍵和對應的鍊錶,並將客戶端指標新增到鍊錶末尾。比如,client-3 執行了subscribe ccc
,那麼字典結構將如下圖所示:
圖二退訂頻道
當乙個客戶端使用 unsubscribe 命令時,就會將客戶端指標從要退訂的頻道對應的列表中刪除。比如,在圖二基礎上,client-3 執行unsubscribe ccc
,那麼字典結構將由圖二變為圖一。如果將客戶端指標刪去後,頻道對應的列表為空了,那麼也會將頻道刪去。比如,在圖一基礎上,client-1 執行unsubscribe ccc
,那麼字典結構將如下圖所示:
圖三檢視頻道
當執行pubsub channels
時,只需要遍歷字典的所有鍵,將其返回即可。如果給了模式引數,只需要將與模式匹配的鍵返回即可。如果對圖一結構的字典,使用pubsub channels
命令,返回值將是:
1) "aaa"
2) "bbb"
3) "ccc"
檢視頻道的訂閱數
當執行pubsub numsub [channel ...]
命令時,只需要返回頻道對應的列表的長度即可,如果鍵值不存在返回0即可,如果對圖一結構的字典,使用pubsub numsub aaa
,返回值將是:
1) "aaa"
2) (integer) 3
訂閱模式
訂閱模式和客戶端的關係存在乙個鍊錶中,每乙個節點都會儲存模式字串和客戶端指標,鍊錶結構如下圖所示:
圖四如果此時 client-4 執行```psubscribe c*```,那麼鍊錶結構將如下圖所示:
圖五模式退訂
當執行punsubscribe pattern
命令時,就會將鍊錶中模式和客戶端指標都對應相等的節點刪去,比如,client-3 執行punsubscribe b*
,那麼鍊錶結構將如下圖所示:
圖六發布資訊
在發布資訊的時候,需要分別將資訊傳送給訂閱頻道的客戶端和訂閱模式的客戶端。
因為使用 redis-cli 在執行 subscribe 或者 psubscribe 命令之後,就只能接收資訊而不能執行命令了,要退出也只能用 ctrl + c。但是使用 linux 的 nc 命令連線 redis,執行 subscribe 和 psubscribe 後仍然可以執行訂閱和退訂命令
root@muyu:~# nc 127.0.0.1 6379
subscribe aaa
*3$9
subscribe
$3aaa
:1 # 這裡的數字就是當前訂閱的頻道數量
# 上面是對 subscribe 命令的返回資訊,是原始的格式
get a
-err only (p)subscribe / (p)unsubscribe / ping / quit allowed in this context
# 執行退訂命令
unsubscribe aaa
*3$11
unsubscribe
$3aaa
:0 # 退訂後當前訂閱的頻道數量變成了0
Redis訂閱與發布原理
記錄下來以後方便回憶,需要時隨時翻閱 redis 訂閱與發布 原理 client pubsub channels是客戶端維護的乙個以dict結構的維護的訂閱頻道雜湊表,val是null,不需要值。server pubsub channels是服務端維護的乙個以dict結構的維護的訂閱頻道雜湊表,va...
Redis 發布與訂閱 命令
該筆記記錄redis 發布與訂閱的命令。1.publish 可用版本 2.0.0 時間複雜度 o n m 其中 n 是頻道 channel 的訂閱者數量,而 m 則是使用模式訂閱 subscribed patterns 的客戶端的數量。命令格式 publish channel message 作用 ...
redis 發布與訂閱原理分析
一 訂閱頻道和資訊發布 功能說明 redis 的 subscribe 命令可以讓客戶端訂閱任意數量的頻道,每當有新資訊傳送到被訂閱的頻道時,資訊就會被傳送給所有訂閱指定頻道的客戶端。訂閱例子示意圖 下圖展示了頻道 channel1 以及訂閱這個頻道的三個客戶端 client2 client5 和 c...