天天看點

redis釋出訂閱模式詳解

文章目錄

  • ​​寫在前面​​
  • ​​釋出訂閱的使用​​
  • ​​SUBSCRIBE指令​​
  • ​​PUBLISH指令​​
  • ​​注意釋出、訂閱用戶端啟動順序!​​
  • ​​PUBSUB指令​​
  • ​​PUNSUBSCRIBE指令​​
  • ​​UNSUBSCRIBE指令​​
  • ​​PSUBSCRIBE指令​​
  • ​​總結​​

寫在前面

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

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

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

redis釋出訂閱模式詳解

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

redis釋出訂閱模式詳解

釋出訂閱的使用

SUBSCRIBE指令

監聽釋出到給定通道的消息。

基本文法:

SUBSCRIBE channel [channel ...]      

可以同時監聽多個channel通道。

基本用法:

# 開啟監聽channeltest
127.0.0.1:6379> subscribe channeltest
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channeltest"
3) (integer) 1      

PUBLISH指令

将消息釋出到一個通道。

基本文法:

PUBLISH channel message      

基本用法:

# 新起一個用戶端,往channeltest發送指定的消息
127.0.0.1:6379> publish channeltest 'i am message'
(integer) 1      

此時,我們在剛開始的用戶端,會受到發送過來的訂閱消息:

127.0.0.1:6379> subscribe channeltest
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channeltest"
3) (integer) 1
1) "message"
2) "channeltest"
3) "i am message"      

注意釋出、訂閱用戶端啟動順序!

當先啟動訂閱用戶端,再啟動釋出用戶端,然後釋出用戶端釋出的消息,訂閱用戶端會正常受到。

但是!當先啟動釋出用戶端,然後釋出用戶端釋出的消息,再啟動訂閱用戶端,訂閱用戶端是不會受到消息的!此時消息會丢失。

# 訂閱用戶端還未訂閱時,直接發送消息,此時傳回值是0,消息并沒有被消費也不會被儲存!
127.0.0.1:6379> publish channeltest 'i am message'
(integer) 0      

PUBSUB指令

檢查釋出/訂閱子系統的狀态。

基本文法:

PUBSUB subcommand [argument [argument ...]]      

基本用法:

# 顯示所有的訂閱通道
127.0.0.1:6379> pubsub channels
1) "channeltest"
# 顯示所有cc開頭的訂閱通道
127.0.0.1:6379> pubsub channels cc*
(empty list or set)
# 顯示所有ch開頭的訂閱通道
127.0.0.1:6379> pubsub channels ch*
1) "channeltest"      

PUNSUBSCRIBE指令

停止監聽釋出到比對給定模式的通道的消息。

基本文法:

PUNSUBSCRIBE [pattern [pattern ...]]      

基本用法:

# 停止訂閱channeltest通道
127.0.0.1:6379>      

注意:用戶端訂閱時,是無法進行操作的,此指令在指令行中是不能用的

UNSUBSCRIBE指令

退訂給定的頻道。

基本文法:

UNSUBSCRIBE [channel [channel ...]]      

基本用法:

# 退訂
127.0.0.1:6379>      

注意:用戶端訂閱時,是無法進行操作的,此指令在指令行中是不能用的

PSUBSCRIBE指令

監聽釋出到比對給定模式的通道的消息。

基本文法:

PSUBSCRIBE pattern [pattern ...]      

基本用法:

# 監聽chann開頭的所有通道
127.0.0.1:6379> psubscribe chann*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "chann*"
3) (integer) 1      

總結

繼續閱讀