Java大厂面试实录:Spring Boot+微服务+分布式缓存三连问,谢飞机现场翻车?

面试官:请进。

谢飞机:您好!我是来面试Java开发岗的谢飞机,我有三年工作经验,熟练使用Spring Boot、MyBatis、Redis……

面试官:嗯,坐吧。我们今天围绕一个电商秒杀场景来聊技术。先从基础开始——


🟢 第一轮:Spring Boot 与 Web 层设计(电商商品详情页)

Q1:如果我们要做一个高并发的商品详情页,用 Spring Boot 如何快速搭建?核心注解有哪些?

谢飞机:这个简单!用 @SpringBootApplication 启动,里面包含 @Configuration@EnableAutoConfiguration@ComponentScan。然后 Controller 用 @RestController,自动装配用 @Autowired……我都背过!

面试官:不错,那如果页面要动态渲染模板,比如促销信息,你会选什么模板引擎?

谢飞机:JSP 啊!大学教材都这么教的!

面试官:……现在主流是 Thymeleaf 或者前后端分离。JSP 在内嵌 Tomcat 中支持差,部署也麻烦。

谢飞机:哦……那我也用过 Thymeleaf,语法类似 HTML,还能预览,对前端友好。

面试官:还行。那静态资源呢?JS/CSS 放哪儿?

谢飞机:放在 src/main/resources/static 下,直接访问就行,比如 /js/app.js

面试官:✅ 基础扎实,继续。


🟡 第二轮:数据库与缓存设计(应对高并发读)

Q2:商品详情页每秒可能有上万次访问,数据库扛不住,怎么办?

谢飞机:加缓存!Redis!先把数据查出来放 Redis,下次直接读,不走数据库。

面试官:怎么集成?用哪个客户端?

谢飞机:用 Spring Data Redis,配置 RedisTemplate,存成 JSON 格式。

面试官:缓存穿透怎么办?比如恶意请求不存在的商品 ID?

谢飞机:呃……加个默认值?比如空对象也存进去?

面试官:接近了,叫“缓存空值”,配合布隆过滤器更好。那缓存雪崩呢?

谢飞机:雪崩?是不是……大家都抢同一个商品?

面试官:不是。是大量缓存同时失效,数据库瞬间被打垮。

谢飞机:那……那就别让它们同时失效!设置随机过期时间!比如 TTL 在 30~60 分钟随机。

面试官:✅ 还行。那更新数据库时,先删缓存还是先改库?

谢飞机:先删缓存!这样下次读会重建。

面试官:如果删完缓存,还没改库就宕机了?

谢飞机:那……那等它重启?或者……我再删一次?

面试官:可以用“延迟双删”或结合 Binlog 异步更新,比如 Canal。


🔴 第三轮:微服务与高可用设计(订单超卖问题)

Q3:用户抢到商品后下单,如何防止超卖?比如库存只有 100,结果卖了 120。

谢飞机:数据库加个字段 stock,每次减一,SQL 写 UPDATE goods SET stock = stock - 1 WHERE id = 1 AND stock > 0

面试官:在单体服务可以。如果是分布式微服务,多个实例同时扣减呢?

谢飞机:那……加 Redis 分布式锁!SET lock:order 1 EX 10 NX,拿到锁才能操作。

面试官:如果拿锁后服务宕机,没释放呢?

谢飞机:加过期时间!EX 10 就是 10 秒自动删。

面试官:那执行时间超过 10 秒呢?锁过期了,别人又进来,还是超卖。

谢飞机:那……那我开个线程续命!每隔 5 秒看看还在不在执行,还在就刷新 TTL!

面试官:这叫“看门狗机制”,Redisson 就这么干的。但还有更优方案吗?

谢飞机:呃……用 ZooKeeper?或者……数据库乐观锁?

面试官:还可以用消息队列削峰,把请求异步化,比如 Kafka 写入,消费端串行处理。

Q4:整个链路怎么监控?比如某个环节慢了。

谢飞机:打日志!Logback 输出到文件,再 grep……

面试官:生产环境几万台机器,grep 得到什么时候?

