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

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 参数优化性能。
http://www.xdnf.cn/news/3500.html

相关文章:

  • 【C++指南】vector(三):迭代器失效问题详解
  • 【C++重载操作符与转换】输入和输出操作符
  • MERGE存储引擎(介绍,操作),FEDERATED存储引擎(介绍,操作),不同存储引擎的特性图
  • Ocelot与.NETcore7.0部署(基于腾讯云)
  • [更新完毕]2025五一杯A题五一杯数学建模思路代码文章教学:支路车流量推测问题
  • Python-pandas-json格式的数据操作(读取数据/写入数据)
  • Playwright MCP 入门实战:自动化测试与 Copilot 集成指南
  • 【阿里云大模型高级工程师ACP习题集】2.8 部署模型
  • linux python3安装
  • 游戏引擎学习第253天:重新启用更多调试界面
  • 开源飞控软件:推动无人机技术进步的引擎
  • C# | 基于C#实现的BDS NMEA-0183数据解析上位机
  • MATLAB 中zerophase函数——零相位响应
  • 【大模型】图像生成:StyleGAN3:生成对抗网络的革命性进化
  • 【dify—8】Chatflow实战——博客文章生成器
  • Arduino程序函数详解与实际案例
  • 【Github仓库】Learn-Vim随笔
  • 动态规划引入
  • [UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?
  • 【Linux】线程池和线程补充内容
  • LeetCode —— 94. 二叉树的中序遍历
  • 基于若依RuoYi-Vue3-FastAPI 的 Docker 部署记录
  • 生物化学笔记:神经生物学概论06 听觉系统 结构与功能 声强范围的检测(外毛细胞动态调节)
  • 猜数字游戏:从数学原理到交互体验的完整设计指南
  • 边缘计算革命:大模型轻量化部署全栈实战指南
  • CANopen协议简单介绍和使用
  • 基于静态局部立方体贴图的高效软阴影
  • 先知AIGC超级工场,如何助力企业降本增效?
  • 上位机 日志根据类型显示成不同颜色
  • VS乱码问题