Pub/Sub 就是 Publish 和 Subscribe,也就是發佈訂閱。發佈訂閱是一種訊息通訊的模式,發佈者(pub) 傳送訊息,訂閱者(sub) 接收訊息。
概念是訂閱者會訂閱一個或多個頻道(channel),如下圖有三個訂閱者訂閱了頻道 Channel1。
當有新訊息透過 Publish 命令發送給 Channel1 時,就會被發送給這個頻道的三個訂閱者。
所以發佈訂閱並不是針對特定的收件人傳送訊息,發佈者只會把訊息傳送到頻道中,而且發佈者也不會知道誰會收到。收訊息完全取決於訂閱者訂閱哪些頻道,有訂閱該頻道才會收到頻道的訊息。
下面我們就來介紹實作發佈訂閱的指令和方式。
Pub/Sub 指令
Subscribe
Subscribe 用來訂閱頻道,可以一次訂閱多個。
1 | 127.0.0.1:6379> subscribe <channel1> <channel2> ... |
Publish
Publish 可以用來發佈訊息到頻道裡
1 | 127.0.0.1:6379> publish <channel> <message> |
範例 :
首先先建立一個訂閱頻道 channel1。
1 | 127.0.0.1:6379> subscribe channel1 |
接著另外再開啟一個 terminal 連線進同一個 Redis,然後在頻道 channel1 發佈訊息。
1 | 127.0.0.1:6379> publish channel1 helloworld |
回到原本的 terminal 可以看到收到了訊息。
1 | 127.0.0.1:6379> subscribe channel1 |
Psubscribe
Psubscribe 可以一次訂閱一個或多個符合指定的 pattern 的頻道。
1 | 127.0.0.1:6379> psubscribe <pattern1> <pattern2> ... |
範例 :
1 | 127.0.0.1:6379> psubscribe *.news *.sports |
Pubsub
Pubsub 用來查看訂閱與發佈系統的狀態。
1 | 127.0.0.1:6379> pubsub <subcommand> <argument1> <argument2> ... |
SubCommand 有三個指令可以選擇,如下 :
Channels
Channels 會列出目前活躍的頻道,活躍頻道是指至少有一個訂閱者的頻道。也可以指定 pattern 來列出指定的頻道。
1 | 127.0.0.1:6379> pubsub <channels> <pattern> |
範例 :
先建立和訂閱多個頻道
1 | 127.0.0.1:6379> subscribe taiwan.news taiwan.sports taiwan.weather |
再另外開啟一個 Terminal 連進 Redis,就可以用 pubsub channels 指令查看活躍的頻道。
1 | 127.0.0.1:6379> pubsub channels |
Numsub
Numsub 可以查看頻道的訂閱者數量。
1 | 127.0.0.1:6379> pubsub numsub <channel1> <channel2> ... |
範例 :
1 | 127.0.0.1:6379> pubsub numsub taiwan.news taiwan.sports |
Numpat
Numpat 可以查看客戶端訂閱的所有 pattern 總數。Numpat 要搭配 Psubscribe 才有 pattern 可以計算。
1 | 127.0.0.1:6379> pubsub numpat |
範例 :
1 | // 以下由三個不同的 terminal 作為客戶端分別指定 pattern 訂閱頻道 |
Unsubscribe
Unsubscribe 用於退訂一個或多個頻道。
1 | 127.0.0.1:6379> unsubscribe <channel1> <channel2> ... |
範例 :
1 | 127.0.0.1:6379> unsubscribe taiwan.news |
Punsubscribe
Punsubscribe 用於退訂一個或多個符合指定的 pattern 的頻道。
1 | redis 127.0.0.1:6379> punsubscribe <pattern1> <pattern2> ... |
範例 :
1 | 127.0.0.1:6379> punsubscribe taiwan.* |
Summary
這一篇介紹了 Redis 支援的發佈訂閱,這是非常實用的功能,可以大幅的提升系統的延展性。想了解更多 Redis 的 Pub/Sub 請參考 Redis 官網。
下一篇 將介紹 Redis 的 Transaction,可以一次執行多條指令以提升效能。
參考
[1] Redis 發佈訂閱
[2] Redis 命令參考