LMOVE

用法
LMOVE source destination 〈 LEFT | RIGHT 〉 〈 LEFT | RIGHT 〉
复杂度
O(1)
始于
6.2.0
ACL 类别
@list, @write, @slow

原子地返回并移除存储在 source 列表的第一个/最后一个元素(取决于 wherefrom 参数,是头部或尾部),并将该元素推送到存储在 destination 列表的第一个/最后一个位置(取决于 whereto 参数,是头部或尾部)。

例如:假设 source 存储列表 a,b,cdestination 存储列表 x,y,z。执行 LMOVE source destination RIGHT LEFT 会使 source 变为 a,bdestination 变为 c,x,y,z

如果 source 不存在,则返回 nil 值,并且不执行任何操作。如果 sourcedestination 相同,则此操作等同于从列表中移除第一个/最后一个元素,并将其作为列表的第一个/最后一个元素推入,因此可以视为一个列表旋转命令(如果 wherefromwhereto 相同,则相当于无操作)。

此命令取代了现已弃用的 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 回复

批量字符串回复:被弹出并推入的元素。