天天看點

Redis 釋出訂閱訂閱成功接收到資訊訂閱成功接收到資訊基于上一個指令的示例,此時在用戶端中執行說明訂閱成功統計訂閱數量此時取消了一個 sanchan 的訂閱此時該 python 中訂閱全部退訂

簡介

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&gt; pubsub channels

1) "python"

2) "blog"

3) "news"

4) "test"

5) "oschina"

6) "coderknock"

7) "sanchan"

coderknock&gt; 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