?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
RPOPLPUSH source destination
自1.2.0起可用。
時(shí)間復(fù)雜度: O(1)
原子返回并移除存儲(chǔ)在列表中的列表的最后一個(gè)元素(尾部)source
,并按下存儲(chǔ)在列表中第一個(gè)元素(頭部)的元素destination
。
例如:考慮source
拿著清單a,b,c
,然后destination
拿著清單x,y,z
。執(zhí)行RPOPLPUSH導(dǎo)致source
持有a,b
和destination
持有c,x,y,z
。
如果source
不存在,nil
則返回該值并且不執(zhí)行任何操作。如果source
和destination
相同,該操作相當(dāng)于從列表中刪除最后一個(gè)元素,并將其作為列表的第一個(gè)元素推入,因此可以將其視為列表旋轉(zhuǎn)命令。
批量字符串回復(fù):正在彈出和推送的元素。
redis> RPUSH mylist "one" (integer) 1
redis> RPUSH mylist "two" (integer) 2
redis> RPUSH mylist "three" (integer) 3
redis> RPOPLPUSH mylist myotherlist "three"
redis> LRANGE mylist 0 -1 1) "one" 2) "two"
redis> LRANGE myotherlist 0 -1 1) "three"
Redis通常用作消息傳遞服務(wù)器來(lái)實(shí)現(xiàn)后臺(tái)作業(yè)或其他類型的消息傳遞任務(wù)的處理。通??梢酝ㄟ^(guò)將值推入生產(chǎn)者端的列表中,并使用RPOP(使用輪詢)在消費(fèi)者端等待此值,或通過(guò)阻止操作為客戶端提供更好的服務(wù)來(lái)實(shí)現(xiàn)BRPOP,從而獲得簡(jiǎn)單的隊(duì)列形式。
然而,在這種情況下,所獲得的隊(duì)列是不可靠的,因?yàn)榭赡軙?huì)丟失消息,例如在存在網(wǎng)絡(luò)問(wèn)題的情況下或消費(fèi)者在收到消息之后崩潰但仍然要處理的情況下。
RPOPLPUSH(或阻止變體的BRPOPLPUSH)提供了一種避免此問(wèn)題的方法:消費(fèi)者提取消息并同時(shí)將其推入處理列表。一旦消息已被處理,它將使用LREM命令來(lái)從處理列表中刪除消息。
額外的客戶端可能會(huì)監(jiān)視處理列表中保留的項(xiàng)目太多時(shí)間,并且會(huì)在需要時(shí)再次將這些超時(shí)項(xiàng)目推入隊(duì)列中。
使用具有相同源和目標(biāo)密鑰的RPOPLPUSH,客戶端可以使用單個(gè)LRANGE操作在O(N)中一個(gè)接一個(gè)地訪問(wèn)N元素列表中的所有元素,而無(wú)需使用單個(gè)LRANGE操作將完整列表從服務(wù)器傳輸?shù)娇蛻舳恕?/p>
即使有以下兩個(gè)條件,上述模式仍然有效:
有多個(gè)客戶端輪換列表:他們將獲取不同的元素,直到列表中的所有元素都被訪問(wèn),并且進(jìn)程重新啟動(dòng)。
即使其他客戶在列表末尾積極推出新項(xiàng)目。
上述內(nèi)容使得實(shí)現(xiàn)一套系統(tǒng)必須由N名工作人員盡可能快地處理一套物品變得非常簡(jiǎn)單。一個(gè)例子是一個(gè)監(jiān)控系統(tǒng),它必須使用大量的并行工作人員來(lái)檢查一組網(wǎng)站是否可以訪問(wèn),并盡可能縮短延遲。
請(qǐng)注意,這種工作者的實(shí)現(xiàn)是可升級(jí)且可靠的,因?yàn)榧词瓜G失,項(xiàng)目仍然在隊(duì)列中,并且將在下一次迭代中處理。