Redis 如何删除过期数据?

Redis 使用惰性删除和定期删除两种机制来处理过期数据的删除,确保内存和性能的平衡。

数据管理 中等 Redis 内存管理 缓存

Redis 删除过期数据主要依赖两种策略的结合:惰性删除定期删除

  1. 惰性删除(Lazy Expiration)
    • 运行机制:当客户端访问某个 Key 时,Redis 会先检查该 Key 是否过期。如果已过期,立即删除该 Key 并返回空值,否则正常访问。
    • 优缺点
      • 优点:仅在访问时触发操作,节省 CPU 资源。
      • 缺点:未被访问的过期 Key 会长期占用内存。
  2. 定期删除(Regular Expiration)
    • 运行机制:Redis 默认每秒执行 10 次扫描(由配置参数 hz 控制),每次随机抽取一定数量的 Key(默认 20 个设置了过期时间的 Key)。若发现过期键则删除,且如果过期键比例超 25%,则重复扫描(但单次最长扫描时间不超过 25ms)。
    • 补充配置
      • 通过 active-expire-effort 参数可调整扫描强度(范围 1-10,默认 1),强度越大消耗 CPU 越多。
        # 配置示例
        hz 10              # 默认每秒 10 次定期扫描
        active-expire-effort 3  # 调整扫描强度
        
    • 优缺点
      • 优点:兼顾内存释放效率和 CPU 负载。
      • 缺点:并非实时删除所有过期键。

两种策略结合的意义:惰性删除减少实时 CPU 压力,定期删除清理长期未访问的数据,确保内存和性能平衡。当两种策略仍无法解决内存不足时,Redis 会启动淘汰策略(如 allkeys-lru),以释放空间存储新数据。