Redis内存淘汰策略和过期键删除策略有哪些?

发布于:2025-05-15 ⋅ 阅读:(14) ⋅ 点赞:(0)

Redis 提供 8 种内存淘汰策略,以下是详细解析及场景建议:

一、核心策略解析

  1. noeviction (默认策略)

    • 机制:内存满时拒绝新写入操作,返回错误
    • 优势:绝对数据安全
    • 场景:金融交易系统、医疗数据存储
  2. allkeys-lru (推荐通用策略)

    • 机制:全局淘汰最久未使用的键
    • 优势:自动识别冷热数据
    • 场景:电商商品缓存、新闻资讯系统
  3. volatile-lru

    • 机制:仅淘汰带过期时间的LRU键
    • 优势:保护持久化数据
    • 场景:会话缓存 + 持久化数据混合存储
  4. allkeys-random

    • 机制:随机淘汰任意键
    • 优势:简单高效
    • 场景:临时数据缓存、压力测试环境
  5. volatile-random

    • 机制:随机淘汰带过期时间的键
    • 优势:有限范围内的随机淘汰
    • 场景:定时刷新缓存池

二、特殊场景策略

  1. volatile-ttl

    • 机制:优先淘汰最快过期的键
    • 优势:精确控制数据生命周期
    • 场景:限时抢购库存缓存、验证码存储
  2. allkeys-lfu (4.0+)

    • 机制:淘汰使用频率最低的键
    • 优势:长期保留高频数据
    • 场景:用户画像数据、热门推荐数据
  3. volatile-lfu (4.0+)

    • 机制:淘汰带过期时间的低频键
    • 优势:兼顾频率和有效期
    • 场景:周期性热点数据缓存

三、配置示例

# 设置最大内存为4GB
maxmemory 4gb
# 使用LFU策略(生产推荐)
maxmemory-policy allkeys-lfu

四、决策树参考

内存敏感型系统 → 选择LFU策略
时间敏感型数据 → 选择TTL策略
数据重要性分层 → 使用volatile系列
突发流量防护 → 使用allkeys-random

注:LFU策略需Redis 4.0+版本支持,建议生产环境优先使用LFU系列策略,可通过OBJECT FREQ命令实时监控键访问频率。

过期键删除策略

Redis 的过期键删除策略主要有两种,配合内存淘汰机制共同管理键生命周期:

1. 惰性删除(被动删除)

实现原理
当客户端访问某个键时,Redis 会先检查该键是否已过期。如果过期则立即删除,否则返回数据。

优势

  • 节省 CPU 资源(只在访问时检查)
  • 对正常读写无性能影响

适用场景

  • 过期键被频繁访问的场景
  • 对内存占用不敏感的长期运行系统

2. 定期删除(主动删除)

实现原理
Redis 以固定频率(默认每秒 10 次)随机扫描设置了过期时间的键:

  1. 从过期字典中随机抽取 20 个键
  2. 删除其中已过期的键
  3. 如果过期的键比例超过 25%,重复步骤 1

优势

  • 主动释放内存空间
  • 减少内存泄漏风险

适用场景

  • 存在大量长期不访问的过期键
  • 对内存敏感需要主动清理的场景

3. 内存淘汰机制(补充策略)

当内存达到 maxmemory 限制时,Redis 会根据配置执行淘汰策略,常用策略包括:

  • volatile-lru:淘汰最近最少使用的过期键
  • volatile-ttl:淘汰剩余存活时间最短的键
  • allkeys-lru:淘汰整个数据集中的最近最少使用键

策略组合
Redis 默认采用 惰性删除 + 定期删除 组合策略,配合内存淘汰机制形成三级防御:

  1. 定期删除主动清理大部分过期键
  2. 惰性删除处理漏网之鱼
  3. 内存淘汰机制兜底防止内存溢出

网站公告

今日签到

点亮在社区的每一天
去签到