LMOVEM

批量移动列表元素,并返回移动的元素。

语法

LMOVEM source destination [ ]

引入版本:8.10.0

复杂度摘要:O(N)

[!NOTE] 此命令的行为在集群 Redis 环境中有所不同。请参阅 多键操作 页面了解更多信息。

以原子方式将一个或多个元素从存储在 source 的列表移动到存储在 destination 的列表,并返回移动的元素。 LMOVEM 是 LMOVE 的多元素版本:没有可选的 how-many 块,它的行为与 LMOVE 完全相同,但将移动的元素作为单元素数组返回。

必需参数

source

源列表的key。

destination

目的地列表键。

LEFT | RIGHT

source 的末尾要从以下位置弹出元素:LEFT(头)或 RIGHT(尾)。

LEFT | RIGHT

destination 的末尾将元素推送到:LEFT(头)或 RIGHT(尾)。

可选参数

how-many 块控制移动的元素数量以及移动顺序。包含它时,必须提供选择器(COUNT 或 EXACTLY)和排序(OBO 或 BULK)。

COUNT count | EXACTLY exactly

移动的元素数量:

  • COUNT count 向上移动到 count 元素。如果 source 包含的元素少于 count 元素,则所有这些元素都会被移动。这与 LPOP 和 LMPOP 的 count 语义相匹配。
  • EXACTLY exactly 恰好移动 exactly 元素。如果 source 包含的元素少于 exactly,则不会移动任何内容,并且命令返回 nil。
OBO | BULK

元素压入destination的顺序:

  • OBO(一个接一个)单独移动元素:每个元素从 source 中弹出,并在移动下一个元素之前推送到 destination。
  • BULK 一次移动所有元素,保留它们的相对顺序。

两种排序的不同之处仅在于元素的最终排列。有关详细信息,请参阅 元素排序。

示例

redis> rpush mylist 1 2 3 4
(integer) 4
redis> LMOVEM mylist myotherlist LEFT LEFT COUNT 2 OBO
1) "2"
2) "1"
redis> LRANGE mylist 0 -1
1) "3"
2) "4"
redis> LRANGE myotherlist 0 -1
1) "2"
2) "1"
redis> LMOVEM mylist myotherlist LEFT LEFT EXACTLY 5 BULK
(nil)
redis> RPUSH somelist a b c
(integer) 3
redis> LMOVEM somelist somelist LEFT LEFT EXACTLY 2 OBO
1) "b"
2) "a"
redis> LRANGE somelist 0 -1
1) "b"
2) "a"
3) "c"

详细说明

移动多个元素

LMOVEM 将元素从 source 的一端(由第一个 LEFT | RIGHT 参数选择)移动到 destination 的一端(由第二个 LEFT | RIGHT 参数选择),并将移动的元素作为数组返回。如果 source 不存在,则不执行任何操作,并且该命令返回空数组(使用 EXACTLY 时返回 nil)。

COUNT 和 EXACTLY 选择器决定移动多少个元素:

  • 对于 COUNT count,命令向上移动到 count 元素。如果 source 包含的元素少于 count,则所有可用元素都会被移动。
  • 对于 EXACTLY exactly,仅当 source 至少保存了所请求数量的元素时,该命令才会移动所请求数量的元素。否则它什么也不移动并返回零。当元素形成必须一起移动或根本不移动的固定大小组(例如,对或三元组)时,这非常有用。

元素排序

OBO 和 BULK 顺序决定了移动的元素在 destination 上的排列方式:

  • OBO(一个接一个)依次弹出和压入每个元素,因此较早弹出的元素最终位于目标端较晚弹出的元素的“下方”。
  • BULK 一次性移动整个批次,保留元素的相对顺序。

当 source 和 destination 是相同键时,这种差异成为有用的副作用。 BULK 保持列表不变(元素被删除并以相同的顺序重新添加),因此它实际上是一个无操作。然而,OBO 将移动的元素反转到位。例如,当 mylist 持有 a, b, c 时,运行 LMOVEM mylist mylist LEFT LEFT EXACTLY 2 OBO 会弹出 a,然后弹出 b,并将每个推回到头部,将 mylist 保留为 b, a, c。

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
❌ 标准
❌主动-主动
❌ 标准
❌主动-主动

返回值

RESP2

以下之一: * 数组回复:移动的元素,按目标顺序。 * 无回复:如果使用了 EXACTLY 并且 source 没有容纳足够的元素。

RESP3

以下之一: * 数组回复:移动的元素,按目标顺序。 * 空回复:如果使用了 EXACTLY 并且 source 没有容纳足够的元素。

参见

LMOVE | BLMOVEM | LMPOP | RPOPLPUSH

资料来源:Redis 官方 LMOVEM 文档;中文内容参考 Redis 文档许可。