谢飞机:呃……ELK?我听说过,Logstash 收集,Elasticsearch 存,Kibana 查。

面试官:调用链呢?A 服务调 B,B 调 C,哪里慢了?

谢飞机:那个……Zipkin?Spring Cloud Sleuth 集成?

面试官:不错,至少知道名字。最后,如果让你用 CI/CD 发布这个系统,流程是什么?

谢飞机:写代码 → 提交 Git → Jenkins 构建 → 打包 Docker → 推镜像 → Kubernetes 滚动更新!

面试官:……你平时刷题挺多啊。


面试官:今天就到这里。你的基础知识还行,但深度不够,尤其在高并发实战方面。我们会综合评估,回去等通知吧

谢飞机:好嘞!等您电话!(转身撞到门框)


✅ 面试问题详解(小白也能学会)

场景背景:电商秒杀系统

我们需要构建一个高并发的电商商品详情页 + 下单系统,涉及:

  • 高频读取商品信息 → 缓存优化
  • 分布式环境下扣减库存 → 防超卖
  • 多服务调用链路 → 微服务治理
  • 系统可观测性 → 监控与日志

1. Spring Boot 快速搭建

  • @SpringBootApplication:三位一体注解,开启自动配置和组件扫描。
  • 静态资源默认路径:resources/static,无需额外配置。
  • 模板引擎推荐 Thymeleaf:天然支持 HTML 预览,适合服务端渲染;现代项目更多采用前后端分离,返回 JSON 即可。

2. Redis 缓存三大问题及解决方案

| 问题 | 表现 | 解决方案 | |------|------|----------| | 缓存穿透 | 查询不存在的数据,绕过缓存直击 DB | 缓存空值 + 布隆过滤器 | | 缓存击穿 | 热点 key 失效瞬间大量请求打 DB | 热点数据永不过期 or 互斥重建 | | 缓存雪崩 | 大量 key 同时失效 | 过期时间加随机值(如 ±30%)|

使用 Spring Data Redis + RedisTemplate 快速集成,序列化建议用 Jackson2JsonRedisSerializer


3. 分布式环境下防超卖方案

方案一:数据库层面
  • 乐观锁:version 字段或 stock > 0 条件更新
  • 悲观锁:SELECT FOR UPDATE(注意死锁)
方案二:Redis 分布式锁
  • 基础实现:SET key value EX seconds NX
  • 生产推荐:Redisson,支持可重入、看门狗自动续期、MultiLock 等
方案三:消息队列削峰
  • 用户抢购请求写入 Kafka
  • 消费端单线程或分片处理,串行扣库存
  • 结合限流(Resilience4j)、降级提升系统稳定性

4. 微服务可观测性

  • 日志收集:Logback → Logstash → Elasticsearch → Kibana(ELK)
  • 链路追踪:Spring Cloud Sleuth + Zipkin/Jaeger,记录 TraceID、SpanID
  • 指标监控:Micrometer 对接 Prometheus + Grafana,监控 QPS、响应时间、JVM 状态

5. CI/CD 流程(自动化发布)

Git Commit → GitHub/GitLab → Webhook → Jenkins
  → Maven/Gradle 构建 → Unit Test (JUnit 5)
  → Docker Build → Push to Registry
  → Kubernetes Rolling Update

工具链:GitHub Actions / GitLab CI 也可替代 Jenkins,实现轻量 CI。


总结:大厂考察重点

| 维度 | 考察点 | |------|--------| | 基础 | Spring Boot 注解、Maven 依赖管理 | | 深度 | 缓存策略、分布式锁、一致性 | | 实战 | 高并发设计、容错、监控 | | 广度 | 微服务生态、CI/CD、可观测性 |

谢飞机虽然搞笑,但很多回答反映了真实初级程序员的认知水平。想进大厂,不仅要“会用”,更要“懂原理”+“能落地”。


💡 学习建议

  • 动手搭建一个电商秒杀 Demo,集成 Redis + Kafka + Spring Boot + MySQL
  • 使用 Redisson 实现分布式锁
  • 接入 SkyWalking 或 Zipkin 查看调用链
  • 用 JMeter 压测,观察系统瓶颈
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