Redis BLPOP命令

Redis BLPOP命令是以阻塞方式从列表中弹出元素的原子操作。 它是LPOP的阻塞版本,因为给定列表没有可弹出的元素时,它会阻塞连接。 该命令按给定的键顺序检查列表,从第一个非空的列表的头部弹出一个元素。

非阻塞的情形 调用BLPOP时,如果至少一个指定键处存储的是一个非空列表,则会从列表的开头弹出一个元素,并将元素与键一起返回给调用方。

按照给定的顺序检查键。 假设键list1不存在,而list2list3存储非空列表。 可以使用以下命令:

BLPOP list1 list2 list3 0

BLPOP命令确保从存储在list2的列表中返回一个元素(因为按顺序检查list1list2list3时,它是第一个非空列表)。

阻塞的情形

如果指定的键不存在,则BLPOP会阻塞连接,直到其它客户端对其中一个键执行LPUSH或RPUSH操作。

一旦其中一个列表有了新数据,客户端将返回键名称并对其进行解除阻塞,并弹出值。

当BLPOP导致客户端阻塞并且指定了非零超时间时,如果指定的超时时间已到而没有任何指定键执行了压入操作,则客户端将取消阻塞,返回nil

timeout参数为一个整数值,该值指定要阻塞的最大秒数。指定为0可以无限期地阻塞。

什么样的键会先被处理?客户端呢?元素呢?优先级排序详情。

  • 如果客户端尝试阻塞多个键,但是至少一个键包含元素,则返回的键/元素对是从左到右排序的第一个拥有一个或多个元素的键。在这种情况下,客户端不会被阻塞。因此,例如BLPOP key1 key2 key3 key4 0(假设key2key4均为非空)将始终从key2返回一个元素。
  • 如果同一键阻塞了多个客户端,则要响应的客户端是等待更多时间的客户端(第一个被键阻塞的客户端)。客​​户端解除阻塞后,它的优先级不会被保留。当客​​户端再次调用BLPOP再次被阻塞时,将根据被阻塞顺序依次响应客户端(从第一个被阻塞的键开始到最后一个)。
  • 当客户端同时阻塞多个键,并且元素同时在多个键中可用(由于事务或Lua脚本将元素添加到多个列表中)时,将使用第一个执行了push操作的键解除客户端的阻塞(假设它新压入的元素不会已经被其它客户端使用,因为可能还有其他客户也在等待此键)。基本上,在执行每个命令之后,Redis将运行所有接收到数据且至少有一个客户端被阻塞的键的列表。这些列表按新元素的到达时间排序,从接收数据的第一个键到最后一个。对于每个要响应的键,只要此键中包含元素,Redis将以FIFO方式为所有等待该键的客户端提供服务。当键为空或不再有客户端等待此键时,将处理下一个键(从上一个命令/事务/脚本中接收到的新数据的下一个键),依此类推。

可用版本:从2.0.0开始可用
时间复杂度:O(1)

命令格式

BLPOP key [key ...] timeout

示例

redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BRPOP list1 list2 0
1) "list1"
2) "c"

返回值

  • 当超时时间已到还没有任何元素可以弹出时返回nil
  • 一个由两个元素组成的数组,第一个元素是在其中弹出元素的键的名称,第二个元素是弹出元素的值。