湖州开具餐饮发票流程

作者:技术拾光

时间:2026-07-29

浏览:654

针对缓存穿透、击穿和雪崩问题,穿透通过参数校验、缓存空值及布隆过滤器分层处理;击穿采用互斥锁(原子命令)或逻辑过期加异步刷新;雪崩需结合随机TTL、数据预热、本地缓存及限流降级等多层防护。

文章目录

近期查看 Java 后端秋招提前批面试经验,Redis 相关问题的出现频率很高。并非简单询问“Redis 有哪些数据结构”,而是从项目实践切入:简历中提及了缓存优化,那么缓存穿透、击穿、雪崩分别如何应对?为什么采取这些措施?线上是否真正执行过?

这类问题看似常规,实则容易在追问中暴露短板。许多人直接背诵“穿透用布隆过滤器,击穿用互斥锁,雪崩加随机过期时间”,面试官进一步追问便难以应对。

更建议从“一次请求的完整路径”来组织回答。

首先明确三者的区别
缓存穿透,指请求的数据本身不存在。例如持续查询 id 为负数的商品,缓存和数据库中均无数据,每次请求都直接打到数据库,这才称为穿透。

缓存击穿,指某个热点 key 突然过期。比如首页推荐配置、爆款商品库存、秒杀活动信息等,平时由缓存承载压力,一旦该 key 失效,大量请求同时涌入数据库。

缓存雪崩,指一批 key 在同一时间失效,或 Redis 集群本身短暂不可用。这不是单个热点 key 的问题,而是缓存层整体失效。

面试中先清晰阐述这些区别,后续讨论才有基础。若将击穿与穿透混淆,面试官通常会认为你仅靠背诵答题。

穿透:不应只提布隆过滤器

处理穿透的第一层措施是参数校验。

若业务规定商品 id 必须为正整数,那么负数、超长字符串、明显不合法的枚举值应在入口处拦截。避免此类请求进入缓存层,更不应落库。

第二层是缓存空值。数据库查询不到结果时,可将空结果写入缓存,设置较短的过期时间(如几十秒到几分钟)。这样同一不存在的 key 不会反复查询数据库。

布隆过滤器适用于更重的场景:数据集合相对稳定、非法 key 数量庞大、数据库压力已较为明显。其特点是可能误判“存在”,但不会将真实存在的数据误判为不存在。因此可用作前置过滤,但不能作为最终依据。

一个稳妥的回答可以这样组织:

  • 先进行入参校验,拦截明显非法请求;
  • 数据库查询为空时缓存空值,避免同一不存在的 key 重复冲击数据库;
  • 若非法 key 规模较大,可将合法 id 集合放入布隆过滤器进行前置判断。

若面试官追问“缓存空值是否会污染 Redis”,可回应:空值 TTL 应短、value 应小,并且仅对高频不存在的 key 进行缓存,而非所有 miss 都无脑写入。

击穿:互斥锁并非仅用 SETNX

热点 key 过期时,最需防范的是大量线程同时查询数据库并回写缓存。

常见做法是加互斥锁:只有获取锁的线程查询数据库并重建缓存,其他线程等待后重试,或直接返回旧值。

这里有常见陷阱:不要使用“SETNX 后再 EXPIRE”。这两个命令非原子操作,中间进程崩溃可能造成死锁。Redis 中更推荐使用一条 SET 命令带 NX 和 EX 参数,将“仅在不存在时设置”与“过期时间”合并为原子命令。解锁时还需校验 value,通常使用 Lua 脚本确保只删除自己的锁。

若业务允许短暂旧数据,逻辑过期方案更友好:缓存中不仅存放数据,还附带一个逻辑过期时间。请求到达时发现逻辑过期,并非立即让所有线程查库,而是由一个线程异步刷新,其他线程先使用旧数据。

这在首页配置、榜单、推荐位等场景中很常见。用户看到几十秒前的数据影响不大,但数据库被打爆就是真实事故。

我会这样回答:

  • 强一致要求高的热点 key,使用互斥锁重建缓存;
  • 读多写少、允许短暂旧值的热点 key,采用逻辑过期加异步刷新;
  • 锁需设置过期时间,value 需唯一,删除锁时需校验 owner。

这几句话相比单纯背诵“互斥锁”更有分量。

雪崩:随机 TTL 仅为最低配置

雪崩的典型原因有两个。

其一是大量 key 同时过期。例如批量导入缓存时全部设为 30 分钟,半小时后一起失效。可通过随机 TTL 缓解:在基础过期时间上增加一段随机抖动,使 key 分散失效。

其二是缓存服务本身不可用。此时随机 TTL 无法解决,需考察系统是否具备本地缓存、限流、降级、熔断,以及核心数据能否预热。

面试时可分层阐述:

  • 过期时间层:TTL 加入随机值,避免同批 key 同时失效。
  • 热点数据层:上线或活动前进行预热,不等待用户请求触发重建。
  • 系统保护层:本地缓存兜底、接口限流、数据库保护、非核心功能降级。

若项目仅为普通后台系统,无高并发活动,不必硬编秒杀场景。可以说“未做过秒杀,但在后台字典、配置缓存中会使用随机 TTL,避免定时任务批量刷新导致同时过期”。这样的回答反而更真实。

面试官真正关注的是实践,而非名词

这类问题最终通常会落到项目细节。

若简历中写到了 Redis,应提前想清楚以下问题:

  • 哪些数据使用了缓存?为什么这些数据适合缓存?
  • key 如何设计?是否包含前缀、版本号、业务 id?
  • TTL 设为多少?固定值还是带随机?
  • 数据更新时,是删除缓存、更新缓存,还是延迟双删?
  • 若缓存未命中,数据库能否承受?是否有限流?

这比背诵十页 Redis 面试题更为关键。

准备此类问题时,可将简历中的项目描述输入面灵 AI,让其以面试官口吻连续追问五轮。第一轮通常能应对,第三轮开始便能发现自身理解薄弱的环节。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›