系统设计类场景题
概述
系统设计类场景题是最常见的面试题型,考察对常见互联网产品功能的理解和实现能力。这类题目不仅要求掌握技术栈,更要理解业务逻辑、用户需求和系统架构。
核心知识点
业务建模
- 需求分析
- 数据建模
- 接口设计
- 状态机设计
技术架构
- 缓存策略
- 数据库设计
- API设计
- 异步处理
性能优化
- 读写分离
- 缓存优化
- 批量操作
- 异步解耦
题目列表
⭐ 如何设计点赞系统 ✅
难度: 中级
标签: 缓存、数据库、一致性
考察点: 缓存设计、防重复点赞、数据一致性
点赞是社交产品最基础的互动功能,看似简单,实则涉及高并发、数据一致性、缓存策略等多个技术点。从1000 QPS优化到100,000 QPS的完整方案,包含Go和Java实现。
核心难点:
- 如何防止重复点赞?
- 如何快速统计点赞数?
- 如何保证Redis和MySQL数据一致性?
- 如何优化高并发场景的性能?
技术栈: Redis、MySQL、消息队列
⭐ 如何设计Feed流系统 🆕
难度: 高级
标签: 推拉结合、时间线、社交产品
考察点: 推模式vs拉模式、Feed流生成、大V处理
Feed流是社交产品的核心功能,需要解决推模式和拉模式的权衡,处理大V用户的百万粉丝推送,保证Feed流的实时性和一致性。
核心难点:
- 推模式、拉模式、推拉结合如何选择?
- 如何处理大V用户(百万粉丝)的Feed推送?
- 如何实现Feed流的实时更新?
- 微博、Twitter、Instagram的架构差异?
技术栈: Redis、MySQL、Kafka、推拉结合架构
⭐ 如何设计评论系统
难度: 中级
标签: 树形结构、分页、排序
考察点: 多级评论存储、热评排序、敏感词过滤
评论系统需要支持多级评论、热评排序、敏感词过滤等功能,是典型的树形数据存储和查询场景。
核心难点:
- 多级评论如何存储和查询?
- 热评如何排序?
- 分页加载如何优化性能?
- 如何过滤敏感词?
技术栈: MySQL、Redis、DFA算法
⭐ 如何设计关注/粉丝系统
难度: 中级
标签: 社交关系、Feed流推送
考察点: 关注模型、互粉检测、Feed推送
关注系统是社交产品的基础,需要处理关注/取关、互粉检测、Feed流推送等核心功能。
核心难点:
- 关注关系如何存储和查询?
- 如何快速检测互相关注?
- 关注数和粉丝数如何统计?
- Feed流如何推送?
技术栈: MySQL、Redis Set、消息队列
如何设计推荐系统
难度: 高级
标签: 算法、大数据、实时计算
考察点: 召回策略、排序算法、冷启动
推荐系统是互联网产品的核心竞争力,涉及算法、大数据、实时计算等多个领域。
核心难点:
- 如何召回候选商品?
- 如何排序和重排?
- 如何解决冷启动问题?
- 如何实现实时推荐?
技术栈: 协同过滤、内容推荐、Spark、Flink
⭐ 如何设计短链系统
难度: 中级
标签: ID生成、重定向、统计分析
考察点: ID生成算法、302重定向、点击统计
短链系统需要生成唯一的短链接,支持重定向和点击统计,是常见的系统设计题。
核心难点:
- 如何生成唯一的短链ID?
- 301还是302重定向?
- 如何统计点击数据?
- 如何保证高可用?
技术栈: Base62编码、Redis、MySQL
学习路径
初学者(P5-P6)
推荐顺序:
- 点赞系统 → 理解缓存和数据库配合
- 短链系统 → 学习ID生成和重定向
- 评论系统 → 掌握树形数据存储
进阶者(P6-P7)
推荐顺序:
- 用户关系系统 → 理解社交图谱
- 推荐系统 → 学习召回和排序
- 完整的博客系统
高级工程师(P7-P8)
推荐顺序:
- 大规模推荐系统
- 复杂的Feed流系统
- 实时聊天系统
设计方法论
需求分析(STAR法则)
- Situation: 理解业务场景和用户需求
- Task: 明确要实现的功能
- Action: 设计技术方案
- Result: 评估效果和优化
架构设计(4+1视图)
- 逻辑视图: 系统的模块划分
- 开发视图: 代码组织结构
- 过程视图: 系统运行流程
- 物理视图: 系统部署架构
- 场景视图: 典型使用场景
数据库设计原则
- 范式化: 减少数据冗余
- 反范式化: 提升查询性能
- 合理索引: 加速查询
- 分库分表: 应对大数据量
缓存设计原则
- Cache-Aside: 旁路缓存(最常用)
- Read-Through: 读穿透
- Write-Through: 写穿透
- Write-Behind: 写后
技术要点总结
常见技术方案
| 场景 | 推荐方案 | 替代方案 |
|---|---|---|
| 防重复操作 | Redis Set | MySQL唯一索引 |
| 计数统计 | Redis计数器 | MySQL聚合查询 |
| 排行榜 | Redis ZSet | MySQL排序 |
| 关注关系 | Redis Set | MySQL双向表 |
| Feed流 | 推拉结合 | 纯推或纯拉 |
性能优化技巧
- 读多写少: 使用缓存
- 写多读少: 异步写入
- 大数据量: 分库分表
- 复杂查询: 搜索引擎(ES)
相关技术栈
面试技巧
回答框架
需求澄清(2分钟)
- 明确功能范围
- 确认数据规模
- 了解性能要求
接口设计(3分钟)
- 设计核心API
- 定义请求响应格式
- 考虑扩展性
数据库设计(5分钟)
- 设计表结构
- 定义索引
- 考虑分库分表
架构设计(10分钟)
- 画出系统架构图
- 说明核心流程
- 解释技术选型
优化讨论(5分钟)
- 性能优化
- 可靠性保证
- 扩展性考虑
常见追问
- 如果数据量增长10倍怎么办?
- 如何保证数据一致性?
- 如何优化查询性能?
- 如何防止缓存击穿/穿透/雪崩?
实战建议
- 动手实现: 选择1-2个系统实际搭建
- 阅读源码: 学习开源项目的实现
- 总结模板: 形成自己的设计模板
- 持续优化: 不断迭代优化方案
提示:系统设计题没有标准答案,重在展现你的思考过程和权衡能力。要能说清楚为什么这样设计,有哪些优缺点,适用什么场景。
