1.*过期删除策略和内存淘汰策略有什么区别?
核心区别在于“触发条件”和“目的”不同:
-
过期删除策略 (Expiration Deletion Strategy):
-
触发条件: 针对设置了 TTL (过期时间) 的 Key。
-
目的: 删除那些时间到了的数据,清理无效空间。
-
实现方式: Redis 采用 惰性删除 + 定期删除 配合使用。
-
-
内存淘汰策略 (Memory Elimination Strategy):
-
触发条件: 当 Redis 的内存占用达到
maxmemory限制 时触发。 -
目的: 为了腾出空间给新写入的数据,防止内存溢出 (OOM)。
-
实现方式: 强制移除数据。根据配置不同,可以是 LRU(最近最少使用)、LFU(最不常使用)、Random(随机)或者直接报错 (noeviction)。
-
一句话总结(面试金句): “过期删除是处理‘自然死亡’的数据(时间到了);内存淘汰是处理‘空间不足’时的紧急避险(主动杀掉数据腾位置)。”
2.*介绍一下Redis 内存淘汰策略

Redis 提供了 8 种策略,可以归纳为 2 大类(是否进行淘汰):
-
不进行淘汰(默认策略):
-
noeviction:
-
一旦内存满了,Redis 拒绝写入新数据(写入命令直接报错 OOM),但允许读取。
-
适用场景: 对数据完整性要求极高,宁可报错也不愿丢数据的场景。
-
-
-
进行淘汰(7 种方式): Redis 提供了针对**“所有 Key”和“设置了过期时间的 Key”**两种范围的淘汰机制。
-
范围一:在“设置了过期时间”的 Key 中进行淘汰 (
volatile-*)-
volatile-random: 随机淘汰。
-
volatile-ttl: 优先淘汰 TTL 最小(即马上要过期)的 Key。
-
volatile-lru: 淘汰 最近最少使用 (Least Recently Used) 的 Key。
-
volatile-lfu: 淘汰 使用频率最低 (Least Frequently Used) 的 Key(Redis 4.0 新增)。
-
适用场景: 当你希望把 Redis 既当缓存(存有时效的数据)又当数据库(存持久化数据)使用时。
-
-
范围二:在“所有 Key”中进行淘汰 (
allkeys-*)-
allkeys-random: 随机淘汰。
-
allkeys-lru (最常用): 无论有没有设置过期时间,一律淘汰最近最少使用的 Key。
-
allkeys-lfu: 无论有没有设置过期时间,一律淘汰使用频率最低的 Key。
-
适用场景: 纯缓存场景。通常推荐使用
allkeys-lru,因为它可以保留热点数据,提升命中率。
-
-
3.介绍一下Redis过期删除策略
惰性删除 (Lazy Deletion) —— 被动清理:
-
触发时机: 当客户端访问某个 Key 时(增删改查)。
-
流程: Redis 会先检查该 Key 是否设置了过期时间且已过期。如果过期,直接删除并返回空;没过期则正常处理。
-
优缺点:
-
✅ 省 CPU: 只在用到时才检查,对 CPU 最友好。
-
❌ 费内存: 如果大量过期 Key 再也没被访问过,它们会一直占用内存,造成“内存泄漏”。
-

定期删除 (Periodic Deletion) —— 主动清理:
-
触发时机: Redis 默认每隔 100ms(每秒 10 次)运行一次后台任务。
-
流程(随机抽查):
-
从设置了过期时间的 Key 集合中,随机抽取 20 个 Key。
-
删除其中已过期的 Key。
-
循环判断: 如果已过期 Key 的比例超过 25%(即超过 5 个),则重复上述步骤,直到比例下降或达到时间上限。
-
-
优缺点:
-
✅ 省内存: 能主动清理那些长时间未被访问的“僵尸”过期 Key。
-
❌ 费 CPU: 必须限制执行时长(默认不超过 25ms),否则会阻塞主线程导致系统卡顿。
-

“单用惰性删除会浪费内存,单用定期删除会抢占 CPU。组合使用可以最大限度地利用 CPU 资源并保证内存不被无效数据占满。”
4.那为什么我不过期立即删除?
-
CPU 负载过高(致命伤):
-
如果要实现“一过期就立马删除”,Redis 需要为每一个设置了过期时间的 Key 创建一个定时器 (Timer)。
-
当有过期的 Key 堆积或大量 Key 同时过期(缓存雪崩预兆)时,CPU 会瞬间消耗大量计算资源去处理删除操作,导致无法响应正常的客户端读写请求。
-
-
技术实现成本:
- 在单线程模型下,维护海量的定时器本身就是一个巨大的性能开销。
结论: “这就好比为了打扫卫生(释放内存),让服务员(CPU)每时每刻盯着每一张桌子,一旦有空盘子立马收走。结果是卫生保持得很好,但新来的客人都没人接待了。 所以,Redis 选择了退一步:牺牲一点点内存(数据过期了不一定立马删),换取 CPU 的稳定运行(定期+惰性删除)。”