基于Redis自动过期的流处理暂停机制

 更新时间:2025年08月19日 08:57:49   作者:AI浩  
基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详细的介绍一下

在实时视频流处理系统中,我们有时会遇到某些摄像头的数据延时过大(例如网络问题或处理能力不足),此时我们希望暂时跳过该摄像头的处理,以避免积压的数据影响实时性。本文将介绍一种基于Redis自动过期特性的暂停机制,该机制简单高效,且能自动恢复。

核心思路

  1. 延时检测:在处理每个摄像头数据时,计算当前时间与数据时间戳的差值
  2. 暂停触发:当延时超过阈值(300秒)时,将该摄像头加入暂停列表
  3. 自动恢复:使用Redis的过期特性,在指定时间后自动恢复处理
  4. 状态共享:通过Redis实现多个进程间的状态共享

代码实现

1. 初始化Redis连接和键前缀

class Tracking_Car:
    def __init__(self, profile_path, logger_) -> None:
        # ...其他初始化代码...
        
        # Redis连接
        self.redis_db = redis.StrictRedis(
            host=conf.redis_server.ip,
            port=conf.redis_server.port,
            db=conf.redis_server.db,
            socket_keepalive=True,
            socket_connect_timeout=10
        )
        
        # 超时存储的Redis key前缀
        self.TIMEOUT_KEY_PREFIX = "tracking_car:timeout:"

2. 接收数据时检查暂停状态

    def re_stream(self, logger_):
        pub = self.redis_db.pubsub()
        pub.subscribe(self.topic)
        msgs = pub.listen()
        
        for msg in msgs:
            if msg["type"] == "message":
                json_data = json.loads(msg["data"])
                ip = json_data["ip"]
                
                # 检查是否在暂停列表 - 使用Redis自动过期
                timeout_key = f"{self.TIMEOUT_KEY_PREFIX}{camera_ip}"
                if self.redis_db.exists(timeout_key):
                    # 获取剩余时间并记录日志
                    ttl = self.redis_db.ttl(timeout_key)
                    skip_msg = f"跳过{ip }的消息:处于暂停时段({ttl}s剩余)"
                    continue
                
                # ...正常处理逻辑...

3. 检测到延时过大时设置暂停

    def write_database(self, cv_list, logger_: MyLogger):
        # 计算时间差
        current_time = time.time()
        _ts = cv_list['timestamp']
        diff_time = current_time - _ts
        
        # 如果时间差超过300秒,使用Redis自动过期设置
        if diff_time > 300:
            camera_ip = cv_list["ip"]
            logger_.warning(f"IP {camera_ip} 延时超过300秒({diff_time:.2f}s),加入暂停列表")
            
            # 设置Redis键,自动在300秒后过期
            timeout_key = f"{self.TIMEOUT_KEY_PREFIX}{camera_ip}"
            self.redis_db.setex(timeout_key, 300, "1")  # 值可以是任意内容
            
            # 删除相关图片并跳过处理
            self.redis_db.unlink(cv_list["path"])
            return
        
        # ...正常处理逻辑...

优势分析

  1. 自动恢复机制

    • 使用Redis的setex命令设置带过期时间的键
    • 300秒后键自动删除,摄像头自动恢复处理
    • 无需额外的清理任务或状态管理
  2. 进程间状态共享

    • 多个处理进程通过Redis共享暂停状态
    • 新增进程自动获取当前暂停状态
    • 系统扩展性更强
  3. 资源优化

    • 检测到延时过大时立即停止处理
    • 删除相关Redis图片数据,释放内存
    • 避免无效处理消耗CPU资源
  4. 实时监控

    • 记录暂停日志及剩余时间
    • 管理员可实时查看暂停状态

应用场景

这种机制特别适用于以下场景:

  1. 网络不稳定的摄像头:某些摄像头可能因网络问题导致数据延迟
  2. 处理能力不足:当系统负载过高时,可暂时跳过部分摄像头
  3. 临时故障处理:摄像头临时故障导致数据积压
  4. 优先级管理:优先处理实时性要求高的摄像头

