Redis BRPOP命令

Redis BRPOP命令教程

Redis 的 BRPOP 是 列表 的阻塞式弹出原语。它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到超时或有元素可弹出为止。

当给定多个 KEY 参数时,按参数 KEY 的先后顺序依次检查各个列表,弹出第一个非空列表的尾元素。timeout 参数是阻塞的时长,单位秒。如果该参数为 0,则永久阻塞,直到列表有可弹出元素。

Redis BRPOP命令详解

语法

192.168.98.70:6379> BRPOP KEY [KEY ...] timeout

参数

参数 描述
KEY 要弹出值的列表的键。
timeout 阻塞的时长,单位秒,如果该参数为 0,则永久阻塞。

返回值

如果列表为空,返回 nil 。否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 KEY ,第二个元素是被弹出元素的值。

时间复杂度

O(1)

可用版本

>= 2.0.0

BRPOP的保证

当存在多个给定 KEY 时, BRPOP 按给定 KEY 参数排列的先后顺序,依次检查各个列表。

假设现在有 HTML 、 JavaScript 和 Tool 三个列表,其中 HTML 不存在, JavaScript 和 Tool 都是非空列表。考虑以下命令:

BRPOP HTML JavaScript Tool 0

BRPOP 保证返回的元素来自 JavaScript ,因为它是按 ”查找 HTML -> 查找 JavaScript -> 查找 Tool “ 这样的顺序,第一个找到的非空列表。

案例

列表不存在,超时

列表不存在时,设置超时时间

192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> BRPOP haicoder 10 (nil) (10.12s)

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

最后,我们使用 BRPOP 命令,移除并返回键为 haicoder 的列表尾的第一个元素,因为列表为空,并且超时时间是 10 秒,超时时间到,返回 nil,并返回了实际被阻塞的时间。

列表不存在,永久阻塞

列表不存在时,设置超时时间为 0,永久阻塞

192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> BRPOP haicoder 0

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

最后,我们使用 BRPOP 命令,移除并返回键为 haicoder 的列表尾的第一个元素,因为列表为空,并且超时时间是 0秒,即永久阻塞,此时没有任何返回。

列表存在

列表存在时,返回列表尾的第一个元素

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

首先,我们使用 RPUSH 命令,向键为 haicoder 的列表尾部插入元素 Redis。使用 RPUSH 命令,向键为 haicoder 的列表尾部插入元素 Mongo。

接着,我们使用 RPUSH 命令,向键为 haicoder 的列表尾部插入元素 Mysql 和 Memcache。

最后,我们使用 BRPOP 命令,移除并返回键为 haicoder 的列表尾的第一个元素,超时时间为 10 秒,返回列表的 KEY 和其尾部的第一个元素。

直到列表有可弹出元素

列表不存在时,设置超时时间为 0,等到有可弹出元素时返回

# 一直阻塞 192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> BRPOP haicoder 0 # 开启新的连接,向列表添加元素 192.168.98.70:6379> LPUSH haicoder Redis (integer) 1 # 上面的阻塞有返回 192.168.98.70:6379> BRPOP haicoder 0 1) "haicoder" 2) "Redis" (22.28s)

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

接着,我们使用 BRPOP 命令,移除并返回键为 haicoder 的列表尾的第一个元素,因为列表为空,并且超时时间是 0秒,即永久阻塞,此时没有任何返回。

最后,我们使用客户端,开启一个新的连接,向列表里添加一个元素。添加完成后,上面阻塞的 BRPOP 命令,立刻开始有返回。

多个键

多个键存在时,保证返回第一个非空列表的尾部第一个元素

192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> RPUSH hicoder Redis (integer) 1 192.168.98.70:6379> BRPOP haicoder hicoder 10 1) "hicoder" 2) "Redis"

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

接着,我们使用 BRPOP 命令,弹出列表 haicoder 和 hicoder 的元素,因为列表 haicoder 为空,列表 hicoder 不为空,所以返回了列表 hicoder 的第一个元素。

Redis BRPOP命令总结

Redis 的 BRPOP 是列表的阻塞式弹出原语。它是 RPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BRPOP 命令阻塞,直到超时或有元素可弹出为止。Redis BRPOP 命令语法:

192.168.98.70:6379> BRPOP KEY [KEY ...] timeout