概念介紹
Redis 發布訂閱 (pub/sub) 是一種消息通信模式,它允許客戶端之間進行異步的消息傳遞
Redis 客戶端可以訂閱任意數量的頻道。
模型中的角色
在該模型中,有三種角色:
-
發布者(Publisher):負責發送信息的客戶端,使用?
PUBLISH
?命令將消息發送到指定的頻道(channel)。PUBLISH channel message
發布者不關心是否有訂閱者正在監聽該頻道。
-
訂閱者(Subscriber):通過調用?
SUBSCRIBE
?或?PSUBSCRIBE
?命令來監聽一個或多個頻道的消息。SUBSCRIBE channel1 channel2 ... channelN PSUBSCRIBE pattern1 pattern2 ...
SUBSCRIBE
?用于訂閱特定頻道名稱。PSUBSCRIBE
?則用于訂閱滿足給定模式的頻道,例如通配符模式。
-
頻道(Channels):消息傳遞的通道,每個頻道都有自己的名稱,所有向這個頻道發布的信息都會被訂閱了該頻道的所有訂閱者接收到。
特性
- 發布訂閱是異步的單向通信機制,發布者與訂閱者之間沒有直接的連接。
- 訂閱者只能接收訂閱之后發布的消息,不能獲取歷史消息。
- Redis Pub/Sub 是一個簡單的消息隊列解決方案,但不適合需要持久化消息或者保證消息可靠傳遞的場景,因為如果訂閱者在消息發布期間斷開連接,則會丟失該消息。
因此,Redis 的發布訂閱功能適用于實時消息通知、事件驅動編程以及輕量級的消息隊列應用場景。
下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:
當有新消息通過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被發送給訂閱它的三個客戶端:
具體操作
1)訂閱頻道
開啟多個客戶端: redis-cli
訂閱一個頻道(創建和開啟頻道)
127.0.0.1:6379> subscribe WDZL
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "WDZL"
3) (integer) 1
##### 訂閱和開啟了一個頻道 WDZL
再開啟一個客戶端,執行上面相同的操作,訂閱同一個頻道
共計開啟2個以上客戶端。
2)查詢頻道
然后再在第三個客戶端去查詢活躍的頻道
PUBSUB CHANNELS # pubsub channels 為關鍵字
PUBSUB CHANNELS ch* # 名字匹配
PUBSUB NUMSUB ch2 # 打印訂閱ch2頻道的客戶端訂閱的所有模式的數量總和
查詢活躍的頻道
127.0.0.1:6379> pubsub channels
1) "BWL"
2) "WDZL"
查詢指定頻道的訂閱數量
127.0.0.1:6379> pubsub numsub BWL
1) "BWL"
2) (integer) 2
3)發布消息
發布訂閱消息: publish
127.0.0.1:6379> publish BWL Hello,Welcome!
(integer) 2
#### 顯示發布成功接收的數量
再到訂閱者客戶端查看是否收到消息
127.0.0.1:6379> subscribe BWL
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "BWL"
3) (integer) 1 # 客戶端一旦訂閱后,就會進入阻塞狀態,等待消息。不能做其他操作了
1) "message"
2) "BWL"
3) "Hello,Welcome!"