【Redis】 面试必问:过期删除、八大淘汰策略、LRU 与主从过期同步
·
大家好,我是程序员二叉。
简介
Redis 作为主流内存数据库,键过期处理、内存淘汰机制是日常开发与面试的核心考点。本文全面讲解 Redis 三大过期键删除策略、八大内存淘汰策略,剖析 LRU 算法底层实现,同时解答过期键内存占用、主从节点过期数据同步等常见问题,原理结合实战,干货满满。欢迎点赞收藏关注。
一、Redis 键过期三大删除策略
1. 定时删除
在设置键过期时间的同时,创建定时器,到期立刻主动删除 key。
- 优点:内存释放及时,过期数据不占用内存。
- 缺点:大量过期键会占用 CPU,主线程压力大,线上基本不用。
2. 惰性删除
键过期后不主动删除,每次访问该 key 时才检查过期状态,过期则删除并返回空。
- 优点:CPU 开销极小,仅在读写时判断。
- 缺点:过期键长期无人访问会一直占用内存,出现内存泄漏。
3. 定期删除(Redis 默认策略)
每隔一段时间,随机抽取部分过期键批量删除,限制扫描时长,避免阻塞主线程。
- 思路:折中方案,兼顾 CPU 与内存。
- 流程:轮询所有过期字典,随机取样检查、删除过期 key,达到时间阈值立即停止。
总结:Redis 实际采用 惰性删除 + 定期删除 组合策略。
二、Redis 内存满后 八大淘汰策略
当 Redis 达到 maxmemory 上限,按照策略淘汰 key,共分为 4 大类 8 种:
1. 不淘汰(默认之一)
- noeviction:拒绝写入,直接返回错误,不删除任何键。
2. 淘汰所有键(不区分是否过期)
- allkeys-lru:从所有 key 中淘汰最近最少使用的键。
- allkeys-lfu:从所有 key 中淘汰使用频率最低的键。
- allkeys-random:从所有 key 中随机删除。
3. 仅淘汰过期键(只针对带 TTL 的 key)
- volatile-lru:从设置了过期时间的 key 中,淘汰最近最少使用。
- volatile-lfu:从设置了过期时间的 key 中,淘汰使用频率最低。
- volatile-random:从设置了过期时间的 key 中随机删除。
4. 按过期时间淘汰
- volatile-ttl:从过期键中,优先删除剩余存活时间最短的 key。
企业常用:
allkeys-lru、volatile-lru。
三、LRU 底层原理 & Redis 近似 LRU 实现
1. 标准 LRU 原理
LRU(Least Recently Used)最近最少使用,核心思想:优先淘汰长时间未访问的数据。
- 经典实现:双向链表 + 哈希表。
- 流程:访问数据 → 移到链表头部;内存不足 → 删除链表尾部节点。
- 缺点:标准 LRU 链表维护开销大。
2. Redis 近似 LRU(非精准 LRU)
Redis 没有使用标准双向链表 LRU,而是采用近似 LRU 算法:
- 每个 Redis 对象维护一个 24 bit 的 lru 时间戳,记录最后访问时间。
- 内存淘汰时,随机采样一批 key,对比 lru 时间戳,删除其中最久未访问的。
- 不遍历全库、不维护链表,大幅降低性能开销。
- 特点:精度略低于标准 LRU,但性能极高,满足缓存场景需求。
四、过期键内存占用 & 主从节点过期同步
1. 过期键是否主动占用内存?
- 键过期后不会立刻释放内存:
- 惰性删除:无人访问则一直占用内存。
- 定期删除:只会随机抽样清理,仍有部分过期键残留。
- 结论:已过期但未被删除的键,会持续占用内存。
2. 主从架构下过期策略与同步规则
- 过期逻辑只由主节点执行
- 主节点发现 key 过期:执行删除操作,并向从节点发送
DEL命令。 - 从节点本身不主动删除过期键,仅被动执行主节点下发的删除指令。
- 主节点发现 key 过期:执行删除操作,并向从节点发送
- 从节点读取过期 key:
从节点不会主动判断过期,依旧返回数据,直到收到主节点的删除指令。 - 哨兵/集群模式:规则同主从,过期删除统一由主节点负责。
五、总结
- 过期删除:Redis 放弃开销过高的定时删除,采用惰性删除+定期删除组合,在 CPU 负载和内存占用之间做平衡。
- 内存淘汰:共 8 种策略,分为拒绝写入、全键淘汰、仅过期键淘汰、按剩余TTL淘汰四大类,线上优先选用 LRU 相关策略。
- LRU 实现:摒弃标准高精度 LRU,改用时间戳+随机采样的近似 LRU,以小幅精度损失换取更高运行效率。
- 过期键与主从同步:过期键未清理前会持续占用内存;主从架构中主节点统一处理过期删除,从节点只同步删除指令,不自主判断清理。
更多推荐




所有评论(0)