Skip to content

系统设计类场景题

概述

系统设计类场景题是最常见的面试题型,考察对常见互联网产品功能的理解和实现能力。这类题目不仅要求掌握技术栈,更要理解业务逻辑、用户需求和系统架构。

核心知识点

业务建模

  • 需求分析
  • 数据建模
  • 接口设计
  • 状态机设计

技术架构

  • 缓存策略
  • 数据库设计
  • 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)

推荐顺序

  1. 点赞系统 → 理解缓存和数据库配合
  2. 短链系统 → 学习ID生成和重定向
  3. 评论系统 → 掌握树形数据存储

进阶者(P6-P7)

推荐顺序

  1. 用户关系系统 → 理解社交图谱
  2. 推荐系统 → 学习召回和排序
  3. 完整的博客系统

高级工程师(P7-P8)

推荐顺序

  1. 大规模推荐系统
  2. 复杂的Feed流系统
  3. 实时聊天系统

设计方法论

需求分析(STAR法则)

  1. Situation: 理解业务场景和用户需求
  2. Task: 明确要实现的功能
  3. Action: 设计技术方案
  4. Result: 评估效果和优化

架构设计(4+1视图)

  1. 逻辑视图: 系统的模块划分
  2. 开发视图: 代码组织结构
  3. 过程视图: 系统运行流程
  4. 物理视图: 系统部署架构
  5. 场景视图: 典型使用场景

数据库设计原则

  1. 范式化: 减少数据冗余
  2. 反范式化: 提升查询性能
  3. 合理索引: 加速查询
  4. 分库分表: 应对大数据量

缓存设计原则

  1. Cache-Aside: 旁路缓存(最常用)
  2. Read-Through: 读穿透
  3. Write-Through: 写穿透
  4. Write-Behind: 写后

技术要点总结

常见技术方案

场景推荐方案替代方案
防重复操作Redis SetMySQL唯一索引
计数统计Redis计数器MySQL聚合查询
排行榜Redis ZSetMySQL排序
关注关系Redis SetMySQL双向表
Feed流推拉结合纯推或纯拉

性能优化技巧

  1. 读多写少: 使用缓存
  2. 写多读少: 异步写入
  3. 大数据量: 分库分表
  4. 复杂查询: 搜索引擎(ES)

相关技术栈

面试技巧

回答框架

  1. 需求澄清(2分钟)

    • 明确功能范围
    • 确认数据规模
    • 了解性能要求
  2. 接口设计(3分钟)

    • 设计核心API
    • 定义请求响应格式
    • 考虑扩展性
  3. 数据库设计(5分钟)

    • 设计表结构
    • 定义索引
    • 考虑分库分表
  4. 架构设计(10分钟)

    • 画出系统架构图
    • 说明核心流程
    • 解释技术选型
  5. 优化讨论(5分钟)

    • 性能优化
    • 可靠性保证
    • 扩展性考虑

常见追问

  1. 如果数据量增长10倍怎么办?
  2. 如何保证数据一致性?
  3. 如何优化查询性能?
  4. 如何防止缓存击穿/穿透/雪崩?

实战建议

  1. 动手实现: 选择1-2个系统实际搭建
  2. 阅读源码: 学习开源项目的实现
  3. 总结模板: 形成自己的设计模板
  4. 持续优化: 不断迭代优化方案

提示:系统设计题没有标准答案,重在展现你的思考过程和权衡能力。要能说清楚为什么这样设计,有哪些优缺点,适用什么场景。

正在精进