在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。