前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:在Redis中,如何使用blpop?

一日一技:在Redis中,如何使用blpop?

作者头像
青南
发布2019-01-23 10:44:37
3.5K0
发布2019-01-23 10:44:37
举报
文章被收录于专栏:未闻Code

在Python操作Redis时,如果我们要从一个Redis列表的左侧弹出一个数据,代码一般这样写:

代码语言:javascript
复制
import redis
client = redis.Redis()
data = client.lpop('key')

如果要持续不断地监控这个列表,那么代码可能写为:

代码语言:javascript
复制
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列表的阻塞式列表弹出命令: blpopbrpop

这两个命令与常规的 lpoprpop有两点不同:

  1. 当代码运行到 blpop时,如果列表为空,那么程序就会卡在这里,直到列表中有数据为止。
  2. blpop返回的数据和 lpop返回的数据有些许不同。

blpop的使用方法如下:

代码语言:javascript
复制
>>> 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型的,因此要使用的话也需要解码为字符串型。

所以上面的轮询代码可以修改为:

代码语言:javascript
复制
import redis
client = redis.Redis()
while True:
    data_tuple = client.blpop('key')
    data = data_tuple[1].decode()
    print('使用data')

这里不需要判断 data_tuple是否为None,因为必定不为None。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档