天天看點

Redis - 釋出/訂閱

一、簡介

Redis 釋出訂閱(pub/sub)是一種 消息通信模式 :發送者(pub)發送消息,訂閱者(sub)接收消息。(比如:微信、 微網誌、關注系統!) 

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

訂閱/釋出消息圖:

第一個:消息發送者, 第二個:頻道 第三個:消息訂閱者!

Redis - 釋出/訂閱

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

Redis - 釋出/訂閱

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

Redis - 釋出/訂閱

二、指令

這些指令被廣泛用于建構即時通信應用,比如網絡聊天室(chatroom)和實時廣播、實時提醒等。

Redis - 釋出/訂閱

三、測試

訂閱端:

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,而其他頻道也分别被其他用戶端所訂閱:

Redis - 釋出/訂閱

當用戶端調用 SUBSCRIBE 指令是,程式就會将用戶端和要訂閱的頻道在 pubsub_channels 字典中關聯起來。

舉個例子,如果用戶端 client10086 執行指令 SUBSCRIBE channel1 channel2 channel3,那麼前面展示的 pubsub_channels 将變成下面這樣

Redis - 釋出/訂閱

五、使用場景

1、實時消息系統!

2、實時聊天!(頻道當做聊天室,将資訊回顯給所有人即可!)

3、訂閱,關注系統都是可以的! 稍微複雜的場景我們就會使用 消息中間件 MQ

👉 詳細了解:https://www.cnblogs.com/wmyskxz/p/12499532.html