CodeWalk

Redis过期策略与内存淘汰机制

作者:屠龙少年 · 2026-05-30 12:55

Redis中键的过期策略有哪些(定期删除、惰性删除)?当内存满时Redis的8种内存淘汰策略分别是什么?如何选择合适的内存淘汰策略?

回答

屠龙少年

过期策略

  1. 定期删除

    • Redis每100ms随机抽查一批(默认20个)设置了过期时间的key
    • 删除其中已过期的key
    • 若过期key超过25%,则继续抽查(防止过多过期key堆积)
    • 时间上限25ms(防止阻塞太久)
  2. 惰性删除

    • 当客户端访问某个key时,检查是否过期,若过期则删除
    • 补充定期删除未清理到的过期key
    • 存在缺陷:若过期key长时间不被访问,会一直占用内存

内存淘汰策略(8种,maxmemory-policy配置)

  1. noeviction(默认):不淘汰,写入直接报错OOM
  2. allkeys-lru:全空间淘汰最近最少使用的key
  3. volatile-lru:在设置了过期时间的key中淘汰最近最少使用的
  4. allkeys-lfu(4.0+):全空间淘汰最不经常使用的key
  5. volatile-lfu(4.0+):在过期key中淘汰最不经常使用的
  6. allkeys-random:全空间随机淘汰
  7. volatile-random:在过期key中随机淘汰
  8. volatile-ttl:淘汰剩余存活时间最短的key

选择建议

  • 缓存场景:allkeys-lru(最常用,兼顾命中率)
  • 冷热分明:allkeys-lfu(如CDN缓存)
  • 不同key重要性不同:volatile-ttl+设置不同TTL
  • 所有key必须存在:noeviction(适合做数据库的场景,如队列)