一、簡介
Redis 釋出訂閱(pub/sub)是一種 消息通信模式 :發送者(pub)發送消息,訂閱者(sub)接收消息。(比如:微信、 微網誌、關注系統!)
Redis 用戶端可以訂閱任意數量的頻道。
訂閱/釋出消息圖:
第一個:消息發送者, 第二個:頻道 第三個:消息訂閱者!
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYDM0EzMzcTN30CMxMjN1EjM2EjNxUDMwIDMy0SOyQzNyQTMvwVNwAjMwIzLcljM0cjM0EzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個用戶端 —— client2 、 client5 和 client1 之間的 關系:
當有新消息通過 PUBLISH 指令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個用戶端:
二、指令
這些指令被廣泛用于建構即時通信應用,比如網絡聊天室(chatroom)和實時廣播、實時提醒等。
三、測試
訂閱端:
127.0.0.1:6379> SUBSCRIBE cyan # 訂閱一個頻道 cyan
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cyan"
3) (integer) 1
# 等待讀取推送的資訊
1) "message" # 消息
2) "cyan" # 哪個頻道的消息
3) "hello,cyan" # 消息的具體内容
1) "message"
2) "cyan"
3) "hello,redis"
釋出端:
127.0.0.1:6379> PUBLISH cyan "hello,cyan" # 釋出者釋出消息到頻道!
(integer) 1
127.0.0.1:6379> PUBLISH cyan "hello,redis" # 釋出者釋出消息到頻道!
(integer) 1
127.0.0.1:6379>
四、Redis釋出訂閱機制的實作
每個 Redis 伺服器程序都維持着一個表示伺服器狀态的 redis.h/redisServer 結構,結構的 pubsub_channels 屬性是以個字典,這個字典就用于儲存訂閱頻道的資訊:
struct RedisService{
//...
dict *pubsub_channels;
//...
}
其中,字典的鍵為正在被訂閱的頻道,而字典的值則是一個連結清單,連結清單中儲存了所有訂閱這個頻道的用戶端。
比如說,在下圖展示的這個 pubsub_channels 示例中,client2、client5 和 client1 就訂閱了 client1,而其他頻道也分别被其他用戶端所訂閱:
當用戶端調用 SUBSCRIBE 指令是,程式就會将用戶端和要訂閱的頻道在 pubsub_channels 字典中關聯起來。
舉個例子,如果用戶端 client10086 執行指令 SUBSCRIBE channel1 channel2 channel3,那麼前面展示的 pubsub_channels 将變成下面這樣
五、使用場景
1、實時消息系統!
2、實時聊天!(頻道當做聊天室,将資訊回顯給所有人即可!)
3、訂閱,關注系統都是可以的! 稍微複雜的場景我們就會使用 消息中間件 MQ
👉 詳細了解:https://www.cnblogs.com/wmyskxz/p/12499532.html