1.*过期删除策略和内存淘汰策略有什么区别?

核心区别在于“触发条件”和“目的”不同:

  1. 过期删除策略 (Expiration Deletion Strategy):

    • 触发条件: 针对设置了 TTL (过期时间) 的 Key。

    • 目的: 删除那些时间到了的数据,清理无效空间。

    • 实现方式: Redis 采用 惰性删除 + 定期删除 配合使用。

  2. 内存淘汰策略 (Memory Elimination Strategy):

    • 触发条件: 当 Redis 的内存占用达到 maxmemory 限制 时触发。

    • 目的: 为了腾出空间给新写入的数据,防止内存溢出 (OOM)。

    • 实现方式: 强制移除数据。根据配置不同,可以是 LRU(最近最少使用)、LFU(最不常使用)、Random(随机)或者直接报错 (noeviction)。

一句话总结(面试金句):过期删除是处理‘自然死亡’的数据(时间到了);内存淘汰是处理‘空间不足’时的紧急避险(主动杀掉数据腾位置)。”

2.*介绍一下Redis 内存淘汰策略

Redis 提供了 8 种策略,可以归纳为 2 大类(是否进行淘汰):

  1. 不进行淘汰(默认策略):

    • noeviction:

      • 一旦内存满了,Redis 拒绝写入新数据(写入命令直接报错 OOM),但允许读取

      • 适用场景: 对数据完整性要求极高,宁可报错也不愿丢数据的场景。

  2. 进行淘汰(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 次)运行一次后台任务。

  • 流程(随机抽查):

    1. 从设置了过期时间的 Key 集合中,随机抽取 20 个 Key

    2. 删除其中已过期的 Key。

    3. 循环判断: 如果已过期 Key 的比例超过 25%(即超过 5 个),则重复上述步骤,直到比例下降或达到时间上限。

  • 优缺点:

    • 省内存: 能主动清理那些长时间未被访问的“僵尸”过期 Key。

    • 费 CPU: 必须限制执行时长(默认不超过 25ms),否则会阻塞主线程导致系统卡顿。

“单用惰性删除会浪费内存,单用定期删除会抢占 CPU。组合使用可以最大限度地利用 CPU 资源并保证内存不被无效数据占满。”

4.那为什么我不过期立即删除?

  1. CPU 负载过高(致命伤):

    • 如果要实现“一过期就立马删除”,Redis 需要为每一个设置了过期时间的 Key 创建一个定时器 (Timer)

    • 当有过期的 Key 堆积或大量 Key 同时过期(缓存雪崩预兆)时,CPU 会瞬间消耗大量计算资源去处理删除操作,导致无法响应正常的客户端读写请求

  2. 技术实现成本:

    • 在单线程模型下,维护海量的定时器本身就是一个巨大的性能开销。

结论: “这就好比为了打扫卫生(释放内存),让服务员(CPU)每时每刻盯着每一张桌子,一旦有空盘子立马收走。结果是卫生保持得很好,但新来的客人都没人接待了。 所以,Redis 选择了退一步:牺牲一点点内存(数据过期了不一定立马删),换取 CPU 的稳定运行(定期+惰性删除)。”