發佈與訂閱
Redis的發佈與訂閱功能可以讓客戶端通過廣播方式,將消息同時發送給可能存在的多個客戶端,並且發送消息的客戶端不需要指定接收消息的客戶端的具體信息,也就是說發送消息的客戶端與接收消息的客戶端沒有直接的聯繫。
在Redis中,客戶端可以通過訂閱特定的頻道(channel)來接收發送至該頻道的消息,我們把這些訂閱頻道的客戶端稱爲訂閱者(subscriber),把發送消息給頻道的客戶端稱爲發送者(publisher)。一個頻道可以有多個訂閱者,而一個訂閱者也可以訂閱多個頻道。
命令速查表
命令 | 用法及參數 | 說明 |
---|---|---|
PUBLISH | PUBLISH channel message |
將一條消息發送給特定頻道 |
SUBSCRIBE | SUBSCRIBE channel [channel channel ... ] |
訂閱一個或多個頻道 |
UBSUBSCRIBE | UNSUBSCRIBE [channel channel ... ] |
退訂指定的頻道,如果未指定頻道,則退訂當前客戶端訂閱的所有頻道 |
PSUBSCRIBE | PSUBSCRIBE pattern [pattern pattern ... ] |
訂閱一個或多個模式 |
PUNSUBSCRIBE | PUNSUBSCRIBE [pattern pattern ... ] |
退訂一個或多個模式 |
PUBSUB CHANNELS | PUBSUB CHANNELS [pattern] |
查看目前被訂閱的頻道 |
PUBSUB NUMSUB | PUBSUB NUMSUB [channel channel ... ] |
查看任意多個給定頻道的訂閱者數量 |
PUBSUB NUMPAT | PUBSUB NUMPAT |
查看目前被訂閱模式的數量 |
命令詳解
PUBLISH:向頻道發送消息
使用PUBLISH命令,將一條消息發送給特定頻道:
PUBLISH channel message
PUBLISH命令會返回接受到消息的客戶端的數量作爲返回值。
127.0.0.1:6379> PUBLISH "test" "hello world"
(integer) 3
複雜度:,其中爲給定頻道的訂閱者數量,而爲服務器目前被訂閱的模式總數量。
版本要求:Redis 2.0.0版本開始可用。
SUBSCRIBE:訂閱頻道
通過執行SUBSCRIBE命令,可以讓客戶端訂閱給定的一個或多個頻道:
SUBSCRIBE channel [channel channel ... ]
SUBCRIBE命令在每次成功訂閱一個頻道之後,都會向執行命令的客戶端返回一條訂閱消息,消息包含了被成功訂閱的頻道以及客戶端目前已訂閱的頻道數量。
127.0.0.1:6379> subscribe "test"
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
- 消息的第一個元素是 “subscribe” 表示這是由 SUBSCRIBE 命令引發的訂閱消息而不是普通客戶端發送的頻道消息。
- 消息的第二個元素記錄了被訂閱頻道的名字 “test”
- 消息的最後一個元素是數字 1,表示客戶端目前只訂閱了一個頻道
接受頻道消息
與訂閱消息一樣,頻道消息也是由3個元素組成的:
- 消息的第1個元素爲 message ,用於表明該消息是一條頻道消息而不是非訂閱消息;
- 消息的第2個元素爲消息的來源頻道,用於表明該消息來源於哪個頻道;
- 消息的第3個元素爲消息的正文,也就是消息的內容;
127.0.0.1:6379> publish "test" "hello world"
(integer) 1
1) "message"
2) "test"
3) "hello world"
複雜度:,其中爲用戶輸入的消息數量。
版本要求:Redis 2.0.0版本開始可用。
UBSUBSCRIBE:退訂頻道
用戶在使用SUBSCRIBE命令訂閱一個或多個頻道之後,如果不想再接收某個頻道的消息,那麼可以使用UBSUBSCRIBE命令退訂指定的頻道:
UNSUBSCRIBE [channel channel ...] ]
UNSUBSCRIBE命令允許用戶給定任意多個頻道。如果用戶沒有指定任何頻道,直接以無參方式執行,那麼命令將退訂當前客戶端已經訂閱的所有頻道。
客戶端在每次退訂之後,都會收到服務器發來的退訂消息,這條消息由3個元素組成:
- 第1個元素是 “unsubscribe”,表明該消息是一條退訂消息;
- 第2個元素是被退訂頻道的名字;
- 第3個元素是客戶端在執行退訂之後,目前仍在訂閱的頻道數量;
注意:雖然Redis提供了退訂頻道的UNSUBSCRIBE命令,但由於各個客戶端對於發佈與訂閱的功能支持不同,所以並非所有的客戶端都可以使用UNSUBSCRIBE命令來執行退訂操作。例如Redis自帶的命令行客戶端 redis-cli 在執行SUBSCRIBE命令後進入阻塞狀態,無法再執行其他命令,用戶只能通過 Ctrl + C進行強制退出redis-cli程序。
複雜度:,其中爲服務器目前擁有的訂閱者數量。
版本要求:Redis 2.0.0版本開始可用。
PSUBSCRIBE:訂閱模式
用戶可以通過執行 PSUBSCRIBE 命令讓客戶端訂閱給定的一個或多個模式:
PSUBSCRIBE pattern [pattern pattern ... ]
其中 pattern 參數可以是一個全局風格的匹配符,如:“test.*” 表示可以接收所有以 “test.” 爲前綴的頻道,而 “test.[ie]t” 模式可以匹配 “test.it” 或 “test.et” 頻道。
與SUBSCRIBE命令一樣,PSUBSCRIBE命令在成功訂閱一個模式之後,也會返回相應的訂閱消息,這條消息由3個元素組成:
- 第1個元素是 psubscribe ,表示這條消息是由 PSUBSCRIBE 命令引發的訂閱消息;
- 第2個元素是被訂閱的模式;
- 第3個元素是客戶端目前已訂閱的模式數量;
127.0.0.1:6379> psubscribe "test.[ie]t"
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "test.[ie]t"
3) (integer) 1
客戶端在訂閱模式之後,就會收到所有與模式相匹配的頻道的消息,我們把這些消息稱爲模式消息。模式消息與之前的頻道消息有些不同,這個消息由4個元素組成:
- 消息的第1個元素爲 “pmessage”,它表示這是一條模式消息而不是訂閱消息或頻道消息;
- 消息的第2個元素爲被匹配的模式;
- 消息的第3個元素則是與模式相匹配的頻道;
- 消息的第4個元素爲消息的正文內容;
127.0.0.1:6379> publish "test.it" "test pattern1"
(integer) 1
1) "pmessage"
2) "test.[ie]t"
3) "test.it"
4) "test pattern1"
複雜度:,其中爲用戶給定的模式數量
版本要求:Redis 2.0.0版本開始可用。
PUNSUBSCRIBE:退訂模式
與退訂頻道的 UNSUBSCRIBE 命令類似,Redis也提供了用於退訂模式的 PUNSUBCRIBE 命令:
PUNSUBSCRIBE [pattern pattern ... ]
與退訂頻道一樣,如果 PUNSUBSCRIBE 命令未指定任何模式,那麼將退訂當前客戶端所有訂閱的模式。
同樣的在各個客戶端中對於 PUNSUBSCRIBE 命令的支持不同,Redis的redis-cli客戶端中無法使用該命令。
複雜度:,其中爲用戶給定的模式數量,而爲服務器目前被訂閱的模式數量。
版本要求:Redis 2.0.0版本開始可用。
PUBSUB:查看發佈與訂閱相關信息
通過使用 PUBSUB 命令,用戶可以查看發佈與訂閱的相關信息。PUBSUB 命令目前有3個子命令可用,這3個子命令可以分別用查看不同的信息。
查看被訂閱的頻道
使用 PUBSUB CHANNELS 命令列出目前被訂閱的所有頻道,如果給定了可選項 pattern 參數,那麼命令只會列出與給定模式匹配的頻道:
PUBSUB CHANNELS [pattern]
查看頻道的訂閱者數量
用戶可以使用 PUBSUB NUMSUB 命令來查看任意多個給定頻道的訂閱者數量:
PUBSUB NUMSUB [channel channel ... ]
查看被訂閱模式的總數量
使用 PUBSUB NUMPAT 命令可以查看目前被訂閱模式的數量:
PUBSUB NUMPAT
複雜度:PUBSUB CHANNELS命令的複雜度爲 ,其中爲服務器目前被訂閱的頻道總數量;PUBSUB NUMSUB 命令的複雜度爲,其中爲用戶給定的頻道數量;PUBSUB NUMPAT命令的複雜度爲。
版本要求:Redis 2.8.0版本開始可用。
上一篇:Redis學習手冊14—持久化