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 命令的阻塞版本;命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最左端的项; 如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为 止; |
O(N),N 为输入列表的数量。 |
BRPOP key [key ...] timeout |
RPOP命令的阻塞版本: 命令会以从左到右的顺序,访问给定的各个列表,并弹出首个非空列表最右端的项; 如果所有给定列表都为空,那么客户端将被阻塞,直到等待超时,或者有可弹出的项出现为 止; |
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的先到先服务原则
如果有多个客户端同时因为某个列表而被阻塞,那么当有新值被推入到这个列表时,服务器就会按照先到先服务原则,优先向最早被阻塞的客户端返回新值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Redis的阻塞式列表解析 - Python技术站