RPOPLPUSH 命令会返回被弹出的元素作为结果。

    作为例子,以下代码展示了如何使用 RPOPLPUSH 命令,将列表 list1 的最右端元素弹出,然后将其推入至列表 list2 的左端:

    图 4-13 展示了列表 list1list2 在执行以上 RPOPLPUSH 命令时的变化过程:

    • RPOPLPUSH 命令执行之前,list1list2 都包含三个元素;

    • 执行第二个 RPOPLPUSH 命令,弹出 list1 的最右端元素 "b" ,并将其推入至 list2 的左端;

    • 执行第三个 RPOPLPUSH 命令,弹出 的最右端元素 "a" ,并将其推入至 list2 的左端;

    • 在以上三个 RPOPLPUSH 命令执行完毕之后,list1 将变为空列表,而 list2 则会包含六个元素。



    RPOPLPUSH 命令允许用户将源列表和目标列表设置为同一个列表:在这种情况下,RPOPLPUSH 命令的效果就相当于将列表最右端的元素变成列表最左端的元素。

    比如以下代码就展示了如何通过 RPOPLPUSH 命令,将 rotate-list 列表的最右端元素变成列表的最左端元素:

    图 4-14 展示了以上三个 RPOPLPUSH 命令在执行时,rotate-list 列表的整个变化过程:

    • RPOPLPUSH 命令执行之前,列表包含 "a""b""c" 三个元素。

    • 执行第二个 RPOPLPUSH 命令,将最右端元素 "b" 变为最左端元素。

    • 执行第三个 RPOPLPUSH 命令,将最右端元素 变为最左端元素。

    • 在以上三个 RPOPLPUSH 命令执行完毕之后,列表又重新回到了原样。



    正如上面展示的例子所示,通过对同一个列表重复执行 RPOPLPUSH 命令,我们可以创建出一个对元素进行轮换的列表;并且当我们对一个包含了 N 个元素的列表重复执行 N 次 RPOPLPUSH 命令之后,列表元素的排列顺序将变回原来的样子。

    如果用户传给 RPOPLPUSH 命令的源列表并不存在,那么 RPOPLPUSH 命令将放弃执行弹出和推入操作,只返回一个空值表示命令执行失败:

    另一方面,如果源列表非空,但是目标列表为空,那么 RPOPLPUSH 命令将正常执行弹出操作和推入操作:

    图 4-15 展示了这条 RPOPLPUSH 命令执行之前和执行之后,list-xlist-y 的变化:

    • 在执行 RPOPLPUSH 命令之前,list-x 包含三个元素,而 list-y 为空。

    • RPOPLPUSH 命令执行完毕之后,list-x 将包含两个元素,而 list-y 则包含一个元素。


    图 4-15 RPOPLPUSH 命令处理目标列表为空的例子