W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
blpop key1...keyN timeout
從左到右掃描返回對(duì)第一個(gè)非空list進(jìn)行l(wèi)pop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空則對(duì)list2做lpop并返回從list2中刪除的元素。如果所有的list都是空或不存在,則會(huì)阻塞timeout秒,timeout為0表示一直阻塞。當(dāng)阻塞時(shí),如果有client對(duì)key1...keyN中的任意key進(jìn)行push操作,則第一在這個(gè)key上被阻塞的client會(huì)立即返回(返回鍵和值)。如果超時(shí)發(fā)生,則返回nil。有點(diǎn)像unix的select或者poll。
brpop
同blpop,一個(gè)是從頭部刪除一個(gè)是從尾部刪除。
注意:不要采用其作為ajax的服務(wù)端推送,因?yàn)檫B接有限,遇到問題連接直接打滿。
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í)間。
rpoplpush/brpoplpush:rpoplpush srckey destkey 從srckey對(duì)應(yīng)list的尾部移除元素并添加到destkey對(duì)應(yīng)list的頭部,最后返回被移除的元素值,整個(gè)操作是原子的.如果srckey是空或者不存在返回nil,注意這是唯一一個(gè)操作兩個(gè)列表的操作,用于兩個(gè)隊(duì)列交換消息。
應(yī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)用場景是循環(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"
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: