寫在前面
今天學習redis最後的知識。
Redis 的釋出與訂閱
釋出/訂閱模式
Redis 提供了兩種釋出/訂閱模式:
- 基於頻道 (Channel) 的釋出/訂閱
- 基於模式 (Pattern) 的釋出/訂閱
相關命令
-
訂閱頻道
subscribe channel [channel ...]
訂閱給定的一個或多個頻道。
-
退訂頻道
unsubscribe channel [channel ...]
退訂給定的頻道。若沒有指定頻道,則預設退訂所有頻道。
-
釋出訊息
publish channel message
將訊息傳送給指定頻道
channel
。返回結果:接收到資訊的訂閱者數量,無訂閱者返回 0。 -
檢視活躍頻道
pubsub channels [argument [argument ...]]
檢視訂閱與釋出系統的狀態。返回活躍頻道列表(即至少有一個訂閱者的頻道,訂閱模式的客戶端除外)。
-
按模式訂閱
psubscribe pattern1 [pattern ...]
訂閱一個或多個符合給定模式的頻道。每個模式以
*
作為匹配符;例如shujia*
匹配所有以shujia
開頭的頻道,如shujia.java
、shujia.hadoop
。 -
按模式退訂
punsubscribe [pattern [pattern ...]]
退訂所有給定模式的頻道。若
pattern
未指定,則退訂所有模式;否則只退訂指定的模式。
訊息佇列
在 Redis 中,List 資料型別可以用於排隊資料,按照順序取出,但無法精確獲取(雙端佇列)。這種方式存在兩個侷限性:
- 不能支援一對多的訊息分發。
- 如果生產者生成的速度遠大於消費者的消費速度,易堆積大量未消費的訊息。
角色
- 釋出者(Publisher):使用
PUBLISH
命令將訊息釋出到指定的頻道。 - 訂閱者(Subscriber):使用
SUBSCRIBE
命令訂閱一個或多個頻道以接收訊息。所有訂閱同一頻道的訂閱者都會收到此訊息。 - 頻道(Channel):頻道是訊息的通道,釋出者透過指定頻道來發布訊息,訂閱者透過訂閱頻道來接收相關訊息。
- 訊息(Message):由釋出者傳送給訂閱者的資料。
注意
- 訂閱者使用
SUBSCRIBE
命令訂閱頻道後,將會一直等待新訊息。可以使用UNSUBSCRIBE
命令取消訂閱。 - Redis 的釋出訂閱模式不保證訊息的可靠傳遞。如果訂閱者在訊息釋出之前已斷開連線,則無法接收到已釋出的訊息。換句話說,如果先發布訊息,再訂閱頻道,不會收到訂閱之前就釋出到該頻道的訊息!
- Redis 提供了其他相關命令和功能,如按模式訂閱 (
PSUBSCRIBE
)、取消訂閱 (UNSUBSCRIBE
) 等。可以查閱 Redis 文件以獲取更多資訊。
請注意:在高吞吐量和大規模釋出訂閱場景下,Redis 的釋出訂閱模式可能不是最佳選擇,可以考慮使用專門的訊息佇列系統來替代。
狀態解釋
localhost:7000> subscribe xiaohu1
Reading messages... (press Ctrl-C to quit)
1) "subscribe" # 返回值型別:表示訂閱成功!
2) "xiaohu1" # 訂閱頻道的名稱
3) (integer) 1 # 當前客戶端已訂閱頻道的數量
示意圖
- 頻道訂閱:訂閱頻道時先檢查欄位內部是否存在;不存在則為當前頻道建立一個字典,並建立一個連結串列儲存客戶端 ID;否則直接將客戶端 ID 插入到連結串列中。
- 取消頻道訂閱:取消時將客戶端 ID 從對應的連結串列中刪除;如果刪除之後連結串列為空,則將會把這個頻道從字典中刪除。
- 釋出:首先根據
channel
定位到字典的鍵,然後將資訊傳送給字典值連結串列中的所有客戶端。