brpop & blpop

1. 基本語法

brpop(key[, key, ...] , timeout:<integer>, callback)

(1) brpoprpop的阻塞(blocking)版本,當給定的串列為空時,執行緒將被阻塞(處於Waiting狀態),在阻塞時間(timeout)內,當列表被賦予新的元素時,則移除並回傳最後一個元素。

(2) 當參數包含多個串列的key時,會依序檢查每個串列,在阻塞時間timeout內,直到出現第一個非空元素的串列,移除最後一個元素並回傳key及被移除的元素。

(3) 當超過阻塞時間timeout後,則回傳空值;timeout為0代表不限制阻塞時間。

(4) blpop用法跟brpop相似,差別只在blpop移除的是第一個元素。

2. 範例

(1) 訊息佇列

以下範例透過lpush+brpop模擬訊息佇列(Message Queue)的應用情境:

情境對象(Producer⟺ Consumer)亦可視為(Publisher ⟺ Subscriber)或(Sender ⟺ Listener)

client.brpop('uid:4', 0, (err, popItem) => {
    console.log(popItem);
});
> 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?