LPUSHX、RPUSHX:只对已存在的列表执行推入操作

当用户调用 LPUSH 命令或 RPUSH 命令尝试将元素推入列表的时候,如果给定的列表并不存在,那么命令将自动创建一个空列表,并将元素推入刚刚创建的列表中。

例如,对于空列表 list1 和 list2 来说,执行以下命令将创建图 4-9 所示的两个列表:

image 2025 01 03 15 35 07 427
Figure 1. 图4-9 两个只包含单个元素的列表
redis> LPUSH list1 "item1"
(integer) 1
redis> RPUSH list2 "item1"
(integer) 1

除了 LPUSH 命令和 RPUSH 命令之外,Redis 还提供了 LPUSHX 命令和 RPUSHX 命令:

LPUSHX list item
RPUSHX list item

这两个命令对待空列表的方式与 LPUSH 命令和 RPUSH 命令正好相反:

  • LPUSHX 命令只会在列表已经存在的情况下,将元素推入列表左端。

  • RPUSHX 命令只会在列表已经存在的情况下,将元素推入列表右端。

如果给定列表并不存在,那么 LPUSHX 命令和 RPUSHX 命令将放弃执行推入操作。

LPUSHX 命令和 RPUSHX 命令在成功执行推入操作之后,将返回列表当前的长度作为返回值,如果推入操作未能成功执行,那么命令将返回 0 作为结果。

举个例子,如果我们对不存在的列表 list3 执行以下 LPUSHX 命令和 RPUSHX 命令,那么这两个推入操作都将被拒绝:

redis> LPUSHX list3 "item-x"
(integer) 0 -- 没有推入任何元素
redis> RPUSHX list3 "item-y"
(integer) 0 -- 没有推入任何元素

如果我们先使用 LPUSH 命令将一个元素推入 list3 列表中,使得 list3 变成非空列表,那么 LPUSHX 命令和 RPUSHX 命令就可以成功地执行推入操作:

redis> LPUSH list3 "item1"
(integer) 1 -- 推入一个元素,使得列表变为非空
redis> LPUSHX list3 "item-x"
(integer) 2 -- 执行推入操作之后,列表包含2个元素
redis> RPUSHX list3 "item-y"
(integer) 3 -- 执行推入操作之后,列表包含3个元素

图 4-10 展示了列表 list3 的整个变化过程:

  1. 在最初的 LPUSHX 命令和 RPUSHX 命令执行之后,list3 仍然是一个空列表。

  2. 执行 LPUSH 命令,将元素 "item1" 推入列表中,使之变为非空。

  3. 执行 LPUSHX 命令,将元素 "item-x" 推入列表,使得列表包含 2 个元素。

  4. 执行 RPUSHX 命令,将元素 "item-y" 推入列表,使得列表包含 3 个元素。

image 2025 01 03 15 40 57 995
Figure 2. 图4-10 LPUSHX 命令和 RPUSHX 命令的执行过程

每次只能推入单个元素

LPUSH 命令和 RPUSH 命令不一样,LPUSHX 命令和 RPUSHX 命令每次只能推入一个元素,尝试向 LPUSHX 命令或 RPUSHX 命令给定多个元素将引发错误:

redis> LPUSHX list "item1" "item2" "item3"
(error) ERR wrong number of arguments for 'lpushx' command
redis> RPUSHX list "item1" "item2" "item3"
(error) ERR wrong number of arguments for 'rpushx' command

其它信息

  • 复杂度:O(1)。

  • 版本要求:LPUSHX 命令和 RPUSHX 命令从 Redis 2.2.0 版本开始可用。