Redis RPOPLPUSH命令

Redis RPOPLPUSH命令教程

Redis 的 RPOPLPUSH 命令在一个原子时间内,执行以下两个动作:

  • 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
  • 将 source 弹出的元素插入到 列表 destination ,作为 destination 列表的的头元素。

如果 source 不存在,值 nil 被返回,并且不执行其他动作。

如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

Redis RPOPLPUSH命令详解

语法

192.168.98.70:6379> RPOPLPUSH source destination

参数

参数 描述
source 要弹出最后一个元素的列表。
destination 要将弹出的元素插入的列表。

返回值

被弹出的元素。

时间复杂度

O(1)

可用版本

>= 1.2.0

RPOPLPUSH的保证

两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z 。

执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。

案例

source不存在

source 不存在,返回 nil,不执行任何操作

192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> RPOPLPUSH haicoder hicoder (nil)

我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。

最后,我们使用 RPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,因为列表 haicoder 为空,所以返回 nil,命令执行失败。

destination不存在

destination 不存在,执行成功

192.168.98.70:6379> RPUSH haicoder Redis (integer) 1 192.168.98.70:6379> LLEN hicoder (integer) 0 192.168.98.70:6379> RPOPLPUSH haicoder hicoder "Redis" 192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> LRANGE hicoder 0 -1 1) "Redis" 192.168.98.70:6379> DEL hicoder (integer) 1

我们首先,使用 RPUSH 命令向键为 haicoder 的列表中插入值 Redis。使用 LLEN 命令,获取键为 hicoder 的列表的长度,返回 0,即列表不存在。

接着,我们使用 RPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,此时源列表存在,但目的列表不存在,命令执行成功。

使用 LLEN 命令,获取键为 haicoder 的列表的长度,即源列表的长度,返回 0,列表不存在。

最火,我们使用 LRANGE 命令,获取键为 hicoder 的列表的所有元素,即目的列表的所有元素,返回了源列表中的元素 Redis,即插入目的列表成功。

source存在,destination存在

source 存在,destination 存在,执行成功

192.168.98.70:6379> RPUSH haicoder Redis (integer) 1 192.168.98.70:6379> RPUSH hicoder Mongo (integer) 1 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "Redis" 192.168.98.70:6379> LRANGE hicoder 0 -1 1) "Mongo" 192.168.98.70:6379> RPOPLPUSH haicoder hicoder "Redis" 192.168.98.70:6379> LRANGE haicoder 0 -1 (empty list or set) 192.168.98.70:6379> LRANGE hicoder 0 -1 1) "Redis" 2) "Mongo" 192.168.98.70:6379> DEL hicoder (integer) 1

我们首先,使用 RPUSH 命令向键为 haicoder 的列表中插入值 Redis。使用 RPUSH 命令向键为 hicoder 的列表中插入值 Mongo。

接着,我们使用 RPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder。使用 LRANGE 命令,获取键为 haicoder 的列表的所有元素,返回空列表。

最后,我们使用 LRANGE 命令,获取键为 hicoder 的列表的所有元素,即目的列表的所有元素,此时目的列表的头部增加了元素 Redis。

source和destination相同

source 和 destination 相同,相当于列表反转

192.168.98.70:6379> RPUSH haicoder Redis Mongo Mysql SqlServer Memcache (integer) 5 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "Redis" 2) "Mongo" 3) "Mysql" 4) "SqlServer" 5) "Memcache" 192.168.98.70:6379> RPOPLPUSH haicoder haicoder "Memcache" 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "Memcache" 2) "Redis" 3) "Mongo" 4) "Mysql" 5) "SqlServer" 192.168.98.70:6379> RPOPLPUSH haicoder haicoder "SqlServer" 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "SqlServer" 2) "Memcache" 3) "Redis" 4) "Mongo" 5) "Mysql" 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 RPUSH 命令向键为 haicoder 的列表中批量插入值 Redis、Mongo、Mysql、SqlServer 和 Memcache。

使用 RPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 haicoder,即源列表与目的列表相同。

接着,我们使用 LRANGE 命令,获取键为 haicoder 的列表的所有元素,发现原来的列表尾的元素 Memcache 变成了列表头元素。

再次使用 RPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 haicoder,即源列表与目的列表相同。

最后,我们使用 LRANGE 命令,获取键为 haicoder 的列表的所有元素,发现原来的列表尾的元素 SqlServer 变成了列表头元素。

Redis RPOPLPUSH命令总结

Redis 的 RPOPLPUSH 命令在一个原子时间内,执行以下两个动作:

  • 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
  • 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。

Redis RPOPLPUSH 命令语法:

192.168.98.70:6379> RPOPLPUSH source destination