Redis的阻塞式列表解析


 

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的先到先服務原則

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM