Redis 面试里,缓存穿透、击穿、雪崩经常被问,但另一个容易被忽略的细节是过期和淘汰。面试官可能会问:缓存设置了过期时间,Redis 是立刻删除吗?内存满了会怎样?为什么线上某些缓存突然不见?大量 key 同时过期会有什么风险?
这些问题背后,考的是你是否理解缓存不是无限稳定的存储。
过期删除不是精确闹钟
给缓存设置过期时间,并不意味着时间一到就一定立刻删除。Redis 通常会在访问时发现过期再删除,也会定期抽样检查一批过期键。这样做是为了控制删除成本。如果每个键都设置一个精确闹钟,系统开销会很大。
面试里可以用简单话解释:过期时间是告诉 Redis 这份数据最晚不应该再被当作有效数据使用,但实际清理可能通过访问触发和后台抽查完成。
淘汰策略和过期不同
过期是键到了时间失效;淘汰是内存不够时,Redis 根据策略主动删一些键。比如可能删最近少用的数据,也可能只在设置了过期时间的键里选择。不同策略适合不同业务。
如果缓存里放的是热点数据,淘汰策略不合理,可能把关键缓存删掉,导致大量请求回源数据库。面试里可以讲:缓存不是只要写进去就安全,还要监控内存使用、命中率和淘汰次数。
批量过期会造成雪崩
如果大量缓存使用相同过期时间,比如活动开始前批量预热,30 分钟后一起过期,就可能导致大量请求同时打到数据库。这就是缓存雪崩的一种表现。常见处理方式是给过期时间加随机分散,热点数据主动续期或后台刷新。
但也不能简单把过期时间设得很长。价格、库存、权限这类数据如果旧太久,会影响业务正确性。缓存时间要和业务容忍度绑定。
项目回答方式
可以这样回答:我们对读多写少的配置和详情数据设置缓存,但不会所有键使用同一个过期时间,而是在基础时间上加随机分散,避免集中失效。热点数据会通过后台任务刷新,Redis 内存使用、命中率和淘汰次数都有监控。如果缓存失效,接口可以回源数据库,但会配合限流和降级,避免瞬时压力打穿数据库。
Redis 过期和淘汰策略面试的重点,不是背几个策略名字,而是说明缓存失效时业务和数据库如何保持可控。
缓存消失的几种原因
线上说“缓存没了”,不一定只有过期。可能是到了 TTL,被内存淘汰,被代码删除,被批量刷新覆盖,也可能是不同环境或 key 规则不一致。面试时把原因拆开,排查才像真实项目。
| 现象 | 可能原因 | 怎么确认 | 应对方式 |
|---|---|---|---|
| 到点后大量失效 | TTL 设置过于集中 | 抽样看过期时间分布 | 加随机过期和预热 |
| 内存压力后 key 不见 | 淘汰策略触发 | 看内存和淘汰计数 | 调整容量和策略 |
| 某类 key 被清掉 | 代码主动删除或刷新 | 查发布记录和操作日志 | 加命名空间和审计 |
| 缓存命中率波动 | key 拼接不一致 | 对比请求参数和 key | 统一 key 生成方法 |
这篇题的核心不是 Redis 会不会删除 key,而是你能不能把过期、淘汰、主动删除和缓存设计区别开。区别清楚,方案才不会乱用。