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 怎么排查
-XX:+HeapDumpOnOutOfMemoryError自动 dump。- MAT / jvisualvm 打开 hprof。
- 找最大对象 → 看引用链 → 定位泄漏代码。
- 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 | 线程堆栈 |
| jstat | GC 统计 |
| 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 → 找引用链。
恭喜!你已学完整个教程。最后建议:
- 挑一个综合项目(如资料中的「黑马商城」「微服务综合实战」)从头到尾做一遍。
- 写技术博客总结每个模块。
- 持续刷题 + 复习面试冲刺模块。
- 真正的能力来源于解决问题,多参与开源、多做项目。