Redis 的 RPOPLPUSH 命令在一个原子时间内,执行以下两个动作:
如果 source 不存在,值 nil 被返回,并且不执行其他动作。
如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
192.168.98.70:6379> RPOPLPUSH source destination
参数 | 描述 |
---|---|
source | 要弹出最后一个元素的列表。 |
destination | 要将弹出的元素插入的列表。 |
被弹出的元素。
O(1)
>= 1.2.0
两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z 。
执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。
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 不存在,执行成功
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 存在,执行成功
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 相同,相当于列表反转
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 命令语法:
192.168.98.70:6379> RPOPLPUSH source destination