Redis BRPOPLPUSH命令

Redis BRPOPLPUSH命令教程

Redis 的 BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定 列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。

当列表 source 为空时,BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSHRPUSH 命令为止。

超时参数 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)

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

最后,我们使用 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,列表不存在。

最后,我们使用 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命令总结

Redis 的 BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时,BRPOPLPUSH 的表现和 RPOPLPUSH 一样。Redis BRPOPLPUSH 命令语法:

192.168.98.70:6379> BRPOPLPUSH source destination timeout