參考:《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鏈表的長度來實現,