当前位置: 首页 > news >正文

Redis的键过期删除策略与内存淘汰机制详解

Redis 的键过期删除策略与内存淘汰机制详解


一、键过期删除策略

Redis 通过 定期删除(Active Expire)惰性删除(Lazy Expire) 两种方式结合,管理键的过期清理。

1. 惰性删除(Lazy Expire)

  • 触发时机:当客户端尝试访问某个键时,Redis 会先检查该键是否过期。
  • 执行逻辑
    if key.expired?delete_key(key)return nil
    elsereturn key.value
    end
    
  • 优点
    • 对 CPU 友好,只在访问时检查,不占用额外资源。
  • 缺点
    • 内存泄漏风险:如果键长期不被访问,即使过期也会一直占用内存。

2. 定期删除(Active Expire)

  • 触发时机:Redis 周期性(默认每秒 10 次)随机抽取部分过期键检查并删除。
  • 执行流程
    1. 从过期字典中随机选择 N 个键(Nhz 参数控制,默认 20)。
    2. 删除其中已过期的键。
    3. 如果过期键比例超过 25%,则重复步骤 1。
  • 优点
    • 减少内存泄漏概率,平衡 CPU 和内存占用。
  • 缺点
    • 仍可能残留部分过期键(依赖随机抽样)。

二、内存淘汰机制(Eviction Policies)

当 Redis 内存达到 maxmemory 限制时,会根据配置的淘汰策略删除键,腾出空间。

1. 淘汰策略配置

redis.conf 中设置:

maxmemory <bytes>          # 最大内存(如 4GB)
maxmemory-policy <policy>  # 淘汰策略

2. 常见淘汰策略

策略规则适用场景
noeviction(默认)拒绝所有写入操作(返回 OOM 错误),只允许读数据绝对不允许丢失
allkeys-lru淘汰全体键中最近最少使用(LRU)的键热点数据集中,长期冷数据可丢弃
volatile-lru仅淘汰设置了过期时间的键中的 LRU 键需保留持久化数据,仅清理临时数据
allkeys-random随机淘汰全体键无明确访问规律时
volatile-random随机淘汰设置了过期时间的键临时数据可随机清理
volatile-ttl优先淘汰剩余存活时间(TTL)最短的过期键需要快速清理即将过期的数据
allkeys-lfu(Redis 4.0+)淘汰全体键中访问频率最低(LFU)的键长期冷门数据优先清理
volatile-lfu(Redis 4.0+)淘汰设置了过期时间的键中访问频率最低的键临时冷数据优先清理

3. 策略选择建议

  • 缓存场景allkeys-lruallkeys-lfu(优先保留热点数据)。
  • 混合数据volatile-lru + 对持久数据不设过期时间。
  • 严格时效性volatile-ttl(如会话缓存)。

三、工作流程总结

  1. 写入键时
    • 检查内存是否超限 → 若超限,触发淘汰机制。
  2. 读取键时
    • 惰性删除检查过期 → 若过期则删除。
  3. 后台周期任务
    • 定期删除抽样过期键。

四、调优注意事项

  1. 监控过期键
    redis-cli info stats | grep expired_keys  # 查看已删除的过期键数量
    
  2. 避免集中过期
    • 大批量键设置相同过期时间会导致定期删除压力激增,应分散过期时间(如加随机偏移)。
  3. LFU 优化(Redis 4.0+):
    • 通过 lfu-log-factorlfu-decay-time 调整频率计数器的灵敏度和衰减速度。

总结

  • 删除策略:惰性删除 + 定期删除互补,平衡实时性和资源开销。
  • 淘汰机制:根据业务特点选择 LRU/LFU/TTL 等策略,避免内存溢出。
  • 实践建议:监控内存和过期键,结合 maxmemoryhz 参数优化性能。

相关文章:

  • 论文阅读:MAXIM Multi-Axis MLP for Image Processing
  • 单片机-89C51部分:13、看门狗
  • PostgreSQL数据库操作SQL
  • Kotlin-运算符重载函数
  • SAE极速部署弹性微服务商城——实验记录
  • Cookie 是什么?
  • Python 与 MongoDB 深度融合:全流程数据库操作指南
  • 力扣——23合并升序链表
  • 使用listPersonalCertificates 命令列示WebSphere Application Server特定密钥库中的个人证书
  • 【Machine Learning Q and AI 读书笔记】- 03 小样本学习
  • “Everything“工具 是 Windows 上文件名搜索引擎神奇
  • xml 和 yaml 的区别
  • 关系型数据库设计指南
  • HOOK上瘾思维模型——AI与思维模型【88】
  • 【Linux系统】Linux进程信号(产生,保存信号)
  • 使用 Spring Boot Actuator 实现应用实时监控
  • 《TCP/IP详解 卷1:协议》之第九章:IP选路
  • 项目管理进阶:详解华为研发项目管理(IPD流程管理)【附全文阅读】
  • 机器视觉开发-打开摄像头
  • Selenium:模拟真实用户的爬虫
  • 受天气等影响SC8041航班三次备降延误超12小时,山航致歉
  • 王毅谈金砖国家开展斡旋调解的经验和独特优势
  • 中方拟解除对5名欧洲议会议员制裁?外交部:望中欧立法机构相向而行
  • 零食连锁鸣鸣很忙递表港交所:去年营收393亿元,门店超1.4万家,净利润率2.1%
  • 白云山一季度营收净利双降,此前称今年将挖掘盘活自身资源
  • 习近平在上海考察