LPUSHX、RPUSHX:只对已存在的列表执行推入操作
当用户调用 LPUSH
命令或是 RPUSH
命令尝试将元素推入到列表的时候,如果给定的列表并不存在,那么命令将自动创建一个空列表,并将元素推入到刚刚创建的列表里面。
比如对于空列表 list1
和 list2
来说,执行以下命令将创建图 4-9 所示的两个列表:
- redis> LPUSH list1 "item1"
- (integer) 1
- redis> RPUSH list2 "item1"
- (integer) 1
图 4-9 两个只包含单个元素的列表
除了 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 -- 执行推入操作之后,列表包含两个元素
- redis> RPUSHX list3 "item-y"
- (integer) 3 -- 执行推入操作之后,列表包含三个元素
图 4-10 展示了列表 list3
的整个变化过程:
在最初的
LPUSHX
命令和RPUSHX
命令执行之后,list3
仍然是一个空列表。执行
LPUSH
命令,将元素"item1"
推入到列表里面,使之变为非空。执行
LPUSHX
命令,将元素"item-x"
推入列表,使得列表包含两个元素。执行
RPUSHX
命令,将元素"item-y"
推入列表,使得列表包含三个元素。
图 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 版本开始可用。 |