Redis过期键删除策略(面试结构化)
Redis设置key过期时间,key到期不会立刻删除,采用惰性删除 + 定期删除 两种策略配合;另外还有内存满了触发的内存淘汰策略。
1. 惰性删除
- 逻辑:key过期不会马上删掉,只有当客户端去访问这个key的时候,Redis才检查是否过期,如果过期直接删除,返回nil。
- 优点:CPU开销很小,只在访问时做检查,不占用额外CPU。
- 缺点:如果一个key已经过期,但一直没人访问,它会一直占着内存,造成内存泄漏。
2. 定期删除
- 逻辑:Redis后台每隔一段时间,随机抽取一部分设置了过期时间的key,检查是否过期,过期就删掉。
不是扫描全部key,是随机抽样,避免遍历全部key阻塞主线程。
- 配置:控制执行频率、抽样数量。
- 优点:解决惰性删除的问题,把过期key逐步清理释放内存。
- 缺点:不可能把所有过期key全部清理干净,依然会残留部分过期key在内存。
小结:惰性删除+定期删除组合,依然会有过期key残留在内存。当内存达到上限,就触发内存淘汰策略。
3. 内存淘汰策略 maxmemory‑policy
当Redis内存占用达到maxmemory最大内存限制,执行淘汰,一共8种:
- volatile‑lru:从设置过期时间的key,淘汰最近最少使用的(LRU)
- allkeys‑lru:全部key,淘汰最近最少使用(最常用)
- volatile‑lfu:过期key中,淘汰访问频次最低
- allkeys‑lfu:全部key中,淘汰访问频次最低
- volatile‑random:在带过期的key随机删
- allkeys‑random:所有key随机删除
- volatile‑ttl:删除快要过期的key,TTL最小优先
- no‑eviction:不删除任何key,直接返回报错(默认不是这个)
Redis的LRU、LFU不是严格算法,是近似采样算法,性能更高。
面试高频追问区分
- 过期删除:惰性 + 定期,处理已经TTL到期的key。
- 内存淘汰:内存打满才触发,不管key有没有过期。
总结
- 惰性删除:访问的时候才删过期key,节省CPU,但内存可能浪费。
- 定期删除:后台随机抽样清理过期key,不能清理全部。
- 两者结合仍有残留,内存超限触发内存淘汰策略释放内存。
- 线上一般设置
maxmemory,搭配allkeys‑lru。