簡介
redis提供了基于“釋出/訂閱”模式的消息機制,此種模式下,消息釋出者和訂閱者不進行直接通信,釋出者用戶端向指定的頻道(channel)釋出消息,訂閱該頻道的每個用戶端都可以收到該消息(頻道沒有”建立“的概念,可以直接訂閱、亦可直接釋出消息)。
指令
釋出消息
publish
自2.0.0可用。
時間複雜度:o(n+m),其中 n 是頻道 channel 的訂閱者數量,而 m 則是使用模式訂閱(subscribed patterns)的用戶端的數量。
文法:publish channel message
說明:
将資訊 message 發送到指定的頻道 channel 。
傳回值:
接收到資訊 message 的訂閱者數量。
示例:
coderknock> subscribe channel1
reading messages... (press ctrl-c to quit)
1) "subscribe" # 傳回值的類型:顯示訂閱成功
2) "channel1" # 訂閱的頻道名字
3) (integer) 1 # 目前已訂閱的頻道數量
1) "message" # 傳回值的類型:資訊
2) "channel1" # 來源(從哪個頻道發送過來)
3) "new channel1" # 資訊内容
psubscribe
每個模式以 作為比對符,比如 it 比對所有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 比對所有以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類。
coderknock> psubscribe news. coderknock.
1) "psubscribe" # 傳回值的類型:顯示訂閱成功
2) "news.*" # 訂閱的頻道名字
1) "psubscribe"
2) "coderknock.*"
3) (integer) 2
1) "pmessage" # 傳回值的類型:資訊
2) "news.*" # 來源頻道模式
3) "news.123" # 具體頻道(從哪個頻道發送過來)
4) "123 # 消息
1) "pmessage"
2) "news.*"
3) "news.222"
4) "222"<code>`</code>
檢視釋出/訂閱系統狀态
pubsub
自2.8.0可用。
時間複雜度:o(n), n 是訂閱的模式的數量。
文法:pubsub subcommand [argument [argument ...]]
pubsub 是一個檢視訂閱與釋出系統狀态的内省指令, 它由數個不同格式的子指令組成, 以下将分别對這些子指令進行介紹。
pubsub channels [pattern]
列出目前的活躍頻道。
活躍頻道指的是那些至少有一個訂閱者的頻道, 訂閱模式的用戶端不計算在内。
pattern 參數是可選的:
如果不給出 pattern 參數,那麼列出訂閱與釋出系統中的所有活躍頻道。
如果給出 pattern 參數,那麼隻列出和給定模式 pattern 相比對的那些活躍頻道。
複雜度: o(n) , n 為活躍頻道的數量(對于長度較短的頻道和模式來說,将進行模式比對的複雜度視為常數)。
傳回值: 一個由活躍頻道組成的清單。
傳回給定頻道的訂閱者數量, 訂閱模式的用戶端不計算在内。
複雜度:o(n) , n 為給定頻道的數量。
傳回值: 一個多條批量回複(multi-bulk reply),回複中包含給定的頻道,以及頻道的訂閱者數量。 格式為:頻道 channel-1 , channel-1 的訂閱者數量,頻道 channel-2 , channel-2 的訂閱者數量,諸如此類。 回複中頻道的排列順序和執行指令時給定頻道的排列順序一緻。 不給定任何頻道而直接調用這個指令也是可以的, 在這種情況下, 指令隻傳回一個空清單。
傳回 訂閱模式 的數量。
注意, 這個指令傳回的不是訂閱模式的用戶端的數量, 而是用戶端訂閱的所有模式的數量總和。
傳回值: 一個整數回複(integer reply)。
import redis
import time
r = redis.strictredis(host='127.0.0.1', password='admin123', port=6379, db=0)
p = r.pubsub()
p.subscribe("coderknock", "sanchan", "python")
"""
coderknock> pubsub channels
1) "python"
2) "blog"
3) "news"
4) "test"
5) "oschina"
6) "coderknock"
7) "sanchan"
coderknock> pubsub numsub coderknock news blog oschina test sanchan coderknock.* python
1) "coderknock"
2) (integer) 3
4) (integer) 1
5) "blog"
6) (integer) 1
7) "oschina"
8) (integer) 1
9) "test"
10) (integer) 1
11) "sanchan"
12) (integer) 3
13) "coderknock.*"
14) (integer) 0
15) "python"
16) (integer) 1
time.sleep(10) # 休眠 10 秒
p.unsubscribe("sanchan")
12) (integer) 2
p.unsubscribe()
2) (integer) 2
16) (integer) 0
unsubscribe