【Redis】 面试必问:过期删除、八大淘汰策略、LRU 与主从过期同步

【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 的 keyvolatile-lru从设置了过期时间的 key 中淘汰最近最少使用。volatile-lfu从设置了过期时间的 key 中淘汰使用频率最低。volatile-random从设置了过期时间的 key 中随机删除。4. 按过期时间淘汰volatile-ttl从过期键中优先删除剩余存活时间最短的 key。企业常用allkeys-lru、volatile-lru。三、LRU 底层原理 Redis 近似 LRU 实现1. 标准 LRU 原理LRULeast Recently Used最近最少使用核心思想优先淘汰长时间未访问的数据。经典实现双向链表 哈希表。流程访问数据 → 移到链表头部内存不足 → 删除链表尾部节点。缺点标准 LRU 链表维护开销大。2. Redis 近似 LRU非精准 LRURedis没有使用标准双向链表 LRU而是采用近似 LRU 算法每个 Redis 对象维护一个24 bit 的 lru 时间戳记录最后访问时间。内存淘汰时随机采样一批 key对比 lru 时间戳删除其中最久未访问的。不遍历全库、不维护链表大幅降低性能开销。特点精度略低于标准 LRU但性能极高满足缓存场景需求。四、过期键内存占用 主从节点过期同步1. 过期键是否主动占用内存键过期后不会立刻释放内存惰性删除无人访问则一直占用内存。定期删除只会随机抽样清理仍有部分过期键残留。结论已过期但未被删除的键会持续占用内存。2. 主从架构下过期策略与同步规则过期逻辑只由主节点执行主节点发现 key 过期执行删除操作并向从节点发送DEL命令。从节点本身不主动删除过期键仅被动执行主节点下发的删除指令。从节点读取过期 key从节点不会主动判断过期依旧返回数据直到收到主节点的删除指令。哨兵/集群模式规则同主从过期删除统一由主节点负责。五、总结过期删除Redis 放弃开销过高的定时删除采用惰性删除定期删除组合在 CPU 负载和内存占用之间做平衡。内存淘汰共 8 种策略分为拒绝写入、全键淘汰、仅过期键淘汰、按剩余TTL淘汰四大类线上优先选用 LRU 相关策略。LRU 实现摒弃标准高精度 LRU改用时间戳随机采样的近似 LRU以小幅精度损失换取更高运行效率。过期键与主从同步过期键未清理前会持续占用内存主从架构中主节点统一处理过期删除从节点只同步删除指令不自主判断清理。