1. 程式人生 > >九Redis 釋出與訂閱

九Redis 釋出與訂閱

釋出與訂閱功能
Redis 的釋出與訂閱功能可以讓使用者將訊息同時傳送給多個客戶端。 這個功能由幾個不同的角色 協作組成:
• 釋出者(publisher):釋出訊息的客戶端。
• 頻道(channel):構建在伺服器內部,負責接收發布者傳送的訊息,並將訊息 轉發給頻道的訂閱者。
• 模式(pattern):構建在伺服器內部,負責對頻道進行匹配,當被匹配的 頻道接到訊息時,模式也會
將訊息轉發給模式的訂閱者。
訂閱者(subscriber):通過訂閱頻道或者模式來獲取訊息的客戶端。每個頻道或者模式都可以有任意多個訂閱者

頻道的訂閱與訊息釋出
B, C 、 D 三個客戶端正在訂閱 news::it 頻道
當客戶端 A 向 news::it 頻道傳送訊息 “hello world” 時,該訊息將被頻道轉發至 B 、 C 、 D 三 個客戶端

模式的訂閱與訊息釋出
客戶端 C 和 D 訂閱了 news::[ie]t 模式,而這個模式又和 news::it 、 news::et 兩個頻道匹配,當 news:: it 頻道或者 news::et 頻道接收到訊息的時候,這些訊息不僅會被轉發給頻道的訂閱者,也會被轉發給 客戶端 C 和 D

模式訂閱者接收訊息示例(1)

模式訂閱者接收訊息示例(2)

訂閱命令與釋出
訂閱頻道或模式、退 訂頻道或模式、 釋出訊息。

訂閱頻道
SUBSCRIBE channel [channel ...]
訂閱給定的一個或多個頻道
複雜度為 O(N) , N 為被訂閱頻道的數量

 

訂閱模式
PSUBSCRIBE pattern [pattern ...]
訂閱一個或多個模式, pattern 引數可以包含 glob 風格的匹配符,比如:
• news::* 模式可以匹配 news::bussiness 、 news::it 、 news::sports::football 等頻道;
• news::[ie]t 模式可以匹配 news::it 頻道或者 news::et 頻道;
• news::?t 模式可以匹配 news::it 、 news::et 、 news::at 等頻道;
諸如此類
複雜度為 O(N) ,N 為被訂閱模式的數量。
訂閱模式示例

訂頻道和退訂模式

退訂命令的行為在各個客戶端的表現都不同,比如 redis-cli 客戶端就是通過直接退出客戶端來進行退訂 的,而 Python 和 Ruby 的客戶端則需要顯示地執行退訂命令。
退訂示例
釋出訊息
PUBLISH channel message
將訊息傳送至指定的頻道,命令返回接收到訊息的 訂閱者數量。
複雜度為 O(N) ,N 為接收到訊息的訂閱者數量(包括通過訂閱頻道來接收訊息的訂閱者和通過訂閱模
式來接收訊息的 訂閱者)

訂閱狀態命令
檢視被訂閱的頻道、頻道的訂閱數量以及模式的訂閱數量。


檢視被訂閱的頻道 PUBSUB CHANNELS [pattern]
列出目前至少有一個 訂閱者的頻道。
如果給定了可選的 pattern 引數,那麼只列出與模式相匹配的頻道。
複雜度為 O(N) ,N 為伺服器中被訂閱頻道的總數量。
redis > PUBSUB CHANNELS #沒有任何頻道被訂閱
(empty list or set)
redis > PUBSUB CHANNELS #有客戶端正在訂閱 news::et和news::it頻道
1) "news::et"
2) "news::it"
檢視頻道的訂閱者數量
PUBSUB NUMSUB [channel-1 ... channel-N]
返回給定頻道的訂閱者數量。
複雜度為 O(N) ,N 為給定頻道的數量。
redis> PUBSUB NUMSUB news::it news::et
1) "news::it" #有兩個客戶端正在訂閱news::it頻道
2) "2"
3) "news::et" #有一個客戶端正在訂閱news::et頻道
4) "1"
檢視被訂閱模式的數量
PUBSUB NUMPAT
返回伺服器目前被訂閱的模式數量
複雜度為 O(1)
redis> PUBSUB NUMPAT
(integer) 3 # 伺服器目前有三個模式被訂閱
使用釋出與訂閱功能實現直播間
要使用 Redis 實現類似的直播間,我們可以 為每個直播間設定一個頻道,每個直播間的 聽眾都是頻道的訂閱者,而播主則通過向頻 道傳送訊息來告 訴大家要播放哪首歌。
比如說,假設使用者 peter 正在進行直播,他的 直播間的頻道為 peter::live::room ,當 peter 要播放 ID 為 10086 的歌曲時,他會執行命 令 PUBLISH peter::live::room “play_song:: 10086” 。
而所有聽眾在接收到 這條訊息時,只需要分 析出裡面的指令( play_song)和要播放的歌 曲 ID (10086),就可以播放 peter 指定的歌 曲了。

直播間的播主示例
>>> from live_room import LiveRoom
>>> live = LiveRoom(client, "peter::live::room") # 指定直播間 >>> live.play(10086) # 播放 id 為 10086 的歌曲
playing song, id = 10086
>>> live.play(12345) # 播放 id 為 12345 的歌曲
playing song, id = 12345

直播間的聽眾示例
>>> from live_room import LiveRoom
>>> live = LiveRoom(client, "peter::live::room") # 指定直播間 >>> live.listen() # 開始收聽 peter 的直播間
playing song, id = 10086 # 播主播放了 id 為 10086 的歌曲 playing song, id = 12345 # 播主播放了 id 為 12345 的歌曲