大家好,我是程序员二叉。


简介

Redis 作为主流内存数据库,键过期处理、内存淘汰机制是日常开发与面试的核心考点。本文全面讲解 Redis 三大过期键删除策略、八大内存淘汰策略,剖析 LRU 算法底层实现,同时解答过期键内存占用、主从节点过期数据同步等常见问题,原理结合实战,干货满满。欢迎点赞收藏关注。


一、Redis 键过期三大删除策略

1. 定时删除

在设置键过期时间的同时,创建定时器,到期立刻主动删除 key。

  • 优点:内存释放及时,过期数据不占用内存。
  • 缺点:大量过期键会占用 CPU,主线程压力大,线上基本不用

2. 惰性删除

键过期后不主动删除,每次访问该 key 时才检查过期状态,过期则删除并返回空。

  • 优点:CPU 开销极小,仅在读写时判断。
  • 缺点:过期键长期无人访问会一直占用内存,出现内存泄漏。

3. 定期删除(Redis 默认策略)

每隔一段时间,随机抽取部分过期键批量删除,限制扫描时长,避免阻塞主线程。

  • 思路:折中方案,兼顾 CPU 与内存。
  • 流程:轮询所有过期字典,随机取样检查、删除过期 key,达到时间阈值立即停止。

总结:Redis 实际采用 惰性删除 + 定期删除 组合策略。


二、Redis 内存满后 八大淘汰策略

当 Redis 达到 maxmemory 上限,按照策略淘汰 key,共分为 4 大类 8 种

1. 不淘汰(默认之一)

  1. noeviction:拒绝写入,直接返回错误,不删除任何键。

2. 淘汰所有键(不区分是否过期)

  1. allkeys-lru:从所有 key 中淘汰最近最少使用的键。
  2. allkeys-lfu:从所有 key 中淘汰使用频率最低的键。
  3. allkeys-random:从所有 key 中随机删除。

3. 仅淘汰过期键(只针对带 TTL 的 key)

  1. volatile-lru:从设置了过期时间的 key 中,淘汰最近最少使用。
  2. volatile-lfu:从设置了过期时间的 key 中,淘汰使用频率最低。
  3. volatile-random:从设置了过期时间的 key 中随机删除。

4. 按过期时间淘汰

  1. volatile-ttl:从过期键中,优先删除剩余存活时间最短的 key。

企业常用:allkeys-lruvolatile-lru


三、LRU 底层原理 & Redis 近似 LRU 实现

1. 标准 LRU 原理

LRU(Least Recently Used)最近最少使用,核心思想:优先淘汰长时间未访问的数据

  • 经典实现:双向链表 + 哈希表
  • 流程:访问数据 → 移到链表头部;内存不足 → 删除链表尾部节点。
  • 缺点:标准 LRU 链表维护开销大。

2. Redis 近似 LRU(非精准 LRU)

Redis 没有使用标准双向链表 LRU,而是采用近似 LRU 算法

  1. 每个 Redis 对象维护一个 24 bit 的 lru 时间戳,记录最后访问时间。
  2. 内存淘汰时,随机采样一批 key,对比 lru 时间戳,删除其中最久未访问的。
  3. 不遍历全库、不维护链表,大幅降低性能开销
  • 特点:精度略低于标准 LRU,但性能极高,满足缓存场景需求。

四、过期键内存占用 & 主从节点过期同步

1. 过期键是否主动占用内存?

  • 过期后不会立刻释放内存
    1. 惰性删除:无人访问则一直占用内存
    2. 定期删除:只会随机抽样清理,仍有部分过期键残留。
  • 结论:已过期但未被删除的键,会持续占用内存

2. 主从架构下过期策略与同步规则

  1. 过期逻辑只由主节点执行
    • 主节点发现 key 过期:执行删除操作,并向从节点发送 DEL 命令。
    • 从节点本身不主动删除过期键,仅被动执行主节点下发的删除指令。
  2. 从节点读取过期 key:
    从节点不会主动判断过期,依旧返回数据,直到收到主节点的删除指令。
  3. 哨兵/集群模式:规则同主从,过期删除统一由主节点负责

五、总结

  1. 过期删除:Redis 放弃开销过高的定时删除,采用惰性删除+定期删除组合,在 CPU 负载和内存占用之间做平衡。
  2. 内存淘汰:共 8 种策略,分为拒绝写入、全键淘汰、仅过期键淘汰、按剩余TTL淘汰四大类,线上优先选用 LRU 相关策略。
  3. LRU 实现:摒弃标准高精度 LRU,改用时间戳+随机采样的近似 LRU,以小幅精度损失换取更高运行效率。
  4. 过期键与主从同步:过期键未清理前会持续占用内存;主从架构中主节点统一处理过期删除,从节点只同步删除指令,不自主判断清理。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