1. 程式人生 > >Redis的阻塞式列表解析

Redis的阻塞式列表解析

3.1 服務器 time mic spark -m available 詳細 ast

1. 命令幫助

通過Redis-cli中的help進行查看:

127.0.0.1:6379>help BLPOP

BLPOP key [key ...] timeout

summary: Remove and get the first element ina list, or block until one is available

since: 2.0.0

group: list

127.0.0.1:6379>help BRPOP

BRPOP key [key ...] timeout

summary: Remove and get the last element in alist, or block until one is available

since: 2.0.0

group: list

通過列表詳細描述:

命令

作用

復雜度

BLPOP key [key ...] timeout

LPOP 命令的阻塞版本;命令會以從左到右的順序,訪問給定的各個列表,並彈出首個非空列表最左端的項; 如果所有給定列表都為空,那麽客戶端將被阻塞,直到等待超時,或者有可彈出的項出現為 止;
設置 timeout參數為0表示永遠阻塞。

O(N),N 為輸入列表的數量。

BRPOP key [key ...] timeout

RPOP命令的阻塞版本: 命令會以從左到右的順序,訪問給定的各個列表,並彈出首個非空列表最右端的項; 如果所有給定列表都為空,那麽客戶端將被阻塞,直到等待超時,或者有可彈出的項出現為 止;


設置 timeout參數為0表示永遠阻塞。

O(N),N 為輸入列表的數量。

2. BLPOP/BRPOP實戰

訪問四個空的列表,並且設置阻塞時間為60秒

127.0.0.1:6379>BLPOP list1list2 list3 list4 60

(nil)

(60.02s)

通過返回的結果,nil表示等待超時,沒有彈出數據,同時60.02s表示客戶端被阻塞的時長。

下面我們設置list1列表的值為"Spark" "Hadoop" "Hive",然後再進行如下操作:

127.0.0.1:6379>RPUSH list1 "Spark" "hadoop

""hive"

(integer) 3

127.0.0.1:6379>LRANGE list1 0 -1

1)"Spark"

2)"Hadoop"

3)"Hive"

127.0.0.1:6379>BLPOP list1 list2 list3 list4 60

1)"list1" #執行彈出操作的列表

2)"Spark" #被彈出的項

我們發現list1不為空,於是執行彈出命令(#後面為註釋)。

我們也可以先執行阻塞操作,然後在等待過程設置列表的值,如下:

終端A: 執行如下命令,阻塞中

127.0.0.1:6379>BLPOP list2 list3 list4 60

終端B: 設置list2值

127.0.0.1:6379>RPUSH list2 "Scala" "Sqoop"

(integer) 2

同時我們查看終端A時會發現,已經彈出結果了

127.0.0.1:6379>BLPOP list2 list3 list4 60

1)"list2" #執行彈出操作的列表

2)"scala" #被彈出的項

(6.28s) #客戶端被阻塞的時長

3. 下面介紹幾種情形:

3.1 非阻塞

當發現給定的列表中至少一個非空列表時,BLPOP和BRPOP就會立即從那個列表裏面彈出元素,

在這種情況下,BLPOP就像一個接受多參數的LPOP命令,而BRPOP就像一個接受多參數的RPOP命令。

3.2 阻塞並超時

如果所有給定的列表都是空的,那麽BLPOP/BRPOP將被被阻塞。

如果在阻塞的過程中,給定的列表一直沒有新項被推入,那麽當設定的超時時間到達之後,

命令將向被阻塞的客戶端返回nil。

3.3 阻塞並彈出情況

如果在客戶端A被阻塞的過程中,有另一個客戶端B給造成客戶端A被阻塞的列表推入了新項,那麽

服務器會將這個新項返回給客戶端A。

4. BLPOP/BRPOP的先到先服務原則

如果有多個客戶端同時因為某個列表而被阻塞,那麽當有新值被推入到這個列表時,服務器就會按照先到先服務原則,優先向最早被阻塞的客戶端返回新值。

Redis的阻塞式列表解析