九Redis 釋出與訂閱
阿新 • • 發佈:2018-12-26
釋出與訂閱功能 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 的歌曲