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