Redis 發布與訂閱
參考:黃健宏 著. Redis設計與實現 (數據庫技術叢書) . 機械工業出版社. Kindle 版本.
Redis的發布與訂閱功能由 PUBLISH、 SUBSCRIBE、 PSUBSCRIBE 等命令組成。 通過執行 SUBSCRIBE 命令, 客戶端可以訂閱一個或多個頻道, 從而成為這些頻道的訂閱者( subscriber)
除了訂閱頻道之外, 客戶端還可以通過執行 PSUBSCRIBE 命令訂閱一個或多個模式, 從而成為這些模式的訂閱者.
一、頻道的訂閱與退訂
Redis 將所有頻道的訂閱關系都保存在服務器狀態的 pubsub_ channels 字典裏面, 這個字典的鍵是某個被訂閱的頻道, 而鍵的值則是一個鏈表, 鏈表裏面記錄了所有訂閱這個頻道的客戶端:
訂閱頻道: SUBSCRIBE "example.sport"
退訂頻道: UNSUBSCRIBE "example.sport"
二、模式的訂閱與退訂
與頻道的訂閱類似, 服務器將所有模式的訂閱關系都保存在服務器狀態的 pubsub_ patterns 屬性裏面:
模式訂閱: PSUBSCRIBE “example.*”
模式退訂: PUNSUBSCRIBE "example.*"
三、發送消息
當一個 Redis 客戶端執行 PUBLISH< channel>< message> 命令將消息 message 發送給頻道 channel 的時候, 服務器需要執行以下兩個動作:
1) 將消息 message 發送給 channel 頻道的所有訂閱者。
2) 如果有一個或多個模式 pattern 與頻道 channel 相匹配, 那麽將消息 message 發送給 pattern 模式的訂閱者。
PUBLISH 命令通過訪問 pubsub_ channels 字典來向頻道的所有訂閱者發送消息, 通過訪問 pubsub_ patterns 鏈表來向所有匹配頻道的模式的訂閱者發送消息。
四、查看訂閱信息
PUBSUB 命令是 Redis 2. 8 新增加的命令之一, 客戶端可以通過這個命令來查看頻道或者模式的相關信息, 比如某個頻道目前有多少訂閱者, 又或者某個模式目前有多少訂閱者, 諸如此類。
PUBSUB subcommand [argument [argument ...]]
1. PUBSUB CHANNELS [pattern]
當沒有 pattern 參數時,返回當前服務器被訂閱的所有頻道。
如果給定 pattern 參數,返回服務器當前被訂閱的頻道中那些與 pattern 模式相匹配的頻道。ex: PUBSUB CHANNELS "news.*" | PUBSUB CHANNELS "news.[ie]t"
2. PUBSUB NUMSUB[ channel- 1 channel- 2... channel- n]
該子命令接受任意多個頻道作為輸入參數, 並返回這些頻道的訂閱者數量。
3. PUBSUB NUMPAT
該子命令用於返回服務器當前被訂閱模式的數量。
PUBSUB 命令的三個子命令都是通過讀取 pubsub_ channels 字典和 pubsub_ patterns 鏈表中的信息來實現的。
Redis 發布與訂閱