一日一技:隐患——redis-py的blpop可能由于网络波动导致收不到信息

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 一日一技:隐患——redis-py的blpop可能由于网络波动导致收不到信息

摄影:产品经理厨师:kingname

我们在使用Redis做消息队列的时候,常常使用列表这个数据结构,并写出如下的代码:

import redis
import time
client = redis.Redis()
while True:
    data = client.lpop('key')
    if not data:
        time.sleep(5 * 60)
        continue
    parse(data)

这个意思是说,如果Redis的名为 key的列表里面有数据,那么就不停取出来,并把取出的数据传入 parse函数进行处理。如果列表里面没有数据,那么就等待5分钟再次检查。

这种方式,如果列表始终为空,那么将会每5分钟检查一次。

但使用这种方式有一个问题,例如刚刚检查完列表发现是空的,程序开始等待5分钟。但是检查完成的1秒以后,新信息抵达列表。此时信息无法被立刻消费,必需要等满5分钟才行。

为了解决实时性的问题,使用了列表的阻塞式弹出命令 blpop,于是代码变为:

import redis
client = redis.Redis()
while True:
    data = client.blpop('key')
    parse(data[1])

如果列表里面没有数据,程序就会卡在 data=client.blpop('key')这一行,直到列表里面有了新的数据,再立刻弹出送进后面的逻辑。

这种方法在测试的时候完美运行,于是就放到了生成环境使用。

一个周末过去了,周一上班时,同事反馈写到Redis里面的信息不能被正常消费了。

但是我发现程序正常运行,并没有出现任何异常。

于是我找 redis-py的作者 AndyMcCurdy询问原因,他给我的回复如下图所示。

意思是说,在使用 blpop的时候,如果中途因为网络波动或者某些其他原因导致连接池失效,那么就永远接收不到信息了,虽然 redis-py有连接状态检查的功能,但是由于程序是阻塞的, redis-py的连接状态检查功能不能正常使用。

为了解决这个问题,就需要 blpop的超时功能。让 blpop每几分钟就断开,检查一下网络,再重新连上。

于是代码变为:

import redis
client = redis.Redis()
while True:
    data = client.blpop('key', timeout=5 * 60)
    if not data:
        continue
    parse(data[1])

设置超时时间为5分钟,如果5分钟内列表没有收到信息(无论是真的列表一直没有数据,还是连接池断开了),都会返回 None,此时只需要重新执行 blpop,在执行的瞬间会检查连接的状态,如果连接池有问题,那么它会重新连接。

如果5分钟内有数据,那么 blpop就会立刻把数据弹出来。

通过添加超时时间,解决了数据实时性和网络连接丢失的问题。


目录
相关文章
|
11月前
|
NoSQL 网络协议 Linux
Redis的实现一:c、c++的网络通信编程技术,先实现server和client的通信
本文介绍了使用C/C++进行网络通信编程的基础知识,包括创建socket、设置套接字选项、绑定地址、监听连接以及循环接受和处理客户端请求的基本步骤。
142 6
|
7月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
381 62
RT-DETR改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
7月前
|
机器学习/深度学习 自然语言处理 计算机视觉
RT-DETR改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
RT-DETR改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
311 13
RT-DETR改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
|
7月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
270 9
YOLOv11改进策略【模型轻量化】| 替换骨干网络为 MobileViTv1高效的信息编码与融合模块,获取局部和全局信息
|
7月前
|
计算机视觉
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
151 5
RT-DETR改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
|
7月前
|
机器学习/深度学习 自然语言处理 计算机视觉
YOLOv11改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
YOLOv11改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
228 0
YOLOv11改进策略【Backbone/主干网络】| CVPR 2024 替换骨干网络为 RMT,增强空间信息的感知能力
|
7月前
|
计算机视觉
YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)
337 0
|
10月前
|
机器学习/深度学习 计算机视觉 网络架构
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目DWRSeg是一种高效的实时语义分割网络,通过将多尺度特征提取分为区域残差化和语义残差化两步,提高了特征提取效率。它引入了Dilation-wise Residual (DWR) 和 Simple Inverted Residual (SIR) 模块,优化了不同网络阶段的感受野。在Cityscapes和CamVid数据集上的实验表明,DWRSeg在准确性和推理速度之间取得了最佳平衡,达到了72.7%的mIoU,每秒319.5帧。代码和模型已公开。
【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测
|
10月前
|
监控 安全 测试技术
网络信息系统的整个生命周期
网络信息系统规划、设计、集成与实现、运行维护及废弃各阶段介绍。从企业需求出发,经过可行性研究和技术评估,详细设计系统架构,完成设备安装调试和系统集成测试,确保稳定运行,最终安全退役。
148 1
网络信息系统的整个生命周期
|
10月前
|
安全 网络协议 网络安全
【Azure 环境】从网络包中分析出TLS加密套件信息
An TLS 1.2 connection request was received from a remote client application, but non of the cipher suites supported by the client application are supported by the server. The connection request has failed. 从远程客户端应用程序收到 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的任何密码套件。连接请求失败。
284 2