目录
blpop
1.语法
BLPOP key [key …] timeout
2.解析
blpop的列表的阻塞式弹出原语。
它是lpop命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被blpop命令阻塞,
直到等待超时或被发现可弹元素为止。
当给定多个key参数时,按参数key的先后顺序依次检查各个列表,弹出第一个非空列表的头元素
非阻塞行为
当blpop被调用时,如果给定key内至少有一个非空列表,那么弹出遇到的第一个非空列表的头元素,
并和被弹出元素所属的列表名字一起,组成结果返回给调用者。
当存在多个给定的key时,blpop按给定key参数排列的先后顺序,依次检查各个列表
假设现在有m,p和l三个列表,其中m不存在,p和l都持有非空列表,以下命令:
blpop m p l 0
blpop保证返回的元素来自p,因为它是按m->p->l的顺序查找的,第一个找到的非空列表
del m p l #确保其中的key被删除
lpush p 'pink'
lpush l 'link'
blpop m p l 0 //m列表为空 跳过 紧接着p列表的第一个元素被弹出
1) "p" //所属的列表
2) "pink" //元素所属的值
阻塞行为
如果所有给定的key都不存在或包含空列表,那么blpop命令将阻塞链接,直到等待超时,
或有另一个客户端对给定key的任意一个执行lpush或rpush命令为止
超时参数timeout接受一个以秒为单位的数字作为值。超时参数设为0表示阻塞时间可以无限期延长
exists m
exists p
blpop m p 300 //由于key不存在所以阻塞 使用另一个客户端对m或者p进行操作
另一个客户端操作:lpush m hello
上面blpop返回
1) "m"
2) "hello"
(60.99s)
blpop m p 5//等待超时的情况
(nil)
(5.08s)
相同的key被多个客户端同时阻塞
相同的key可以被多个客户端同时阻塞
不同的客户端被放进一个队列中,按先阻塞先服务的顺序为key执行blpop命令
在multi/exec事务中的blpop
blpop可以用于流水线,但是把它用在multi/exec块当中没有意义,因为这要求整个服务器被阻塞以保证块执行时的原子性
该行为组织了其他客户端执行lpush或rpush命令
因此,一个呗包裹在multi/exec块内的blpop命令,行为表现的就像lpop一样,对空列表返回nil
对非空列表弹出列表元素,不进行任何阻塞行为
#对非空列表进行操作
rpush m hello
multi
blpop m 30
exec //不阻塞立即返回
#对空列表进行操作
llen m
multi
blpop m 30
exec
3.返回值:
如果列表为空,返回一个nil.否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key
第二个元素是被弹出元素的值
模式:事件提醒
有时候,为了等待一个新元素达到数据中,需要轮询的方式对数据进行探查
另一种更好的方式是,使用系统提供的阻塞原语,在新元素到达时立即进行处理,而新元素还没到达时,
就一直阻塞住,避免轮询占用资源。
对于redis,我们似乎需要一个阻塞版的spop命令,但实际上,使用blpop或者brpop就能很好的解决这个问题
使用元素的客户端可以执行类似以下的代码:
LOOP forever
WHILE SPOP(key) returns elements
... process elements ...
END
BRPOP helper_key
END
添加元素的客户端则执行以下代码:
MULTI
SADD key element
LPUSH helper_key x
EXEC
brpop
1.语法
brpop key [key...]timeout
2.解析
brpop是列表的阻塞式弹出原语
它是rpop命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被brpop命令阻塞
直到等待超时或发现可弹出元素为止
当个给定多个key参数时,按参数key的先后执行顺序依次检查各个列表,弹出第一个非空列表的尾部元素
3.返回值:
假如在指定时间内没有任何元素弹出,则返回一个nil和等待时长。反之,返回一个含有两个元素的列表,
第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值
4.例子:
llen m
rpush m hello
rpush m world
brpop m 30
brpoplpush
1.语法
brpoplpush source destination timeout
2.解析
brpoplpush是rpoplpush的阻塞版本,当给定列表source不为空时,brpoplpush的表现和rpoplpush一样
当列表source为空时,brpoplpush命令将阻塞连接,直到等待超时,或有另一个客户端对source执行
lpush或rpush命令
超时参数timeout接受一个以秒为单位的数字作为值.超时参数设为0表示阻塞时间可以无限期延长
3.返回值:
假如在指定时间内没有任何元素被弹出,则返回一个nil和等待时长。反之,返回一个含有两个元素的列表,
第一个元素是被弹出元素的值,第二个元素是等待的时长
4.例子:
brpoplpush m p 500
在另一个客户端:rpush m hello
brpoplpush会返回:
heelo
(21.20s)
llen p
lrange p 0 -1
#空列表
brpoplpush m p 1
(nil)
(1.05s)