Redis 的 BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定 列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。
当列表 source 为空时,BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。
超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示永久阻塞 。
192.168.98.70:6379> BRPOPLPUSH source destination timeout
参数 | 描述 |
---|---|
source | 要弹出最后一个元素的列表。 |
destination | 要将弹出的元素插入的列表。 |
timeout | 超时时间,秒为单位。 |
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。
O(1)
>= 2.2.0
source 不存在,设置超时时间
192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> BRPOPLPUSH haicoder hicoder 10 (nil) (10.84s)
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。
最后,我们使用 BRPOPLPUSH 命令,移除并返回键为 haicoder 的列表尾的第一个元素同时插入列表 hicoder,因为列表 haicoder 为空,所以超时后返回。
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 不存在,执行成功
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,列表不存在。
最后,我们使用 LRANGE 命令,获取键为 hicoder 的列表的所有元素,即目的列表的所有元素,返回了源列表中的元素 Redis,即插入目的列表成功。
列表不存在时,设置超时时间为 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 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。Redis BRPOPLPUSH 命令语法:
192.168.98.70:6379> BRPOPLPUSH source destination timeout