brpop & blpop
1. 基本語法
brpop(key[, key, ...]
, timeout:<integer>
, callback
)
key[, key, ...]
, timeout:<integer>
, callback
) (1) brpop為rpop的阻塞(blocking)版本,當給定的串列為空時,執行緒將被阻塞(處於Waiting狀態),在阻塞時間(timeout
)內,當列表被賦予新的元素時,則移除並回傳最後一個元素。
(2) 當參數包含多個串列的key
時,會依序檢查每個串列,在阻塞時間timeout
內,直到出現第一個非空元素的串列,移除最後一個元素並回傳key及被移除的元素。
(3) 當超過阻塞時間timeout
後,則回傳空值;timeout
為0代表不限制阻塞時間。
(4) blpop用法跟brpop相似,差別只在blpop移除的是第一個元素。
2. 範例
(1) 訊息佇列
以下範例透過lpush+brpop模擬訊息佇列(Message Queue)的應用情境:

client.brpop('uid:4', 0, (err, popItem) => {
console.log(popItem);
});
Console會進入Waiting狀態,因為uid:4鍵值為空列表,執行緒暫時被阻塞。我們可以透過另啟redis-cli模擬Producer端行為對uid:4新增資料。
> redis-cli
127.0.0.1:6379> lpush uid:4 U001 U002 U003 U004 U005
(integer) 5
當server端成功傳送新資料到Redis,uid:4列表開始為非空元素時,client端等待的brpop便立即移除並回傳列表後一個元素。
[ 'uid:4', 'U001' ]
Reply: U005,U004,U003,U002
(2) 逾時情境
client.del('uid:4');
client.brpop('uid:4', 5, (err, popItem) => {
console.log(popItem);
});
client.lrange('uid:4', 0, -1, redis.print);
null
Reply:
Last updated
Was this helpful?