Redis發布與訂閱命令和原理

2022-08-02 19:30:19 字數 3047 閱讀 6463

本篇部落格是對《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...