3. 缓存穿透击穿雪崩怎么回答
缓存穿透、缓存击穿、缓存雪崩是 Redis 面试中非常经典的三个概念。很多测试同学觉得这是后端开发才需要掌握的内容,但如果项目里用 Redis 做缓存,测试也应该理解它们会造成什么现象,以及如何设计测试场景。面试中不要求测试人员给出非常复杂的架构方案,但需要能讲清楚区别、风险、常见解决思路,以及测试时关注什么。
这三个问题都和“请求没有从缓存挡住,压力打到数据库”有关,但触发原因不同。缓存穿透是查不存在的数据,缓存击穿是热点 key 失效,缓存雪崩是大量 key 同时失效或 Redis 故障。测试回答时要避免只背定义,最好结合商品详情、活动页、登录验证码、库存等业务场景说明。
一、为什么要理解这三个问题
Redis 缓存的目的通常是保护数据库、提升查询速度。但如果缓存失效或没有命中,大量请求会直接打到数据库,可能导致响应变慢、接口超时,严重时数据库被打挂。
测试中可能看到的现象:
- 某些非法查询非常慢;
- 活动开始时商品详情接口突然超时;
- 某个热点商品缓存过期后数据库压力飙升;
- 大量缓存同时过期导致接口整体变慢;
- Redis 宕机后核心接口大面积失败。
理解这三个概念,有助于测试设计异常和高并发场景。
二、缓存穿透是什么
缓存穿透指查询一个缓存和数据库中都不存在的数据。因为缓存没有,系统去查数据库;数据库也没有。如果大量请求都查不存在的数据,就会绕过缓存持续打数据库。
典型场景:
GET /api/products/-1
GET /api/products/不存在的商品ID
如果攻击者不断请求不存在的 ID,缓存无法命中,数据库会被频繁查询。
测试关注点
- 查询不存在的商品 ID;
- 查询非法用户 ID;
- 查询随机订单号;
- 批量请求不存在数据;
- 看接口是否有参数校验;
- 看空结果是否缓存;
- 看是否有布隆过滤器或限流。
常见解决思路
- 参数校验,拦截非法 ID;
- 缓存空值,避免重复查库;
- 布隆过滤器判断数据是否可能存在;
- 限流和风控。
测试不用实现这些方案,但要能说明验证点。
三、缓存击穿是什么
缓存击穿指某个热点 key 在失效瞬间,大量并发请求同时访问这个 key,导致请求一起打到数据库。
典型场景:热门商品详情、秒杀活动信息、首页配置。
比如某个热门商品缓存刚好过期,同时有大量用户访问,所有请求发现缓存没有,就都去查数据库,数据库压力瞬间增大。
测试关注点
- 热点 key 过期瞬间并发请求;
- 是否只有一个请求回源数据库;
- 其他请求是否等待或复用结果;
- 是否设置互斥锁;
- 热点 key 是否不过期或逻辑过期。
常见解决思路
- 热点 key 设置不过期;
- 使用互斥锁,防止并发回源;
- 逻辑过期,后台异步刷新;
- 预热热点缓存。
四、缓存雪崩是什么
缓存雪崩指大量缓存 key 在同一时间失效,或者 Redis 整体不可用,导致大量请求同时打到数据库。
典型原因:
- 很多 key 设置相同过期时间;
- Redis 宕机;
- 缓存集群故障;
- 发布后批量清缓存;
- 活动开始前缓存预热失败。
测试关注点
- 大量 key 同时过期后的接口表现;
- Redis 不可用时系统是否降级;
- 是否给过期时间加随机值;
- 是否有限流、熔断;
- 核心接口是否能回源数据库;
- 数据库是否被压垮。
常见解决思路
- 过期时间加随机值;
- Redis 高可用;
- 限流、熔断、降级;
- 缓存预热;
- 本地缓存兜底。
五、三者怎么区分
可以用一句话区分:
- 穿透:查不存在的数据,缓存和数据库都没有;
- 击穿:一个热点 key 失效,大量请求打数据库;
- 雪崩:大量 key 同时失效或 Redis 故障,大量请求打数据库。
对测试来说,可以这样记:
- 穿透看非法请求和空数据;
- 击穿看热点数据和并发;
- 雪崩看大面积失效和系统稳定性。
六、项目场景:商品详情缓存穿透
测试步骤:
- 构造不存在的商品 ID;
- 高频请求商品详情接口;
- 观察接口响应时间;
- 查看数据库查询压力;
- 查看是否缓存空结果;
- 查看是否有参数校验或限流。
预期:系统应快速返回商品不存在,而不是每次都查数据库导致响应变慢。
七、项目场景:热门商品缓存击穿
测试步骤:
- 找到热门商品 key;
- 让缓存过期或清除缓存;
- 同时发起大量请求;
- 观察数据库查询次数;
- 查看接口响应时间和错误率;
- 验证是否有互斥锁或缓存重建机制。
预期:不能所有请求都同时打数据库。
八、项目场景:活动缓存雪崩
活动页可能缓存大量商品、价格、库存、配置。如果这些 key 同时过期,活动开始时请求量大,数据库压力会陡增。
测试关注:
- 缓存是否提前预热;
- key 过期时间是否分散;
- Redis 异常时是否有降级页面;
- 数据库是否能承受回源;
- 是否有限流保护。
九、面试回答模板
如果面试官问“缓存穿透、击穿、雪崩怎么回答”,可以这样说:
缓存穿透是请求查询一个缓存和数据库都不存在的数据,导致每次都绕过缓存查数据库,比如不断请求不存在的商品 ID;测试时会验证非法参数、空结果缓存、限流和参数校验。缓存击穿是某个热点 key 过期瞬间,大量并发请求同时打到数据库,比如热门商品详情缓存失效;测试时会模拟热点 key 过期后的并发请求,看是否有互斥锁或逻辑过期机制。缓存雪崩是大量 key 同时过期或 Redis 故障,导致大量请求同时打数据库;测试时关注过期时间是否分散、Redis 异常降级、限流熔断和缓存预热。
十、常见追问
追问:缓存空值解决什么?
主要解决缓存穿透。不存在的数据也缓存一个空结果,避免每次都查数据库。
追问:过期时间加随机值解决什么?
主要降低缓存雪崩风险,避免大量 key 同时过期。
追问:互斥锁解决什么?
主要解决缓存击穿,避免热点 key 失效后大量请求同时回源数据库。
追问:测试怎么模拟?
穿透模拟不存在 ID;击穿模拟热点 key 过期并发请求;雪崩模拟大量 key 同时过期或 Redis 不可用。
十一、练习清单
- 用一句话区分穿透击穿雪崩;
- 准备一个穿透案例;
- 准备一个击穿案例;
- 准备一个雪崩案例;
- 理解缓存空值;
- 理解互斥锁;
- 理解过期时间随机化;
- 设计热点商品并发测试;
- 思考 Redis 故障降级;
- 准备面试回答。
缓存穿透、击穿、雪崩不只是后端概念。测试要能从非法请求、热点并发和大面积失效三个角度设计测试,验证系统稳定性和降级能力。
配套刷题:

