1. 程式人生 > >Redis 發布訂閱

Redis 發布訂閱

輸出 通過 沒有 channels bsp ron gre mman 不同的

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

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

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

技術分享

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

技術分享

Redis 發布訂閱命令

下表列出了 redis 發布訂閱常用命令:

序號命令及描述
1 PSUBSCRIBE pattern [pattern ...]
訂閱一個或多個符合給定模式的頻道。
2 PUBSUB subcommand [argument [argument ...]]
查看訂閱與發布系統狀態。
3 PUBLISH channel message
將信息發送到指定的頻道。
4 PUNSUBSCRIBE [pattern [pattern ...]]
退訂所有給定模式的頻道。
5 SUBSCRIBE channel [channel ...]
訂閱給定的一個或多個頻道的信息。
6 UNSUBSCRIBE [channel [channel ...]]
指退訂給定的頻道。

實例

以下實例演示了發布訂閱是如何工作的。在我們實例中我們創建了訂閱頻道名為 redisChat:redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

現在,我們先重新開啟個 redis 客戶端,然後在同一個頻道 redisChat 發布兩次消息,訂閱者就能接收到消息。
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1

redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer) 1

# 訂閱者的客戶端會顯示如下消息
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"

發布訂閱命令說明

1.PSUBSCRIBE(訂閱一個或多個符合給定模式的頻道)
PSUBSCRIBE pattern [pattern …]
訂閱一個或多個符合給定模式的頻道。
每個模式以* 作為匹配符,比如it* 匹配所有以it 開頭的頻道( it.news 、it.blog 、it.tweets 等等),
news.* 匹配所有以news. 開頭的頻道( news.it 、news.global.today 等等),諸如此類。
可用版本: >= 2.0.0
時間復雜度: O(N),N 是訂閱的模式的數量。
返回值: 接收到的信息(請參見下面的代碼說明)。
redis> psubscribe news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe" # 返回值的類型:顯示訂閱成功
2) "news.*" # 訂閱的模式
3) (integer) 1 # 目前已訂閱的模式的數量

1) "pmessage" # 返回值的類型:信息
2) "news.*" # 信息匹配的模式
3) "news.it" # 信息本身的目標頻道
4) "Google buy Motorola" # 信息的內容

2.PUBLISH(將信息message 發送到指定的頻道channel )


PUBLISH channel message
將信息message 發送到指定的頻道channel 。
可用版本: >= 2.0.0
時間復雜度: O(N+M),其中N 是頻道channel 的訂閱者數量,而M 則是使用模式訂閱(subscribed
patterns) 的客戶端的數量。
返回值: 接收到信息message 的訂閱者數量。

# 對沒有訂閱者的頻道發送信息
redis> publish bad_channel "can any body hear me?"
(integer) 0
# 向有一個訂閱者的頻道發送信息
redis> publish msg "good morning"
(integer) 1
# 向有多個訂閱者的頻道發送信息
redis> publish chat_room "hello~ everyone"
(integer) 3

3.PUBSUB(是一個查看訂閱與發布系統狀態的內省命令)
3.1.PUBSUB [argument [argument …]]
PUBSUB 是一個查看訂閱與發布系統狀態的內省命令,它由數個不同格式的子命令組成,以下將分別對這
些子命令進行介紹。
可用版本: >= 2.8.0
PUBSUB CHANNELS [pattern] (列出當前的活躍頻道)

列出當前的活躍頻道。
活躍頻道指的是那些至少有一個訂閱者的頻道,訂閱模式的客戶端不計算在內。
pattern 參數是可選的:
? 如果不給出pattern 參數,那麽列出訂閱與發布系統中的所有活躍頻道。
? 如果給出pattern 參數,那麽只列出和給定模式pattern 相匹配的那些活躍頻道。
復雜度: O(N) ,N 為活躍頻道的數量(對於長度較短的頻道和模式來說,將進行模式匹配的復雜度視為常
數)。
返回值: 一個由活躍頻道組成的列表。
# client-1 訂閱news.it 和news.sport 兩個頻道
client-1> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.sport"
3) (integer) 2
# client-2 訂閱news.it 和news.internet 兩個頻道
client-2> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.internet"
3) (integer) 2
# 首先, client-3 打印所有活躍頻道
# 註意,即使一個頻道有多個訂閱者,它也只輸出一次,比如news.it
client-3> PUBSUB CHANNELS
1) "news.sport"
2) "news.internet"
3) "news.it"
# 接下來, client-3 打印那些與模式news.i* 相匹配的活躍頻道
# 因為news.sport 不匹配news.i* ,所以它沒有被打印
redis> PUBSUB CHANNELS news.i*
1) "news.internet"
2) "news.it"

3.2.PUBSUB NUMSUB [channel-1 … channel-N] (返回給定頻道的訂閱者數量)
返回給定頻道的訂閱者數量,訂閱模式的客戶端不計算在內。
復雜度: O(N) ,N 為給定頻道的數量。
返回值: 一個多條批量回復( Multi-bulk reply),回復中包含給定的頻道,以及頻道的訂閱者數量。格式為:頻道 channel-1 ,channel-1 的訂閱者數量,頻道 channel-2 ,channel-2 的訂閱者數量,諸如此類。
回復中頻道的排列順序和執行命令時給定頻道的排列順序一致。不給定任何頻道而直接調用這個命令也是可以的,在這種情況下,命令只返回一個空列表。
# client-1 訂閱 news.it 和 news.sport 兩個頻道
client-1> SUBSCRIBE news.it news.sport
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.sport"
3) (integer) 2
# client-2 訂閱 news.it 和 news.internet 兩個頻道
client-2> SUBSCRIBE news.it news.internet
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news.it"
3) (integer) 1
1) "subscribe"
2) "news.internet"
3) (integer) 2
# client-3 打印各個頻道的訂閱者數量
client-3> PUBSUB NUMSUB news.it news.internet news.sport news.music
1) "news.it" # 頻道
2) "2" # 訂閱該頻道的客戶端數量
3) "news.internet"
4) "1"
5) "news.sport"
6) "1"
7) "news.music" # 沒有任何訂閱者
8) "0"

3.3.PUBSUB NUMPAT (返回訂閱模式的數量)
註意,這個命令返回的不是訂閱模式的客戶端的數量,而是客戶端訂閱的所有模式的數量總和。
復雜度: O(1) 。
返回值: 一個整數回復( Integer reply)。
# client-1 訂閱 news.* 和 discount.* 兩個模式
client-1> PSUBSCRIBE news.* discount.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "psubscribe"
2) "discount.*"
3) (integer) 2
# client-2 訂閱 tweet.* 一個模式
client-2> PSUBSCRIBE tweet.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "tweet.*"
3) (integer) 1
# client-3 返回當前訂閱模式的數量為 3
client-3> PUBSUB NUMPAT
(integer) 3
# 註意,當有多個客戶端訂閱相同的模式時,相同的訂閱也被計算在 PUBSUB NUMPAT 之內
# 比如說,再新建一個客戶端 client-4 ,讓它也訂閱 news.* 頻道
client-4> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
# 這時再計算被訂閱模式的數量,就會得到數量為 4
client-3> PUBSUB NUMPAT
(integer) 4

4.PUNSUBSCRIBE (指示客戶端退訂所有給定模式)
PUNSUBSCRIBE [pattern [pattern …]]
指示客戶端退訂所有給定模式。
如果沒有模式被指定,也即是,一個無參數的 PUNSUBSCRIBE 調用被執行,那麽客戶端使用PSUBSCRIBE
命令訂閱的所有模式都會被退訂。在這種情況下,命令會返回一個信息,告知客戶端所有被退訂的模式。
可用版本: >= 2.0.0
時間復雜度: O(N+M) ,其中 N 是客戶端已訂閱的模式的數量,M 則是系統中所有客戶端訂閱的模式的數量。
返回值: 這個命令在不同的客戶端中有不同的表現。

5.SUBSCRIBE (訂閱給定的一個或多個頻道的信息)
訂閱給定的一個或多個頻道的信息。
可用版本: >= 2.0.0
時間復雜度: O(N),其中 N 是訂閱的頻道的數量。
返回值: 接收到的信息 (請參見下面的代碼說明)。

# 訂閱 msg 和 chat_room 兩個頻道
# 1 - 6 行是執行 subscribe 之後的反饋信息
# 第 7 - 9 行才是接收到的第一條信息
# 第 10 - 12 行是第二條
redis> subscribe msg chat_room
Reading messages... (press Ctrl-C to quit)
1) "subscribe" # 返回值的類型:顯示訂閱成功
2) "msg" # 訂閱的頻道名字
3) (integer) 1 # 目前已訂閱的頻道數量
1) "subscribe"
2) "chat_room"
3) (integer) 2
1) "message" # 返回值的類型:信息
2) "msg" # 來源 (從那個頻道發送過來)
3) "hello moto" # 信息內容
1) "message"
2) "chat_room"
3) "testing...haha"

6.UNSUBSCRIBE (指示客戶端退訂給定的頻道)
UNSUBSCRIBE [channel [channel …]]
指示客戶端退訂給定的頻道。
如果沒有頻道被指定,也即是,一個無參數的 UNSUBSCRIBE 調用被執行,那麽客戶端使用SUBSCRIBE 命令訂閱的所有頻道都會被退訂。在這種情況下,命令會返回一個信息,告知客戶端所有被退訂的頻道。
可用版本: >= 2.0.0
時間復雜度: O(N) ,N 是客戶端已訂閱的頻道的數量。
返回值: 這個命令在不同的客戶端中有不同的表現。


Redis 發布訂閱