BLPOP/BRPOP 的先到先服務(wù)原則 如果有多個客戶端同時因?yàn)槟硞€列表而被阻塞,那么當(dāng)有新值被推入到這個列表時,服務(wù)器會按照先到先服務(wù)(first in first service)原則,優(yōu)先向最早被阻塞的客戶端返回新值。舉個例子,假設(shè)列表 lst 為空,那么當(dāng)客戶端 X 執(zhí)行命令 BLPOP lst timeout 時,客戶端 X 將被阻塞。在此之后,客戶端 Y 也執(zhí)行命令 BLPOP lst timeout ,也因此被阻塞。如果這時,客戶端 Z 執(zhí)行命令 RPUSH lst "hello" ,將值 "hello" 推入列表 lst ,那么這個 "hello" 將被返回給客戶端 X ,而不是客戶端 Y ,因?yàn)榭蛻舳?X 的被阻塞時間要早于客戶端 Y 的被阻塞時間。
應(yīng)用場景:task + bak 雙鏈表完成工作任務(wù)轉(zhuǎn)交的安全隊(duì)列,保證原子性。 業(yè)務(wù)邏輯: 1: Rpoplpush task bak 2: 接收返回值,并做業(yè)務(wù)處理 3: 完成時用LREM消掉。如不成功或者如果集群管理(如zookeeper)發(fā)現(xiàn)worker已經(jīng)掛掉,下次從bak表里取任務(wù)
另一個應(yīng)用場景是循環(huán)鏈表: 127.0.0.1:6379> lrange list 0 -1 1) "c" 2) "b" 3) "a" 127.0.0.1:6379> rpoplpush list list "a" 127.0.0.1:6379> lrange list 0 -1 1) "a" 2) "c" 3) "b"
更多建議: