- 用法
-
LMOVE source destination 〈 LEFT | RIGHT 〉 〈 LEFT | RIGHT 〉
- 复杂度
- O(1)
- 始于
- 6.2.0
- ACL 类别
- @list, @write, @slow
- 存在多个客户端对列表进行旋转:它们将获取不同的元素,直到列表中的所有元素都被访问过,然后该过程重新开始。
- 即使有其他客户端正在积极地将新项目推入列表末尾。
原子地返回并移除存储在 source
列表的第一个/最后一个元素(取决于 wherefrom
参数,是头部或尾部),并将该元素推送到存储在 destination
列表的第一个/最后一个位置(取决于 whereto
参数,是头部或尾部)。
例如:假设 source
存储列表 a,b,c
,destination
存储列表 x,y,z
。执行 LMOVE source destination RIGHT LEFT
会使 source
变为 a,b
,destination
变为 c,x,y,z
。
如果 source
不存在,则返回 nil
值,并且不执行任何操作。如果 source
和 destination
相同,则此操作等同于从列表中移除第一个/最后一个元素,并将其作为列表的第一个/最后一个元素推入,因此可以视为一个列表旋转命令(如果 wherefrom
与 whereto
相同,则相当于无操作)。
此命令取代了现已弃用的 RPOPLPUSH
命令。执行 LMOVE RIGHT LEFT
效果相同。
示例
127.0.0.1:6379> RPUSH mylist "one"
(integer) 1
127.0.0.1:6379> RPUSH mylist "two"
(integer) 2
127.0.0.1:6379> RPUSH mylist "three"
(integer) 3
127.0.0.1:6379> LMOVE mylist myotherlist RIGHT LEFT
"three"
127.0.0.1:6379> LMOVE mylist myotherlist LEFT RIGHT
"one"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "two"
127.0.0.1:6379> LRANGE myotherlist 0 -1
1) "three"
2) "one"
模式:可靠队列
Valkey 通常用作消息服务器,用于实现后台作业处理或其他类型的消息任务。一种简单的队列形式通常是通过在生产者端将值推入列表,并在消费者端使用 RPOP
(通过轮询)或 BRPOP
(如果客户端更适合阻塞操作)来等待这些值。
然而,在这种情况下,所获得的队列并非可靠的,因为消息可能会丢失,例如在网络出现问题时,或者消费者在接收消息后但尚未处理时崩溃。
LMOVE
(阻塞版本为 BLMOVE
)提供了一种避免此问题的方法:消费者获取消息并同时将其推入一个处理中列表。一旦消息处理完毕,它将使用 LREM
命令将消息从处理中列表中移除。
另一个客户端可以监视处理中列表,查找停留时间过长的项目,并在需要时将这些超时的项目再次推回队列。
模式:循环列表
使用 LMOVE
命令,将源键和目标键设置为相同,客户端可以在 O(N) 的复杂度下,逐个访问一个 N 元素列表中的所有元素,而无需通过单个 LRANGE
操作将整个列表从服务器传输到客户端。
上述模式在以下条件下仍然有效:
上述方法使得实现一个系统变得非常简单,在该系统中,一组项目必须由 N 个工作器尽可能快地持续处理。例如,一个监控系统必须检查一组网站是否可达,以尽可能小的延迟,并使用多个并行工作器。
请注意,这种工作器的实现是轻易可扩展且可靠的,因为即使消息丢失,该项目仍然在队列中,并将在下一次迭代中得到处理。
RESP2/RESP3 回复
批量字符串回复:被弹出并推入的元素。