1.   命令帮助

通过Redis-cli中的help进行查看:

127.0.0.1:6379>help BLPOP

 

  BLPOP key [key ...] timeout

  summary: Remove and get the first element ina list, or block until one is available

  since: 2.0.0

  group: list

 

127.0.0.1:6379>help BRPOP

 

  BRPOP key [key ...] timeout

  summary: Remove and get the last element in alist, or block until one is available

  since: 2.0.0

  group: list

通过列表详细描述:

命令

作用

复杂度

BLPOP key [key ...] timeout

LPOP 命令的阻塞版本;命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最左端的项; 如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为 止;

设置 timeout参数为0表示永远阻塞。

O(N),N 为输入列表的数量。

BRPOP key [key ...] timeout

RPOP命令的阻塞版本: 命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最右端的项; 如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为 止;

设置 timeout参数为0表示永远阻塞。

O(N),N 为输入列表的数量。

 

 

2. BLPOP/BRPOP实战

访问四个空的列表,并且设置阻塞时间为60秒

127.0.0.1:6379>BLPOP list1list2 list3 list4 60

(nil)

(60.02s)

通过返回的结果,nil表示等待超时,没有弹出数据,同时60.02s表示客户端被阻塞的时长。

 

下面我们设置list1列表的值为"Spark" "Hadoop" "Hive",然后再进行如下操作:

127.0.0.1:6379>RPUSH list1  "Spark" "hadoop""hive"

(integer) 3

127.0.0.1:6379>LRANGE list1 0 -1

1)"Spark"

2)"Hadoop"

3)"Hive"

 

127.0.0.1:6379>BLPOP list1 list2 list3 list4 60

1)"list1" #执行弹出操作的列表

2)"Spark" #被弹出的项

我们发现list1不为空,于是执行弹出命令(#后面为注释)。

 

我们也可以先执行阻塞操作,然后在等待过程设置列表的值,如下:

终端A: 执行如下命令,阻塞中

127.0.0.1:6379>BLPOP list2 list3 list4 60

 

终端B: 设置list2值

127.0.0.1:6379>RPUSH list2 "Scala" "Sqoop"

(integer) 2

 

同时我们查看终端A时会发现,已经弹出结果了

127.0.0.1:6379>BLPOP list2 list3 list4 60

1)"list2" #执行弹出操作的列表

2)"scala" #被弹出的项

(6.28s)    #客户端被阻塞的时长

 

 

3. 下面介绍几种情形:

3.1 非阻塞

当发现给定的列表中至少一个非空列表时,BLPOP和BRPOP就会立即从那个列表里面弹出元素,

在这种情况下,BLPOP就像一个接受多参数的LPOP命令,而BRPOP就像一个接受多参数的RPOP命令。

 

3.2 阻塞并超时

如果所有给定的列表都是空的,那么BLPOP/BRPOP将被被阻塞。

如果在阻塞的过程中,给定的列表一直没有新项被推入,那么当设定的超时时间到达之后,

命令将向被阻塞的客户端返回nil。

 

3.3 阻塞并弹出情况

如果在客户端A被阻塞的过程中,有另一个客户端B给造成客户端A被阻塞的列表推入了新项,那么

服务器会将这个新项返回给客户端A。

 

4. BLPOP/BRPOP的先到先服务原则

如果有多个客户端同时因为某个列表而被阻塞,那么当有新值被推入到这个列表时,服务器就会按照先到先服务原则,优先向最早被阻塞的客户端返回新值。