面试题:Redis 中有哪些内存淘汰策略?

Redis 提供了 8 种内存淘汰策略,用于在内存不足时自动删除数据,以腾出空间容纳新数据。这些策略分为 4 类LRU(最近最少使用)LFU(最不经常使用)Random(随机) 和 TTL(生存时间)。以下是详细分类及每种策略的说明:


一、内存淘汰策略分类

1. 无淘汰策略(No Eviction)

  • 策略名noeviction
  • 核心逻辑
    • 内存不足时,直接拒绝所有写操作(如 SETHSET 等),但允许读操作。
    • 默认策略,适用于数据必须绝对保留的场景(如配置中心)。
  • 适用场景
    • 数据不能丢失(如关键业务数据、系统配置)。

2. LRU 系列(基于最近最少使用)

  • 策略名
    • allkeys-lru:从所有键中淘汰最近最少使用的键。
    • volatile-lru:从设置了过期时间的键中淘汰最近最少使用的键。
  • 核心逻辑
    • 通过维护一个候选池(默认大小为 16),每次随机采样 maxmemory-samples 个键(默认 5),选择最近最少使用的键淘汰。
    • 近似 LRU:Redis 并未严格维护双向链表,而是通过采样优化性能与内存消耗的平衡。
  • 适用场景
    • allkeys-lru:通用缓存(如商品详情、用户信息)。
    • volatile-lru:临时缓存(如会话 Token、活动促销数据)。

3. LFU 系列(基于最不经常使用)

  • 策略名
    • allkeys-lfu:从所有键中淘汰使用频率最低的键。
    • volatile-lfu:从设置了过期时间的键中淘汰使用频率最低的键。
  • 核心逻辑
    • 使用 Morris 计数器 和 衰减机制lfu-decay-time)模拟访问频率,避免早期访问的键长期占据优势。
    • 更适合识别长期热点数据(如高频访问的用户画像)。
  • 适用场景
    • allkeys-lfu:长期稳定缓存(如用户画像、统计信息)。
    • volatile-lfu:短期高频缓存(如活动页面点击量)。

4. Random 系列(随机淘汰)

  • 策略名
    • allkeys-random:从所有键中随机淘汰键。
    • volatile-random:从设置了过期时间的键中随机淘汰键。
  • 核心逻辑
    • 完全随机选择键进行删除,不考虑访问模式或频率
  • 适用场景
    • 无明确访问模式的数据(如日志缓存、测试环境数据)。

5. TTL 系列(基于生存时间)

  • 策略名volatile-ttl
  • 核心逻辑
    • 优先淘汰剩余生存时间(TTL)最短的键(即即将过期的键)。
  • 适用场景
    • 需要自然淘汰的临时数据(如缓存的临时文件、短时任务状态)。

二、策略速览表

策略名淘汰范围核心逻辑适用场景
noeviction无淘汰拒绝写操作数据绝对不能丢失(如配置中心)
allkeys-lru所有键全局 LRU 淘汰通用缓存(如商品详情)
volatile-lru仅带过期时间的键过期键中 LRU 淘汰临时缓存(如会话 Token)
allkeys-lfu所有键全局 LFU 淘汰(访问频率最低)长期稳定缓存(如用户画像)
volatile-lfu仅带过期时间的键过期键中 LFU 淘汰(访问频率最低)短期高频缓存(如活动数据)
allkeys-random所有键随机淘汰无明确访问模式的数据(如日志)
volatile-random仅带过期时间的键过期键中随机淘汰测试环境/无特殊要求的临时数据
volatile-ttl仅带过期时间的键淘汰剩余 TTL 最短的键即将失效的临时数据(如日志缓存)

三、选择策略的关键考量

  1. 数据重要性
    • 若数据必须保留(如订单状态),选择 noeviction
    • 若数据可丢弃(如缓存),选择 LRU/LFU/TTL。
  2. 访问模式
    • 有明显热点数据 → 选择 allkeys-lfu 或 volatile-lfu
    • 访问均匀 → 选择 allkeys-random 或 volatile-random
  3. 生命周期
    • 数据有明确过期时间 → 选择 volatile-* 系列(如 volatile-ttl)。
    • 数据需长期保留 → 选择 allkeys-* 系列(如 allkeys-lru)。
  4. 性能与精度平衡
    • LRU/LFU 的近似实现通过 maxmemory-samples 调整精度(默认 5)。

四、配置方法

  1. 动态配置(无需重启):CONFIG SET maxmemory-policy <策略名>例如:CONFIG SET maxmemory-policy allkeys-lru
  2. 静态配置(修改 redis.conf):maxmemory-policy allkeys-lru

五、典型场景推荐

场景特征推荐策略理由
数据重要性相同allkeys-lru有效利用内存,保留热点数据
有明显热点数据allkeys-lfu保护长期高频访问的键
数据访问均匀allkeys-random公平淘汰,避免偏向性
混合持久数据与临时数据volatile-lru保护持久数据,清理过期键
临时缓存数据volatile-ttl自然淘汰即将过期的键
数据不可丢失noeviction确保数据安全,拒绝写入

六、注意事项

  1. 内存监控:定期使用 INFO memory 命令监控内存使用情况。
  2. 策略调整:根据业务需求动态调整策略(如高峰期切换为 volatile-ttl)。
  3. 集群限制:在 Redis Cluster 中,脚本涉及的键必须位于同一 Slot(通过 {} 标签控制)。

通过合理选择内存淘汰策略,可以显著提升 Redis 的性能与稳定性,同时避免因内存不足导致的服务中断。

THE END
喜欢就支持一下吧
点赞14 分享