扩展优化

  1. 动态阈值设置

    # 根据系统负载动态调整延时阈值
    load = os.getloadavg()[0]
    dynamic_threshold = 300 * (1 + load)  # 负载越高,阈值越大
    
  2. 分级暂停机制

    # 根据延时严重程度设置不同暂停时间
    if diff_time > 600:  # 超过10分钟
        pause_time = 600  # 暂停10分钟
    elif diff_time > 300:  # 超过5分钟
        pause_time = 300  # 暂停5分钟
    
  3. 监控告警

    # 当摄像头被暂停时发送告警
    if diff_time > 300:
        send_alert(f"摄像头 {camera_ip} 因延时过高被暂停")
    

总结

基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案。它通过以下方式提升系统稳定性:

  1. 防止延时过大的数据影响实时处理
  2. 自动恢复处理,减少人工干预
  3. 共享状态,支持分布式部署
  4. 优化资源使用,提升系统整体效率

这种机制不仅适用于视频流处理系统,也可应用于任何需要根据数据延迟动态调整处理策略的场景。

到此这篇关于基于Redis自动过期的流处理暂停机制的文章就介绍到这了,更多相关Redis自动过期流处理暂停机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Redis中的List类型

    详解Redis中的List类型

    这篇文章主要介绍了Redis中的List类型,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Redis HyperLogLog数据量统计的实现实例

    Redis HyperLogLog数据量统计的实现实例

    在大数据时代,统计海量数据中的唯一值是一个常见的需求,但同时也是极具挑战性的任务,传统的统计方法可能会消耗大量内存或计算资源,而 Redis 的 HyperLogLog 数据结构 则提供了一种高效、轻量的解决方案,下面就来详细介绍一下HyperLogLog的使用,感兴趣的可以了解一下
    2025-09-09
  • redis设置密码并修改查看的几种实现过程

    redis设置密码并修改查看的几种实现过程

    这篇文章主要介绍了redis设置密码并修改查看的几种实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-06-06
  • macOS上Redis的安装与测试操作

    macOS上Redis的安装与测试操作

    这篇文章主要介绍了macOS上Redis的安装与测试操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • redis实现红锁的示例代码

    redis实现红锁的示例代码

    在分布式系统中,实现一个可靠的锁机制是非常重要的,本文主要介绍了redis实现红锁的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • React Antd Cascader组件地区选择方式

    React Antd Cascader组件地区选择方式

    文章介绍了在表单中实现地区选择功能,使用Cascader组件动态加载数据,需通过loadData和递归处理实现增删改查,存储和回显需完整id数组以支持多级地区展示,强调后端设计对数据关联(id/pid)的重要性
    2025-08-08
  • Redis Stream类型的使用详解

    Redis Stream类型的使用详解

    本文主要介绍了Redis Stream类型的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Redis集群部署Windows版本的过程详解

    Redis集群部署Windows版本的过程详解

    本文介绍了如何在Windows系统上部署Redis集群,包括从GitHub下载Windows版本的Redis、配置文件的创建、启动脚本的编写以及集群的启动和配置过程,感兴趣的朋友一起看看吧
    2025-03-03
  • redis集群规范详解

    redis集群规范详解

    这篇文章主要介绍了redis集群规范详解,涉及节点失效检测、集群状态检测、从节点选举等相关内容,比较详细,需要的朋友可以参考。
    2017-10-10
  • Redis实现优惠券限一单限制详解

    Redis实现优惠券限一单限制详解

    这篇文章主要介绍了Redis解决优惠券秒杀应用案例,本文先讲了抢购问题,指出其中会出现的多线程问题,提出解决方案采用悲观锁和乐观锁两种方式进行实现,然后发现在抢购过程中容易出现一人多单现象,需要的朋友可以参考下
    2022-12-12

最新评论