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