Redis 的 BLPOP 是 列表 的阻塞式弹出原语。它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到超时或有元素可弹出为止。
当给定多个 KEY 参数时,按参数 KEY 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。timeout 参数是阻塞的时长,单位秒。如果该参数为 0,则永久阻塞,直到列表有可弹出元素。
192.168.98.70:6379> BLPOP KEY [KEY ...] timeout
参数 | 描述 |
---|---|
KEY | 要弹出值的列表的键。 |
timeout | 阻塞的时长,单位秒,如果该参数为 0,则永久阻塞。 |
如果列表为空,返回 nil 。否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 KEY ,第二个元素是被弹出元素的值。
O(1)
>= 2.0.0
当存在多个给定 KEY 时, BLPOP 按给定 KEY 参数排列的先后顺序,依次检查各个列表。
假设现在有 HTML 、 JavaScript 和 Tool 三个列表,其中 HTML 不存在, JavaScript 和 Tool 都是非空列表。考虑以下命令:
BLPOP HTML JavaScript Tool 0
BLPOP 保证返回的元素来自 JavaScript ,因为它是按 ”查找 HTML -> 查找 JavaScript -> 查找 Tool “ 这样的顺序,第一个找到的非空列表。
列表不存在时,设置超时时间
192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> BLPOP haicoder 10 (nil) (10.86s)
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。
最后,我们使用 BLPOP 命令,移除并返回键为 haicoder 的列表头的第一个元素,因为列表为空,并且超时时间是 10秒,超时时间到,返回 nil,并返回了实际被阻塞的时间。
列表不存在时,设置超时时间为 0,永久阻塞
192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> BLPOP haicoder 0
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。
接着,我们使用 BLPOP 命令,移除并返回键为 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> BLPOP haicoder 10 1) "haicoder" 2) "Redis" 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "Mongo" 2) "Mysql" 3) "Memcache" 192.168.98.70:6379> BLPOP haicoder 10 1) "haicoder" 2) "Mongo" 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "Mysql" 2) "Memcache" 192.168.98.70:6379> BLPOP haicoder 10 1) "haicoder" 2) "Mysql" 192.168.98.70:6379> LRANGE haicoder 0 -1 1) "Memcache" 192.168.98.70:6379> DEL haicoder (integer) 1
我们首先,使用 RPUSH 命令,向键为 haicoder 的列表尾部插入元素 Redis。使用 RPUSH 命令,向键为 haicoder 的列表尾部插入元素 Mongo。
接着,我们使用 RPUSH 命令,向键为 haicoder 的列表尾部插入元素 Mysql 和 Memcache。
最后,我们使用 BLPOP 命令,移除并返回键为 haicoder 的列表的第一个元素,超时时间为 10秒,返回列表的 KEY 和其第一个元素。
列表不存在时,设置超时时间为 0,等到有可弹出元素时返回
# 一直阻塞
192.168.98.70:6379> LLEN haicoder
(integer) 0
192.168.98.70:6379> BLPOP haicoder 0
# 开启新的连接,向列表添加元素
192.168.98.70:6379> LPUSH haicoder Redis
(integer) 1
# 上面的阻塞有返回
192.168.98.70:6379> BLPOP haicoder 0
1) "haicoder"
2) "Redis"
(22.28s)
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。
接着,使用 BLPOP 命令,移除并返回键为 haicoder 的列表头的第一个元素,因为列表为空,并且超时时间是 0秒,即永久阻塞,此时没有任何返回。
最后,我们使用客户端,开启一个新的连接,向列表里添加一个元素。添加完成后,上面阻塞的 BLPOP 命令,立刻开始有返回。
多个键存在时,保证返回第一个非空列表的第一个元素
192.168.98.70:6379> LLEN haicoder (integer) 0 192.168.98.70:6379> RPUSH hicoder Redis (integer) 1 192.168.98.70:6379> BLPOP haicoder hicoder 10 1) "hicoder" 2) "Redis"
我们首先,使用 LLEN 命令,获取键为 haicoder 的列表的长度,返回 0,即列表不存在。接着,使用 RPUSH 命令,向键为 hicoder 的列表尾部插入元素 Redis。
最后,我们使用 BLPOP 命令,弹出列表 haicoder 和 hicoder 的元素,因为列表 haicoder 为空,列表 hicoder 不为空,所以返回了列表 hicoder 的第一个元素。
Redis 的 BLPOP 是列表的阻塞式弹出原语。它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到超时或有元素可弹出为止。Redis BLPOP 命令语法:
192.168.98.70:6379> BLPOP KEY [KEY ...] timeout