Redis學習手冊15—發佈與訂閱

發佈與訂閱

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

複雜度:O(N+M)O(N+M),其中NN爲給定頻道的訂閱者數量,而MM爲服務器目前被訂閱的模式總數量。
版本要求: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"

複雜度:O(N)O(N),其中NN爲用戶輸入的消息數量。
版本要求: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程序。

複雜度:O(N)O(N),其中NN爲服務器目前擁有的訂閱者數量。
版本要求: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"

複雜度:O(N)O(N),其中NN爲用戶給定的模式數量
版本要求:Redis 2.0.0版本開始可用。

PUNSUBSCRIBE:退訂模式

與退訂頻道的 UNSUBSCRIBE 命令類似,Redis也提供了用於退訂模式的 PUNSUBCRIBE 命令:

PUNSUBSCRIBE [pattern pattern ... ]

與退訂頻道一樣,如果 PUNSUBSCRIBE 命令未指定任何模式,那麼將退訂當前客戶端所有訂閱的模式。

同樣的在各個客戶端中對於 PUNSUBSCRIBE 命令的支持不同,Redis的redis-cli客戶端中無法使用該命令。

複雜度:O(NM)O(N*M),其中NN爲用戶給定的模式數量,而MM爲服務器目前被訂閱的模式數量。
版本要求: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命令的複雜度爲 O(N)O(N),其中NN爲服務器目前被訂閱的頻道總數量;PUBSUB NUMSUB 命令的複雜度爲O(N)O(N),其中NN爲用戶給定的頻道數量;PUBSUB NUMPAT命令的複雜度爲O(1)O(1)

版本要求:Redis 2.8.0版本開始可用。

上一篇:Redis學習手冊14—持久化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章