Redis的釋出和訂閱
阿新 • • 發佈:2020-07-12
Redis的釋出和訂閱功能分為頻道訂閱和模式訂閱兩種。每當有其他客戶端向被訂閱的頻道傳送訊息時,頻道的所有訂閱者都會收到這條訊息。
頻道訂閱
當一個客戶端執行SUBSCRIBE命令訂閱某個或某些頻道時,這個客戶端與被訂閱頻道之間就建立起了一種訂閱關係。
訂閱
每當客戶端執行SUBSCRIBE命令時,伺服器都會將客戶端與被訂閱的頻道在pubsub_channels
字典中進行關聯。根據頻道是否已經其他訂閱者,關聯操作分兩種情況:
- 如果頻道已經有其他訂閱者,那麼它在
pubsub_channels
字典中必然有相應的訂閱者連結串列,程式唯一要做的就是將客戶端新增到訂閱者連結串列的末尾 - 如果頻道還未有任何訂閱者,程式首先在
pubsub_channels
退訂
每當客戶端執行UNSUBSCRIBE命令時,伺服器將從pubsub_channels
中解除訂閱關聯:
- 程式根據被退訂頻道的名字在
pubsub_channels
字典中找到頻道對應的訂閱者連結串列,然後從連結串列中刪除退訂客戶端資訊 - 如果刪除退訂客戶端之後,頻道的訂閱者連結串列變成空連結串列,程式將從
pubsub_channels
字典中刪除頻道對應的鍵
模式訂閱
伺服器將所有模式的訂閱關係都儲存在伺服器狀態的pubsub_patterns
屬性裡面。
訂閱
每個客戶端執行PSUBSCRIBE命令訂閱某個或某些模式的時候,伺服器會對每個被訂閱的模式執行以下兩個操作:
- 新建一個
pubsubPattern
結構,將結構的pattern
屬性設定為被訂閱的模式,client
屬性設定為訂閱模式的客戶端 - 將
pubsubPattern
結構新增到pubsub_patterns
連結串列的表尾
退訂
當一個客戶端退訂某個或某些模式的時候,伺服器將在連結串列pubsub_patterns
中查詢並刪除那些pattern
屬性為被訂閱模式,並且client
屬性為執行退訂命令的客戶端的pubsubPattern
結構
傳送訊息
當一個Redis客戶端執行PUBLISH <channel> <message>
命令經訊息message傳送給頻道channel的時候,伺服器需要執行以下兩個動作:
- 在
pubsub_channels
字典中找到頻道channel
的訂閱者名單,然後將訊息傳送給名單上的所有客戶端 - 遍歷整個
pubsub_patterns
連結串列,查詢那些與channel
頻道相匹配的模式,並將訊息傳送給訂閱了這些模式的客戶端