BLPOP和BRPOP命令
Redis 命令以来第一次用到阻塞概念,什么是阻塞?就是在调用函数的时候,如果不能马上得到想要的,就开始等待的状态,并不返回数据,当条件满足后立即返回,这就是函数阻塞,这篇笔记之前总结的命令都是非阻塞的,也就是无论有无结果都会立即返回,接下来具体看一下今天的这两个阻塞命令。
BLPOP 命令是 LPOP 命令的阻塞版本,也是从列表的头部弹出一个元素,不同的是 LPOP 命令如果指定的弹出列表不存在或者为空,则直接返回,而 BLPOP 命令如果指定的弹出列表不存在或者为空,则会一直等待到超时时间返回(nil)或者一直等到列表中被其他链接插入元素时,再弹出返回。
还有一点不同是 LPOP 命令只能指定一个参数,弹出一个列表的表头,但是 BLPOP 命令后面可以跟多个列表,有一个满足弹出条件的就可以直接弹出返回。
BLPOP 命令最后一个参数 timeout 是超时时间,单位是秒,如果 timeout 大于0,则到达指定的秒数即使没有弹出成功也会返回,如果 timeout 的值为0,则会一直阻塞等待其他连接向列表中插入元素, timeout 参数不允许为负数。
BLPOP 命令上面提到可以跟多个列表参数,其顺序是从左往右依次判断的,找到一个非空的列表就会立即返回,如果所有的列表都不存在或者为空,则阻塞等待,正常返回时返回的类型是一个列表,一共包含两个值,第一个是操作弹出的列表,第二个是弹出的元素。
因为这个命令是阻塞的,就会涉及到顺序问题,比如一个连接A对空列表执行了命令 BLPOP nolist 0,然后连接B也对空列表执行了命令 BLPOP nolist 0,那么这两个连接都会被阻塞,当有其他的连接向列表 nolist 插入一个元素是,究竟哪个连接该返回呢?还是同时返回?
Redis 的处理方法是维护一个阻塞队列,提供先阻塞先服务的机制,当多个阻塞同时满足唤醒条件时,先阻塞的命令被优先唤醒。
浙公网安备 33010602011771号