Skip to content

07-场景题与系统设计精选

对应原始资料:12-BAT/10-企业场景篇

本章把零散知识点串成"系统设计"和"问题排查"的能力,是大厂面试的压轴题。

一、海量数据处理

Q1:10 亿个 int,找出出现次数最多的前 10

  • 分治 + HashMap:分批读入,每个 int 计数存 HashMap。
  • 内存不够:分文件(hash 取模),每个文件单独统计再合并(MapReduce 思想)。
  • Top K:小顶堆(堆大小 10),最后堆里就是 Top 10。

Q2:100 亿 URL,去重

  • 布隆过滤器:空间省,有误判率。
  • 分片 + HashSet:按 hash 分到多个文件,每个文件内去重。

Q3:10 亿 QQ 号,找中位数

  • 桶计数:按高位分到 1024 个桶,统计每个桶大小,定位中位数所在桶。
  • 再在该桶内排序/递归。

Q4:海量数据找某个值是否存在

  • 布隆过滤器Hash + bitmap
  • 若要精确:分片 + 索引。

二、经典系统设计

Q5:设计一个短链系统

  • 发号器(雪花/数据库/Redis)生成 62 进制短码。
  • 存储:MySQL(长链 + 短码 + 过期)+ Redis 缓存。
  • 跳转:查询长链 → 302 重定向(统计点击)。

Q6:设计一个秒杀系统(高频)

见上一章 Q29。核心:

  • 前置拦截(CDN、限流、验证码)。
  • 库存预热 Redis,原子扣减。
  • 异步下单(MQ)。
  • 防超卖(Redisson 分布式锁 + DB 唯一约束)。

Q7:设计一个抢红包系统

  • 发红包:拆分为 N 份存 Redis List。
  • 抢:LPOP + 唯一校验(防重抢)。
  • 持久化:异步 MQ 落库。

Q8:设计一个朋友圈 Feed 流

  • 推模式(写扩散):发布时写入所有粉丝收件箱。
  • 拉模式(读扩散):登录时实时拉取关注人最新。
  • 推拉结合:大 V 拉,普通用户推。

Q9:设计一个统一登录 SSO

  • 中央认证服务器 CAS,登录后发 token。
  • 各子系统校验 token(JWT 自包含 / Redis 查询)。
  • 单点登出:删 token。

Q10:设计一个限流系统

  • 单机:Guava RateLimiter、Sentinel。
  • 分布式:Redis + Lua 实现令牌桶/漏桶。
  • 网关层:Gateway RequestRateLimiter

三、生产问题排查

Q11:线上 OOM 怎么排查

  1. -XX:+HeapDumpOnOutOfMemoryError 自动 dump。
  2. MAT / jvisualvm 打开 hprof。
  3. 找最大对象 → 看引用链 → 定位泄漏代码。
  4. arthas heapdump 在线 dump。

Q12:CPU 100% 怎么办

见上一章 Q33。top → top -Hp → printf %x → jstack

Q13:接口响应慢

  • APM(SkyWalking / Pinpoint)看耗时分布。
  • 慢 SQL:SHOW PROCESSLIST、慢查询日志。
  • GC:jstat -gcutil
  • 网络瓶颈、依赖服务慢。

Q14:死锁排查

  • jstack pid 找 "Found Java-level deadlock"。
  • arthas thread -b
  • 数据库:SHOW ENGINE INNODB STATUS

Q15:消息消费失败堆积

  • 看消费者日志,定位失败原因。
  • 临时扩容消费者。
  • 修复后死信队列人工处理。

四、常用工具清单

工具用途
arthas在线诊断(watch/trace/heapdump)
jstack线程堆栈
jstatGC 统计
jmap堆 dump
VisualVM / JConsole可视化监控
MAT堆内存分析
SkyWalking / Zipkin链路追踪
Prometheus + Grafana指标监控
ELK / Loki日志收集
JMeter压测
Postman / Apifox接口测试

五、软技能与项目表达

面试常见提问:

  • 「介绍一个你最有挑战的项目」—— 用 STAR 法:Situation 背景、Task 任务、Action 行动、Result 结果。
  • 「项目中你解决了什么难题」—— 准备 2-3 个深度故事(性能优化、复杂 bug、架构演进)。
  • 「你怎么学习新技术」—— 官方文档 + 源码 + 实战项目。

高频考点速记

  • 海量数据:分治 + HashMap + 小顶堆 / 布隆过滤器
  • 秒杀:限流 + Redis 预扣 + MQ 异步 + 唯一约束
  • Feed 流:推(写扩散)/ 拉(读扩散)/ 推拉结合
  • 排查:top → 线程 → jstack / arthas
  • OOM:dump → MAT → 找引用链

恭喜!你已学完整个教程。最后建议:

  1. 挑一个综合项目(如资料中的「黑马商城」「微服务综合实战」)从头到尾做一遍。
  2. 写技术博客总结每个模块。
  3. 持续刷题 + 复习面试冲刺模块
  4. 真正的能力来源于解决问题,多参与开源、多做项目。