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