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頻道相匹配的模式,并將訊息發送給訂閱了這些模式的客戶端
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145079.html
標籤:Java
