Redis元件介紹(六)

ikestu小猪發表於2024-09-03

寫在前面

今天學習redis最後的知識。

Redis 的釋出與訂閱

釋出/訂閱模式

Redis 提供了兩種釋出/訂閱模式:

  • 基於頻道 (Channel) 的釋出/訂閱
  • 基於模式 (Pattern) 的釋出/訂閱

相關命令

  1. 訂閱頻道

    subscribe channel [channel ...]
    

    訂閱給定的一個或多個頻道。

  2. 退訂頻道

    unsubscribe channel [channel ...]
    

    退訂給定的頻道。若沒有指定頻道,則預設退訂所有頻道。

  3. 釋出訊息

    publish channel message
    

    將訊息傳送給指定頻道 channel。返回結果:接收到資訊的訂閱者數量,無訂閱者返回 0。

  4. 檢視活躍頻道

    pubsub channels [argument [argument ...]]
    

    檢視訂閱與釋出系統的狀態。返回活躍頻道列表(即至少有一個訂閱者的頻道,訂閱模式的客戶端除外)。

  5. 按模式訂閱

    psubscribe pattern1 [pattern ...]
    

    訂閱一個或多個符合給定模式的頻道。每個模式以 * 作為匹配符;例如 shujia* 匹配所有以 shujia 開頭的頻道,如 shujia.javashujia.hadoop

  6. 按模式退訂

    punsubscribe [pattern [pattern ...]]
    

    退訂所有給定模式的頻道。若 pattern 未指定,則退訂所有模式;否則只退訂指定的模式。

訊息佇列

在 Redis 中,List 資料型別可以用於排隊資料,按照順序取出,但無法精確獲取(雙端佇列)。這種方式存在兩個侷限性:

  • 不能支援一對多的訊息分發。
  • 如果生產者生成的速度遠大於消費者的消費速度,易堆積大量未消費的訊息。

角色

  • 釋出者(Publisher):使用 PUBLISH 命令將訊息釋出到指定的頻道。
  • 訂閱者(Subscriber):使用 SUBSCRIBE 命令訂閱一個或多個頻道以接收訊息。所有訂閱同一頻道的訂閱者都會收到此訊息。
  • 頻道(Channel):頻道是訊息的通道,釋出者透過指定頻道來發布訊息,訂閱者透過訂閱頻道來接收相關訊息。
  • 訊息(Message):由釋出者傳送給訂閱者的資料。

注意

  1. 訂閱者使用 SUBSCRIBE 命令訂閱頻道後,將會一直等待新訊息。可以使用 UNSUBSCRIBE 命令取消訂閱。
  2. Redis 的釋出訂閱模式不保證訊息的可靠傳遞。如果訂閱者在訊息釋出之前已斷開連線,則無法接收到已釋出的訊息。換句話說,如果先發布訊息,再訂閱頻道,不會收到訂閱之前就釋出到該頻道的訊息!
  3. 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 定位到字典的鍵,然後將資訊傳送給字典值連結串列中的所有客戶端。

相關文章