Redis設計與實現:第十八章 - 發佈與訂閱

參考:《Redis設計與實現》

1、頻道的訂閱與退訂

1、訂閱頻道

       客戶端通過執行SUBSCRIBE命令進行訂閱某個頻道的時候,服務器把訂閱信息(客戶端和被訂閱頻道)存儲在pubsub_channels字典中進行關聯。

  • 如果頻道已經有其他的訂閱者了,那麼在pubsub_channels中必定有對應的訂閱者鏈表,程序只需要將本次的訂閱者添加到訂閱者鏈表的末尾即可。
  • 如果該頻道尚未有訂閱者,程序會在pubsub_channels中創建一個鍵值,並將這個鍵值設置爲空鏈表,然後把對應的客戶端添加到鏈表。

2、退訂頻道

       客戶端通過UNSUBSCRIBE命令進行退訂,服務器會從pubsub_channels中解除客戶端與服務端之間的關聯:

  • 在pubsub_channels中查找到對應頻道的訂閱者鏈表,從鏈表中刪除對應的客戶端信息
  • 如果頻道的訂閱者鏈表變成空鏈表,程序會從字典中刪除頻道對應的鍵。
           

2、模式的訂閱與退訂

1、模式的訂閱

       服務器把所有模式的訂閱關係存儲在服務器狀態的pubsub_patterns的鏈表中。
客戶端執行PSUBSCRIBE命令訂閱某個模式的時候,服務器會對每個訂閱的模式執行兩個操作:

  • 新建一個pubsubPattern結構,將結構的pattern屬性設置爲訂閱的模式,client屬性設置爲訂閱模式的客戶端。
  • pubsubPattern結構添加到pubsub_patterns鏈表的表尾。

2、模式的退訂

       客戶端通過PUNSUBSCRIBE命令進行模式的退訂,服務器將在pubsub_patterns鏈表中查找並刪除pattern屬性爲退訂模式,並且client屬性爲執行退訂命令的客戶端的pubsubPattern結構。
       

3、發送消息

客戶端執行PUBLISH 命令將消息發送給channel,主要處理兩個操作:

  • 將消息發送給channel的訂閱者
  • 如果有一個或者多個模式與頻道相匹配,那麼將消息發送給pattern模式的訂閱者

1、將消息發給頻道訂閱者

       服務器從pubsub_channels字典中找到channel的訂閱者名單,然後把消息發送給所有訂閱者

2、將消息發給模式訂閱者

       服務器從pubsub_patterns鏈表中查找所有與頻道相匹配的訂閱者,並將消息發送給這些訂閱者。
       

4、查看訂閱信息

1、服務器被訂閱頻道

       通過PUBSUB CHANNELS [pattern]命令返回服務器當前被訂閱的頻道,如果不給定pattern參數,命令返回被訂閱的所有頻道,給定pattern則返回與pattern模式相匹配的頻道。
這個命令是通過遍歷服務器的pubsub_channels字典的所有鍵,記錄返回所有符合條件的頻道的實現。並且pattern參數支持具體的頻道名或者模式名。
       

2、對應頻道的訂閱數量

       通過PUBSUB NUMBER [channel-1 channel-2 channel-3] 子命令接受多個頻道作爲輸入參數,並返回這些頻道的訂閱者數量。

       這個子命令通過在pubsub_channels字典中查找頻道對應的訂閱者鏈表,然後返回訂閱者鏈表的長度來實現。
       

3、服務器當前被訂閱模式的數量

       服務器通過PUBSUB NUMPAT子命令實現,通過返回pubsub_patterns鏈表的長度來實現,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章