RPOPLPUSH:将右端弹出的元素推入到左端

RPOPLPUSH 命令的行为和它的名字一样,它首先使用 RPOP 命令将源列表最右端的元素弹出,然后使用 LPUSH 命令将被弹出的元素推入到目标列表左端,使之成为目标列表的最左端元素:

  1. RPOPLPUSH source target

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

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

  1. redis> RPUSH list1 "a" "b" "c" -- 创建两个示例列表 list1 list2
  2. (integer) 3
  3.  
  4. redis> RPUSH list2 "d" "e" "f"
  5. (integer) 3
  6.  
  7. redis> RPOPLPUSH list1 list2
  8. "c"
  9.  
  10. redis> RPOPLPUSH list1 list2
  11. "b"
  12.  
  13. redis> RPOPLPUSH list1 list2
  14. "a"

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

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

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

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

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

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


图 4-13 RPOPLPUSH 命令的执行过程_images/IMAGE_RL.jpeg


源列表和目标列表相同

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

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

  1. redis> RPUSH rotate-list "a" "b" "c" -- 创建一个示例列表
  2. (integer) 3
  3.  
  4. redis> RPOPLPUSH rotate-list rotate-list
  5. "c"
  6.  
  7. redis> RPOPLPUSH rotate-list rotate-list
  8. "b"
  9.  
  10. redis> RPOPLPUSH rotate-list rotate-list
  11. "a"

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

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

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

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

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

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


图 4-14 使用 RPOPLPUSH 对列表元素进行轮换_images/IMAGE_ROTATE.jpeg


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

处理空列表

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

  1. redis> RPOPLPUSH list-x list-y
  2. (nil)

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

  1. redis> RPUSH list-x "a" "b" "c" -- list-x 变为非空列表
  2. (integer) 3
  3.  
  4. redis> RPOPLPUSH list-x list-y
  5. "c"

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

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

  • 执行 RPOPLPUSH 命令,将 list-x 的最右端元素 "c" 弹出,并将其推入至 list-y 的左端。

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


图 4-15 RPOPLPUSH 命令处理目标列表为空的例子_images/IMAGE_EMPTY_RL.jpeg

其他信息

属性
复杂度O(1)
版本要求RPOPLPUSH 命令从 Redis 1.2.0 版本开始可用。