Redis 内存淘汰
Redis 内存淘汰在内存使用触及 maxmemory 限制时决定删除哪些键,或者拒绝需要更多内存的写命令。选择策略前,要明确实例保存的是可重建缓存还是不能随意丢弃的业务状态。
1. 面试核心
先记住这几条,再读正文- allkeys 策略可从全部键中选择,volatile 策略只考虑设置了过期时间的键。
- noeviction 不自动淘汰键,触及限制后部分写操作会失败。
- LRU 依据近期访问,LFU 依据访问频率,Redis 使用近似机制而非完整精确排序。
2. 策略与候选范围
| 策略 | 候选与选择依据 |
|---|---|
| allkeys-lru | 全部键中近似选择最近较少使用的键 |
| allkeys-lfu | 全部键中近似选择低频键 |
| volatile-lru / volatile-lfu | 只从带过期时间的键中按相应规则选择 |
| volatile-ttl | 从带过期时间的键中优先选择更接近到期者 |
| noeviction | 不主动淘汰,内存不足时拒绝需要增加内存的相关命令 |
volatile 策略若没有合适的可淘汰键,也可能无法通过淘汰满足写入。设置了 TTL 并不保证键会一直保留到到期,符合淘汰策略的键可能提前消失。
3. 内存限制与观测
maxmemory 不是进程 RSS 的严格上限:分配器碎片、部分缓冲区、持久化期间的写时复制等都会影响实际内存占用。配置需要为这些成本和宿主机保留余量。
排查时共同观察 used_memory、RSS、evicted_keys、expired_keys、命中率、写入错误和回源量。evicted_keys 上升代表内存压力删除,expired_keys 上升代表过期删除;两个计数不能混用。
4. 使用边界
普通可重建缓存可以考虑 allkeys-lru 或 allkeys-lfu,再用实际命中率和访问分布判断效果。LFU 有频率衰减与近似计数,不应理解成永远保护历史上最热门的键。
不可丢弃状态与普通缓存混在同一实例,会让淘汰选择困难。即使使用 noeviction,也只是改变内存不足时的行为,不能代替持久化、复制、备份与应用错误处理。扩容前还要检查大值、过长 TTL 和数据是否仍有业务用途。
5 · 面试题卡片
先想答案,再翻面题目来自公开面经。点任意一张进入翻卡,可左右切换,看完回到这里。
逐张翻看 1 张 →5.1 Redis 的内存淘汰策略有哪些,LRU 与 LFU 如何选择?
出现公司:暂无已核验的公开来源(本站自测)
考察重点:淘汰候选范围、访问时间与频率的区别,以及状态丢失的业务影响。
参考回答
先区分全部键与仅有 TTL 的键,再比较近期访问、频率或剩余 TTL 等选择依据;noeviction 则在内存不足时让相关写入失败。LRU 关注近期使用,LFU 更关注访问频次,但实现是近似的,最终应按负载测试命中率。事实数据不能只靠策略名称保证不丢失。