Redis BRPOPLPUSH命令教程
当列表 source 为空时,BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行
超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示永久阻塞 。
Redis BRPOPLPUSH命令详解
语法
192.168.98.70:6379> BRPOPLPUSH source destination timeout
参数
参数
描述
source
要弹出最后一个元素的列表。
destination
要将弹出的元素插入的列表。
timeout
超时时间,秒为单位。
返回值
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
时间复杂度
O(1)
可用版本
>= 2.2.0
案例
source不存在,超时
source 不存在,设置超时时间
192.168.98.70:6379> LLEN haicoder
(integer) 0
192.168.98.70:6379> BRPOPLPUSH haicoder hicoder 10
(nil)
(10.84s)
我们首先,使用
最后,我们使用 BRPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,因为列表 haicoder 为空,所以超时后返回。
source不存在,阻塞
source 不存在,设置超时时间为 0,永久阻塞
192.168.98.70:6379> LLEN haicoder
(integer) 0
192.168.98.70:6379> BRPOPLPUSH haicoder hicoder 0
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。
最后,我们使用 BRPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,因为列表 haicoder 为空,同时超时时间为 0 ,所以永久阻塞。
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> BRPOPLPUSH haicoder hicoder 10
"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,即列表不存在。
接着,我们使用 BRPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,此时源列表存在,但目的列表不存在,命令执行成功。
使用 LLEN 命令,获取键为 haicoder 的列表的长度,即源列表的长度,返回 0,列表不存在。
最后,我们使用
直到列表有可弹出元素
列表不存在时,设置超时时间为 0,等到有可弹出元素时返回
#一直阻塞
192.168.98.70:6379> LLEN haicoder
(integer) 0
192.168.98.70:6379> BRPOPLPUSH haicoder hicoder 0
#开启新的连接,向列表添加元素
192.168.98.70:6379> LPUSH haicoder Redis
(integer) 1
#上面的阻塞有返回
192.168.98.70:6379> BRPOPLPUSH haicoder hicoder 0
"Redis"
(22.79s)
#查看源列表
192.168.98.70:6379> LRANGE haicoder 0 -1
(empty list or set)
#查看目的列表
192.168.98.70:6379> LRANGE hicoder 0 -1
1) "Redis"
192.168.98.70:6379> DEL hicoder
(integer) 1
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。
接着,我们使用 BRPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,因为列表 haicoder 为空,同时超时时间为 0 ,所以永久阻塞。
此时,我们使用客户端,开启一个新的连接,向源列表里添加一个元素。添加完成后,上面阻塞的 BRPOPLPUSH 命令,立刻开始有返回。
最后,我们使用 LRANGE 查看源列表为空列表。使用 LRANGE 查看目的列表含有一个源列表原来添加的元素。
Redis BRPOPLPUSH命令总结
Redis 的 BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。Redis BRPOPLPUSH 命令语法:
192.168.98.70:6379> BRPOPLPUSH source destination timeout