Redis釋出訂閱
Redis釋出訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis用戶端可以訂閱任意數量的頻道。
訂閱/釋出消息圖:
第一個:消息發送者
第二個:頻道
第三個:消息訂閱者!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwkzX39GZhh2csATMflHLwEzX4xSZz91ZsADMx8FdsYkRGZkRG9lcvx2bjxSa2EWNhJTW1AlUxEFeVRUUfRHelRHL2EzXlpXazxyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3PnVGcq5CZmRGNkhTOwgzN3UWMyIGZ2QjZlRjY0gjMmBTMldjN28CXwMzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.jpeg)
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個用戶端 —— client2 、 client5 和 client1 之間的關系:
當有新消息通過 PUBLISH 指令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個用戶端:
指令
這些指令被廣泛用于建構即時通信應用,比如網絡聊天室(chatroom)和實時廣播、實時提醒等。
測試
訂閱端:
127.0.0.1:6379> SUBSCRIBE kuangshenshuo # 訂閱一個頻道 kuangshenshuo
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "kuangshenshuo"
3) (integer) 1
# 等待讀取推送的資訊
1) "message" # 消息
2) "kuangshenshuo" # 來自哪個頻道
3) "hello,kuangshen" # 消息的具體内容
1) "message"
2) "kuangshenshuo"
3) "hello,redis"
發送端:
127.0.0.1:6379> PUBLISH kuangshenshuo hello,kuangshen # 釋出者釋出消息到頻道
(integer) 1
127.0.0.1:6379> PUBLISH kuangshenshuo hello,redis
(integer) 1
原理
Redis是使用C實作的,通過分析Redis源碼裡的pubsub.c檔案,了解釋出和訂閱機制的底層實作,借此加深對Redis 的了解。Redis通過PUBLISH、SUBSCRIBE和PSUBSCRIBE等指令實作釋出和訂閱功能。
通過SUBSCRIBE指令訂閱某頻道後,redis-server裡維護了一個字典,字典的鍵就是一個個channel,而字典的值則是一個連結清單,連結清單中儲存了所有訂閱這個channel的用戶端。SUBSCRIBE指令的關鍵,就是将用戶端添加到給定channel的訂閱連結清單中。
通過PUBLISH指令向訂閱者發送消息,redis-server會使用給定的頻道作為鍵,在它維護的channel字典中查找記錄了訂閱這個頻道的所有用戶端的連結清單,周遊這個連結清單,将消息釋出給所有訂閱者。
- 實時消息系統!
- 實時聊天!(頻道當作聊天室,将資訊回顯給所有人即可!)
- 訂閱、關注系統都是可以的!