Skip to content

Redis数据淘汰策略

一、定义

通过配置maxmemory可以限定Redis最大可用内存。当内存占满、无法存入新key时,Redis会按照预设规则清理旧数据,这套规则即为内存淘汰策略

该机制与过期删除相互独立:

  • 过期删除:仅清理设置TTL且已到期的key;
  • 内存淘汰:内存溢出时触发,可清理库内所有key。

二、8种淘汰策略分类

1. noeviction(系统默认)

不淘汰任何key。内存已满后,新增、写入类命令直接报错,读命令可正常执行。

2. volatile系列(仅在设置过期TTL的key中淘汰)

  1. volatile-ttl:在带过期时间的key内,优先淘汰剩余存活时间最短的数据。
  2. volatile-random:在带过期时间的key内,随机删除数据。
  3. volatile-lru:在带过期时间的key内,淘汰最久未被访问的数据。
  4. volatile-lfu:在带过期时间的key内,淘汰访问频次最低的数据。

3. allkeys系列(库内所有key均可参与淘汰)

  1. allkeys-random:在全部key中随机淘汰数据。
  2. allkeys-lru:在全部key中淘汰最久未访问的数据,生产环境最常用
  3. allkeys-lfu:在全部key中淘汰访问次数最少的数据。

算法名词释义

  • LRU(最近最少使用):依据最后一次访问时间判断,闲置时间越久,越优先被删除。
  • LFU(最少频次使用):统计key的访问次数,访问频次越低,越优先被删除。

三、落地选型建议

  1. 常规业务,冷热数据区分明显(商品、资讯缓存):选择 allkeys-lru 保留近期热点数据,优先清理冷数据,为项目通用标配。
  2. 数据访问频率均匀、无明显冷热差异:选择 allkeys-random 随机删除,算法运算开销最低。
  3. 需永久保留部分热点数据(配置、字典类缓存):选择 volatile-lru 核心数据不设置过期时间,不会进入淘汰范围,仅清理带TTL的缓存。
  4. 短时突发热点数据(秒杀缓存、短期活动数据):选择 allkeys-lfu / volatile-lfu 避免短期高频数据降温后被快速淘汰。

四、LFU适用场景

  1. 短期突发热点业务:秒杀、限时活动、临时榜单缓存。LRU仅判断闲置时间,易误删过往热点;LFU依托访问频次,可保留曾高频访问的数据。
  2. 周期性访问数据:按周、按月定时访问的统计缓存。平时访问少、固定时段访问量大,LFU依靠历史访问计数保留数据,不会因长期闲置被LRU清理。
  3. 长尾低频有效数据:低频但不可缺失的配置类缓存,防止LRU因长时间未访问直接淘汰。

五、补充区分

过期删除负责清理到期的key,属于自动定时清理;内存淘汰负责内存爆满时主动清理数据。二者各司其职,互为补充。

六、面试高频问题解析

  1. 问:Redis内存淘汰和过期删除有什么区别?

    答: 过期删除只处理设置TTL且已到期的key;内存淘汰是内存达到上限时触发,可清理库内所有key。二者是两套独立机制,互相配合保障内存稳定。

  2. 问:介绍Redis八种内存淘汰策略,并说明默认策略?

    答: 默认策略是noeviction,内存满后拒绝写入。分为三大类:noeviction不淘汰数据;volatile系列只在带过期时间的key中淘汰,包含ttl、random、lru、lfu四种;allkeys系列所有key都可淘汰,包含random、lru、lfu三种。

  3. 问:LRU和LFU的区别是什么?

    答: LRU判断依据是最后访问时间,优先删除长期闲置数据;LFU判断依据是访问次数,优先删除使用频次低的数据。

  4. 问:常规业务一般选用哪种淘汰策略,为什么?

    答: 常规业务首选allkeys-lru。这类业务冷热数据分明,该策略可以自动保留近期热点缓存,淘汰长期不用的冷数据,适配绝大多数缓存场景。

  5. 问:什么场景适合使用LFU策略?

    答: 适合短时活动热点、周期性访问数据、低频但重要的配置缓存。LFU基于访问频次筛选,能避免LRU误删曾经高频、当前暂时闲置的数据。

Powered by VitePress 1.6.4 | 持续更新中