RPOPLPUSH:将右端弹出的元素推入到左端
RPOPLPUSH
命令的行为和它的名字一样,它首先使用 RPOP
命令将源列表最右端的元素弹出,然后使用 LPUSH
命令将被弹出的元素推入到目标列表左端,使之成为目标列表的最左端元素:
- RPOPLPUSH source target
RPOPLPUSH
命令会返回被弹出的元素作为结果。
作为例子,以下代码展示了如何使用 RPOPLPUSH
命令,将列表 list1
的最右端元素弹出,然后将其推入至列表 list2
的左端:
- redis> RPUSH list1 "a" "b" "c" -- 创建两个示例列表 list1 和 list2
- (integer) 3
- redis> RPUSH list2 "d" "e" "f"
- (integer) 3
- redis> RPOPLPUSH list1 list2
- "c"
- redis> RPOPLPUSH list1 list2
- "b"
- redis> RPOPLPUSH list1 list2
- "a"
图 4-13 展示了列表 list1
和 list2
在执行以上 RPOPLPUSH
命令时的变化过程:
在
RPOPLPUSH
命令执行之前,list1
和list2
都包含三个元素;执行第一个
RPOPLPUSH
命令,弹出list1
的最右端元素"c"
,并将其推入至list2
的左端;执行第二个
RPOPLPUSH
命令,弹出list1
的最右端元素"b"
,并将其推入至list2
的左端;执行第三个
RPOPLPUSH
命令,弹出list1
的最右端元素"a"
,并将其推入至list2
的左端;在以上三个
RPOPLPUSH
命令执行完毕之后,list1
将变为空列表,而list2
则会包含六个元素。
图 4-13 RPOPLPUSH
命令的执行过程
源列表和目标列表相同
RPOPLPUSH
命令允许用户将源列表和目标列表设置为同一个列表:在这种情况下,RPOPLPUSH
命令的效果就相当于将列表最右端的元素变成列表最左端的元素。
比如以下代码就展示了如何通过 RPOPLPUSH
命令,将 rotate-list
列表的最右端元素变成列表的最左端元素:
- redis> RPUSH rotate-list "a" "b" "c" -- 创建一个示例列表
- (integer) 3
- redis> RPOPLPUSH rotate-list rotate-list
- "c"
- redis> RPOPLPUSH rotate-list rotate-list
- "b"
- redis> RPOPLPUSH rotate-list rotate-list
- "a"
图 4-14 展示了以上三个 RPOPLPUSH
命令在执行时,rotate-list
列表的整个变化过程:
在
RPOPLPUSH
命令执行之前,列表包含"a"
、"b"
、"c"
三个元素。执行第一个
RPOPLPUSH
命令,将最右端元素"c"
变为最左端元素。执行第二个
RPOPLPUSH
命令,将最右端元素"b"
变为最左端元素。执行第三个
RPOPLPUSH
命令,将最右端元素"a"
变为最左端元素。在以上三个
RPOPLPUSH
命令执行完毕之后,列表又重新回到了原样。
图 4-14 使用 RPOPLPUSH
对列表元素进行轮换
正如上面展示的例子所示,通过对同一个列表重复执行 RPOPLPUSH
命令,我们可以创建出一个对元素进行轮换的列表;并且当我们对一个包含了 N 个元素的列表重复执行 N 次 RPOPLPUSH
命令之后,列表元素的排列顺序将变回原来的样子。
处理空列表
如果用户传给 RPOPLPUSH
命令的源列表并不存在,那么 RPOPLPUSH
命令将放弃执行弹出和推入操作,只返回一个空值表示命令执行失败:
- redis> RPOPLPUSH list-x list-y
- (nil)
另一方面,如果源列表非空,但是目标列表为空,那么 RPOPLPUSH
命令将正常执行弹出操作和推入操作:
- redis> RPUSH list-x "a" "b" "c" -- 将 list-x 变为非空列表
- (integer) 3
- redis> RPOPLPUSH list-x list-y
- "c"
图 4-15 展示了这条 RPOPLPUSH
命令执行之前和执行之后,list-x
和 list-y
的变化:
在执行
RPOPLPUSH
命令之前,list-x
包含三个元素,而list-y
为空。执行
RPOPLPUSH
命令,将list-x
的最右端元素"c"
弹出,并将其推入至list-y
的左端。在
RPOPLPUSH
命令执行完毕之后,list-x
将包含两个元素,而list-y
则包含一个元素。
图 4-15 RPOPLPUSH
命令处理目标列表为空的例子
其他信息
属性 | 值 |
---|---|
复杂度 | O(1) |
版本要求 | RPOPLPUSH 命令从 Redis 1.2.0 版本开始可用。 |