前言
在上篇文章中讲述了内存的易失性催生的持久化机制,解决了数据丢失的问题,这篇文章来讲一下内存的有限性(容量有限)催生的核心机制------内存淘汰机制,以及 key 过期该如何处理?
大家要分清:过期清理是Key 自然到期后的被动回收 ,内存淘汰是内存不足时的主动驱逐
一、内存淘汰机制
1.定义
Redis是内存数据库,内存容量有限(即使是服务器内存,也无法无限制存储数据)。当Redis内存使用量达到配置的"最大内存上限(maxmemory)"时,若再执行写命令(如set、hset),Redis会触发内存淘汰机制,删除一部分符合条件的key,释放内存空间,确保Redis正常运行------这就是所谓的"key内卷"。
2.淘汰机制分类概述
Redis 淘汰策略由maxmemory-policy配置,分为 4 大类 8 种,核心分为「淘汰范围」+「淘汰规则」:
- 淘汰范围:
allkeys-(所有 Key)、volatile-(仅设置了过期时间的 Key) - 淘汰规则:LRU、LFU、TTL、随机、不淘汰

3.LRU:最近最少使用(看时间)
核心逻辑:淘汰最久没有被访问的 Key,认为长期不用的 Key,未来使用率极低。
Redis 实现近似 LRU,非严格 LRU:随机采样一批 Key,淘汰采样中最久未访问的,减少性能损耗。
allkeys-lru:所有 Key 中淘汰最近最少使用的,通用缓存首选;volatile-lru:仅从带过期时间的 Key 中淘汰,保护永久业务 Key。
如图:尽管Akey使用的频次是最高的,但是在LRU里面只看距离当前时间的长短,因此淘汰Akey

4.LFU:最不经常使用(看频次)
核心逻辑:淘汰一段时间内访问次数最少 的 Key,解决 LRU 缺陷:偶尔访问的热点 Key 会被误删。
LFU 内置访问频次衰减机制,自动降低长期不访问 Key 的计数,避免历史热点长期占用内存。
allkeys-lfu:所有 Key 中淘汰访问频次最低的,命中率优于 LRU,现代 Redis 首选;volatile-lfu:仅从带过期时间的 Key 中淘汰。
5.TTL:按剩余过期时间
核心逻辑:仅针对带过期时间的 Key,优先淘汰剩余存活时间最短的 Key,快过期的 Key 提前释放。(既然你设置了过期时间,反正最终会过期,那我就提前扼杀你)
volatile-ttl:适用于验证码、临时令牌等短期业务数据。
6.随机淘汰 + 禁止淘汰
allkeys-random:所有 Key 随机删除,性能最好但命中率极低,仅测试用;volatile-random:仅带过期时间的 Key 随机删除;noeviction(默认策略):不淘汰任何 Key,内存满后拒绝所有写命令,适合 Redis 作为数据库存储、不允许丢数据的场景。
二、过期 Key 清理
Redis 为设置了过期时间(EXPIRE)的 Key,提供 3 种过期清理方案,实际采用「惰性删除 + 定期删除」组合策略,平衡 CPU 开销与内存占用。
1. 惰性删除(Lazy Delete)
(1)核心原理
Key 过期后不会立刻删除 ,只有当客户端访问该 Key 时,Redis 才校验过期状态:
-
未过期:正常返回数据;
-
已过期:直接删除 Key,返回空数据。
(2)优缺点
-
优点:CPU 极度友好,只有访问时才触发删除,不会额外消耗 CPU 做无效扫描,最大化利用 Redis 单线程性能。
-
缺点:存在严重内存浪费。若一个过期 Key 长期无人访问,会永久驻留内存,长期积累会导致大量无效数据占用内存。
2. 定时删除(Timed Delete)
(1)核心原理
设置 Key 过期时间时,同步创建定时器,时间一到立即强制删除 Key。
(2)优缺点
-
优点:内存释放最及时,过期即删,无内存残留。
-
缺点:CPU 压力极大 。Redis 是单线程模型,大量定时器会抢占 CPU 资源,影响正常命令执行,严重降低并发性能,Redis 实际未采用该方案。
3. 定期删除(Periodic Delete)
(1)核心原理
Redis每隔固定时间,随机抽取一批设置了过期时间的 Key 进行检查,删除其中已过期的 Key。
-
不会遍历全量 Key:避免全量扫描阻塞主线程;
-
扫描频率 / 数量可控:默认每秒执行 10 次,每次随机抽取 20 个 Key,平衡 CPU 消耗与清理效率。
(2)优缺点
-
优点:弥补惰性删除的内存浪费问题,定时扫描清理过期 Key;同时避免定时删除的 CPU 过载问题。
-
缺点:存在过期 Key 残留,两次扫描间隔内,过期 Key 仍会占用内存。
4.Redis 最终组合方案:惰性删除 + 定期删除
Redis 默认同时启用这两种策略:
- 定期删除:主动扫描清理,避免大量过期 Key 堆积;
- 惰性删除 :兜底清理,保证访问时过期 Key 必然被删除。二者结合,实现CPU 开销最小化、内存占用合理化的最佳平衡。
三、总结
1.过期 Key 清理 :Redis 用惰性删除 + 定期删除,平衡 CPU 与内存;定时删除因 CPU 开销过大未采用;
2.内存淘汰机制:4 大类 8 种策略,核心是 LRU(时间)、LFU(频次)、TTL、随机;
3.生产核心原则:过期 Key 靠组合策略兜底,内存淘汰靠 LFU/LRU 保热点,合理配置即可保障 Redis 内存高效稳定。