Redis 过期策略与内存淘汰机制:面试必考点深度解析
大家好,我是程序员老王。Redis作为面试中的高频考点,尤其是它的过期策略和内存淘汰机制,几乎是中高级岗位必问的内容。今天咱们就来深入聊聊这两个核心机制,让你在面试时对答如流。
📁 2025年最新Java面试宝典网盘地址: 点击下载《2025 Java面试宝典》 提取码: 9b3g
🔍 Redis 的过期策略:键是怎么“消失”的?
我们知道Redis可以给键设置TTL(生存时间),那时间到了之后,Redis是如何处理这些过期的键的呢?这就涉及到它的过期策略了。Redis主要采用两种策略结合的方式:
-
惰性删除 (Lazy Expiration):
- 核心逻辑:当你去访问一个键的时候,Redis 才会检查这个键是否过期了。
- 流程:执行任何读写命令前(如
GET,HGET,SET等),先检查该键的过期时间。如果过期了,立刻删除这个键,然后才执行命令(对于读命令,返回nil)。 - 优点:对CPU友好。只在使用时检查,不会在非活动键上浪费CPU。
- 缺点:对内存不友好。如果一个键永远不再被访问,它就永远占着内存不释放,成为“僵尸”键,造成内存泄露。
-
定期删除 (Periodic Expiration):
- 核心逻辑:Redis 会周期性地(默认每秒10次)随机抽取一部分设置了过期时间的键进行检查,并删除其中已过期的键。
- 流程:
- 随机测试:每次从设置了过期时间的键中随机抽取一小批(默认20个)。
- 检查过期:删除这批键中所有已过期的。
- 判断比例:如果这批键中过期键的比例超过25%,则重复步骤1(继续随机抽取20个检查)。如果比例低于25%,则本次定期删除结束。
- 优点:一定程度上减少了内存泄露的风险。
- 缺点:
- 难以精确控制删除频率和数量。抽少了,过期键可能删不干净;抽多了,可能影响性能。
- 仍然不能保证所有过期键被及时删除,特别是那些不再被访问的键。
总结一下Redis的过期策略: 它是惰性删除 + 定期删除的组合拳。惰性删除是被动触发,定期删除是主动抽样清理。两者结合是性能和内存使用的一个折中方案。但要注意,过期策略本身并不能保证在内存用满时自动清理数据! 这就是内存淘汰机制要解决的问题了。

🧯 Redis 的内存淘汰机制:内存满了怎么办?
当Redis的内存使用达到配置的最大值 maxmemory 时,再写入新数据就会触发内存淘汰机制。这时Redis会按照配置的策略,删除一些键,腾出空间给新数据。Redis提供了8种淘汰策略(Redis 6.0及以上),通过 maxmemory-policy 配置:
- noeviction:默认策略。不淘汰任何数据。当内存不足时,新写入的操作会报错(如
(error) OOM command not allowed when used memory > 'maxmemory')。适用于对数据一致性要求极高的场景,但风险是服务可能不可写。 - allkeys-lru:在所有键中,使用
LRU算法(最近最少使用)淘汰最近最久未被使用的键。 - volatile-lru:在设置了过期时间的键中,使用
LRU算法淘汰最近最久未被使用的键。 - allkeys-lfu:在所有键中,使用
LFU算法(最不经常使用)淘汰访问频率最低的键(Redis 4.0+)。 - volatile-lfu:在设置了过期时间的键中,使用
LFU算法淘汰访问频率最低的键(Redis 4.0+)。 - allkeys-random:在所有键中,随机淘汰一个键。
- volatile-random:在设置了过期时间的键中,随机淘汰一个键。
- volatile-ttl:在设置了过期时间的键中,淘汰剩余生存时间 (TTL) 最短的键(即即将过期的)。
📌 如何选择淘汰策略?
- 如果你的数据访问模式是“最近使用过的,未来也更可能被使用”:优先考虑
allkeys-lru或volatile-lru。 - 如果你想更精准地淘汰访问频率低的冷数据:选择
allkeys-lfu或volatile-lfu。 - 如果你希望尽快清理掉即将过期的数据:选择
volatile-ttl。 - 如果你能容忍部分数据丢失,并希望尽量分散淘汰影响:
allkeys-random或volatile-random是个简单选择。 - 如果你绝对不能丢失数据,宁愿写失败:用
noeviction(需有完善的监控和告警)。 - 区分范围 (
allkeys-vsvolatile-): 关键在于你是否只想淘汰那些明确会过期的数据。如果没设置过期时间的键也很重要,避免被淘汰,就用volatile-*;如果所有键都可以作为淘汰候选,就用allkeys-*。一般建议使用allkeys-*策略,除非你对永不过期键有特别保护需求。

💡 面试场景如何回答?
面试官:“能详细解释下Redis的过期策略和内存淘汰机制吗?”
你可以这样组织答案:
- 明确概念: “Redis的过期策略解决的是
设置了TTL的键如何被自动删除的问题;内存淘汰机制解决的是Redis内存达到上限后如何继续写入新数据的问题。” - 详述过期策略: “过期策略主要靠两种方式配合:第一是
惰性删除,当客户端访问一个键时,Redis会检查它是否过期,过期就删。第二是定期删除,Redis默认每秒执行10次,每次随机抽取一批(比如20个)设了过期的键,删掉其中已过期的。如果这批键过期的比例超过25%,它会继续抽下一批,直到比例低于25%才停。这种组合是为了平衡CPU和内存的使用效率,但无法保证所有过期键都被及时清理。” - 引出内存淘汰: “所以,即使有过期策略,还是可能有大量过期键或不再使用的键占用内存。当内存达到
maxmemory限制时,就需要内存淘汰机制来腾空间了。” - 解释淘汰策略: “Redis提供了几种策略,通过
maxmemory-policy配置:noeviction:默认,内存满就报错不写入。allkeys-lru/volatile-lru:在所有键/有过期时间的键中,淘汰最近最少用的(LRU)。allkeys-lfu/volatile-lfu:淘汰访问频率最低的(LFU)。allkeys-random/volatile-random:随机淘汰。volatile-ttl:淘汰过期时间最短的。 (可简要提下allkeys和volatile前缀的区别)”
- 结合实际选择: “我们项目用的是
allkeys-lru,因为我们的数据访问模式比较符合‘最近用过的以后也更可能用’,且没有需要绝对保护的永不过期键。同时我们也会监控内存使用,避免频繁淘汰影响性能。” - (加分点) 提一下近似LRU/LFU: “其实Redis实现的LRU/LFU不是精确的,是基于采样的近似算法(为了性能和内存效率),但效果通常足够好。”
📢 提升面试竞争力,获取超值资源
面试准备离不开高质量的资料!我为大家整理了一份2025年最新Java面试宝典,包含了各大厂核心考点、高频真题解析、架构设计、性能优化、Redis深度实践等硬核内容:
📁 立即获取面试宝典: 点击下载《2025 Java面试宝典》 提取码: 9b3g
还在为刷题买会员发愁? 有个省钱妙招!如果你需要购买面试鸭会员,强烈推荐通过 面试鸭返利网 (mianshiyafanli.com) 来找我下单。通过这个渠道购买,可以享受高达25元的返利优惠!用更低的成本获取海量面试题库资源,性价比超高。点击下方链接直达:
[

