1. 程式人生 > 實用技巧 >Redis的釋出和訂閱

Redis的釋出和訂閱

Redis的釋出和訂閱功能分為頻道訂閱模式訂閱兩種。每當有其他客戶端向被訂閱的頻道傳送訊息時,頻道的所有訂閱者都會收到這條訊息。

頻道訂閱

當一個客戶端執行SUBSCRIBE命令訂閱某個或某些頻道時,這個客戶端與被訂閱頻道之間就建立起了一種訂閱關係。

訂閱

每當客戶端執行SUBSCRIBE命令時,伺服器都會將客戶端與被訂閱的頻道在pubsub_channels字典中進行關聯。根據頻道是否已經其他訂閱者,關聯操作分兩種情況:

  1. 如果頻道已經有其他訂閱者,那麼它在pubsub_channels字典中必然有相應的訂閱者連結串列,程式唯一要做的就是將客戶端新增到訂閱者連結串列的末尾
  2. 如果頻道還未有任何訂閱者,程式首先在pubsub_channels
    字典中為頻道建立一個鍵,並將這個鍵的值設定為空連結串列,然後再將客戶端新增到連結串列
退訂

每當客戶端執行UNSUBSCRIBE命令時,伺服器將從pubsub_channels中解除訂閱關聯:

  1. 程式根據被退訂頻道的名字在pubsub_channels字典中找到頻道對應的訂閱者連結串列,然後從連結串列中刪除退訂客戶端資訊
  2. 如果刪除退訂客戶端之後,頻道的訂閱者連結串列變成空連結串列,程式將從pubsub_channels字典中刪除頻道對應的鍵

模式訂閱

伺服器將所有模式的訂閱關係都儲存在伺服器狀態的pubsub_patterns屬性裡面。

訂閱

每個客戶端執行PSUBSCRIBE命令訂閱某個或某些模式的時候,伺服器會對每個被訂閱的模式執行以下兩個操作:

  1. 新建一個pubsubPattern結構,將結構的pattern屬性設定為被訂閱的模式,client屬性設定為訂閱模式的客戶端
  2. pubsubPattern結構新增到pubsub_patterns連結串列的表尾
退訂

當一個客戶端退訂某個或某些模式的時候,伺服器將在連結串列pubsub_patterns中查詢並刪除那些pattern屬性為被訂閱模式,並且client屬性為執行退訂命令的客戶端的pubsubPattern結構

傳送訊息

當一個Redis客戶端執行PUBLISH <channel> <message>命令經訊息message傳送給頻道channel的時候,伺服器需要執行以下兩個動作:

  1. pubsub_channels字典中找到頻道channel的訂閱者名單,然後將訊息傳送給名單上的所有客戶端
  2. 遍歷整個pubsub_patterns連結串列,查詢那些與channel頻道相匹配的模式,並將訊息傳送給訂閱了這些模式的客戶端