天天看點

Redis釋出訂閱

Redis釋出訂閱

Redis釋出訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。

Redis用戶端可以訂閱任意數量的頻道。

訂閱/釋出消息圖:

第一個:消息發送者

第二個:頻道

第三個:消息訂閱者!

Redis釋出訂閱

下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個用戶端 —— client2 、 client5 和 client1 之間的關系:

Redis釋出訂閱

當有新消息通過 PUBLISH 指令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個用戶端:

Redis釋出訂閱
指令

這些指令被廣泛用于建構即時通信應用,比如網絡聊天室(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字典中查找記錄了訂閱這個頻道的所有用戶端的連結清單,周遊這個連結清單,将消息釋出給所有訂閱者。

  • 實時消息系統!
  • 實時聊天!(頻道當作聊天室,将資訊回顯給所有人即可!)
  • 訂閱、關注系統都是可以的!

繼續閱讀