在Python操作Redis时,如果我们要从一个Redis列表的左侧弹出一个数据,代码一般这样写:
import redis
client = redis.Redis()
data = client.lpop('key')
如果要持续不断地监控这个列表,那么代码可能写为:
import time
import redis
client = redis.Redis()
while True:
data_bytes = client.lpop('key')
if not data_bytes:
time.sleep(1)
continue
data = data_bytes.decode()
print('使用data')
这样写代码,功能确实能够实现,但问题是,这种轮询的方法,在列表经常为空的情况下会浪费大量网络请求。
为了节约网络请求,可以使用Redis列表的阻塞式列表弹出命令: blpop
和 brpop
。
这两个命令与常规的 lpop
、 rpop
有两点不同:
blpop
时,如果列表为空,那么程序就会卡在这里,直到列表中有数据为止。blpop
返回的数据和 lpop
返回的数据有些许不同。blpop
的使用方法如下:
>>> import redis
>>> client = redis.Redis()
>>> data_tuple = client.blpop('test_blpop')
>>> print(data_tuple)
(b'test_blpop', b'3')
data_tuple
是一个元组,元组的第0项是bytes型的Key,元组的第1项才是列表里面被弹出来的值,这个值也是bytes型的,因此要使用的话也需要解码为字符串型。
所以上面的轮询代码可以修改为:
import redis
client = redis.Redis()
while True:
data_tuple = client.blpop('key')
data = data_tuple[1].decode()
print('使用data')
这里不需要判断 data_tuple
是否为None,因为必定不为None。