程序员奶牛-大厂面试合集

最近更新:2026-08-20

根据得物社区工程、小红书数据库中间件、原力灵机等面试问题合并整理 同义问题已合并;能体现考察深度的连续追问予以保留。本文只包含问题,不包含参考答案。

一、自我介绍与求职意向#

  1. 请在 5 分钟内做一个简单的自我介绍。
  2. 请选择一个最能展现个人特点的项目,并重点介绍其中的亮点、挑战和有意思的设计。
  3. 你可以实习多久?是否能够连续实习 5~6 个月?
  4. 你未来主要想做传统后端、数据库中间件,还是 Agent 应用开发?为什么?

二、短视频 Feed 流项目#

1. 项目架构与数据模型#

  1. 请介绍短视频 Feed 流系统的整体架构、核心链路和你负责的部分。
  2. Feed 流项目中最主要的技术挑战是什么?你做了哪些有价值的取舍或优化?
  3. Feed 流的核心数据模型是怎样的?哪些数据最终持久化到 MySQL?
  4. 用户关注关系和粉丝关系表是如何设计的?
  5. Feed 流中的 MySQL 索引是如何设计的?为什么这样设计?
  6. 项目中的业务数据量有多大?MySQL、Redis 分别保存了多少数据?

2. 查询与分页#

  1. Feed 为什么采用游标分页?游标分页的原理是什么?
  2. 游标分页为什么能够缓解深分页问题?它与 LIMIT offset 相比有什么区别?
  3. ID-Detail 分离解决了什么问题?读取一页 Feed 时,ID 与详情是如何查询和组装的?

3. 推拉结合与大 V 分发#

  1. 普通作者和大 V 分别采用什么分发模式?各自的读写成本是什么?
  2. 大 V 拥有百万级粉丝时,发布内容产生的写扩散问题如何处理?
  3. 推拉模式的切换阈值为什么设置为一万粉丝?为什么不是更多或更少?
  4. 既然读扩散会增加读取成本,为什么大 V 反而适合使用拉模式?
  5. 推拉结合相对于纯推或纯拉,主要优化了哪一部分性能?又引入了哪些复杂度?
  6. 为什么不能对所有作者统一采用拉模式?
  7. 如果一个用户关注的全部都是大 V,他的请求是否会退化成纯拉模式?这种最坏读路径如何处理?

4. 压测与容量评估#

  1. 做 Feed 压测时,整套服务、MySQL、Redis 和消息队列的测试环境是如何搭建的?
  2. 压测使用了怎样的数据规模、请求比例和并发模型?
  3. 如何根据 QPS、P95/P99、错误率、数据库连接数和 Redis 延迟判断系统瓶颈?

三、多级缓存与 Redis 故障治理#

1. 本地缓存、Redis 与 MySQL#

  1. 本地缓存、Redis、MySQL 的三级数据访问链路分别承担什么职责?
  2. 什么数据适合放在本地缓存?什么数据不适合本地化,更适合放在 Redis 或权威存储?
  3. 用户或作者的基本信息为什么适合放在本地缓存?
  4. 本地缓存的生命周期如何管理?采用 TTL、容量淘汰还是主动失效?
  5. 本地缓存的过期时间一般设置多久?
  6. 为什么选择 15 分钟,而不是更短或更长?
  7. TTL 低于 15 分钟为什么可能影响性能或用户体验?本地缓存未命中后不是还可以访问 Redis 吗?

2. MySQL 与 Redis 一致性#

  1. MySQL 与 Redis 之间的数据一致性如何保证?
  2. 如果采用定期检查或对账,具体检查什么、如何发现差异、如何修复?
  3. MySQL 数据同步或回灌到 Redis 需要时间,数据量很大时如何避免一次性重建带来的冲击?

3. Redis 故障追问链#

  1. Redis 整体不可用时,系统如何处理?
  2. Redis 挂掉后,C 端流量直接回源 MySQL,数据库能否承受?
  3. Redis 集群部分节点或一半节点故障时,会对 MySQL 造成怎样的冲击?
  4. 为了保护 MySQL,应限制哪一层、哪一类请求的流量?
  5. Redis 故障时,系统是直接拒绝访问、返回降级数据,还是允许部分请求回源?
  6. 用户侧会看到报错、旧数据还是简化结果?如何确定降级优先级?
  7. Redis 节点故障并发生数据丢失时,缓存如何恢复和重建?
  8. 恢复期间如何避免大量请求与全量回灌同时压垮 MySQL?

四、Go 并发、内存与 GC#

1. Goroutine 与 GMP#

  1. Go 的 goroutine 与操作系统线程是怎样对应的?
  2. 与 Python 的并发方式相比,goroutine 有哪些优势和缺点?
  3. 为什么 goroutine 通常比线程轻量?它是否在所有场景下都更快?
  4. Java 的协程或虚拟线程与 Go goroutine 有什么差别?协程一定比线程快吗?
  5. 请介绍 GMP 调度模型中 G、M、P 的职责及调度流程。
  6. Goroutine 发生阻塞系统调用时,G、M、P 分别会发生什么变化?
  7. 多个 P 都有本地运行队列时,调度器如何进行任务分配和负载均衡?
  8. 什么场景下增加线程或 goroutine 能提升性能?什么场景下不能?
  9. 高并发是否一定能够提效?goroutine 是否创建得越多越好?

2. Channel 与同步原语#

  1. Channel 的底层结构和工作原理是什么?
  2. 无缓冲 channel 和有缓冲 channel 有什么区别?分别适合什么场景?
  3. 使用 channel 时有哪些需要注意的点?
  4. 你了解 sync.WaitGroup 吗?它有哪些主要方法,使用时有哪些风险?
  5. Mutex 与 RWMutex 有什么区别?什么场景下优先选择 RWMutex?
  6. 什么是自旋锁?它与互斥锁有什么区别,分别适合什么场景?

3. Map 与并发安全#

  1. 使用 Go 原生 map 时有哪些需要注意的地方?
  2. Go 原生 map 是并发安全的吗?多个 goroutine 并发读写会发生什么?
  3. Map 并发读写不安全的底层原因是什么?
  4. 如何解决 map 的并发安全问题?
  5. sync.Map 适合什么场景?它的实现原理是什么?
  6. 传统 sync.Map 中的只读区 read 和脏区 dirty 如何协作并保证数据可见性?

4. 内存管理与 GC#

  1. Go 的内存是如何管理的?对象如何分配和回收?
  2. 常见的垃圾回收算法有哪些?它们分别适合什么场景?
  3. Go 的垃圾回收是否只有三色标记?完整 GC 流程还包括哪些阶段?
  4. 请详细介绍三色标记法的工作过程。

五、MySQL、索引与分库分表#

1. SQL 执行链路#

  1. 一条 INSERT 或 UPDATE SQL 发送到 MySQL 后,服务器内部会经历哪些环节?
  2. SQL 执行过程中,连接层、解析器、优化器、执行器、InnoDB、Buffer Pool、redo log、undo log 和 binlog 分别起什么作用?

2. InnoDB 与 B+ 树索引#

  1. MySQL 索引有哪些分类?
  2. InnoDB 索引是如何实现的?
  3. B+ 树的数据结构是什么样的?InnoDB 为什么选择 B+ 树?
  4. B+ 树索引有哪些优势?
  5. 哪些情况会导致 B+ 树索引的查询性能变差?
  6. 索引字段被高并发更新时,会对 B+ 树和写入性能产生什么影响?

3. 索引设计与优化#

  1. 创建索引应遵循哪些原则?什么场景需要创建索引?
  2. 结合 Feed 流项目,哪些字段适合建立索引?哪些字段不适合?
  3. 什么是二级索引和回表?
  4. 什么是覆盖索引?如何通过覆盖索引减少回表?
  5. 什么是联合索引的最左前缀原则?
  6. 多列联合索引应该如何确定字段与顺序?
  7. 哪些写法或场景会造成索引失效?

4. 慢 SQL 排查#

  1. 一条 SQL 查询很慢,你的完整排查思路是什么?
  2. 如果 SQL 扫描行数很多、查询范围很大,可以从哪些方面改造?

5. 分库分表与中间件#

  1. 项目中是否使用过分库分表?你如何理解分库、分表的适用场景和代价?
  2. 一个已经上线且持续有业务流量的单库单表系统要进行拆分,需要考虑哪些问题?完整迁移流程如何设计?
  3. 你了解哪些分库分表开源组件或数据库中间件?

6. Go 数据库连接池#

  1. Go 连接 MySQL 使用了什么驱动、ORM 或组件?
  2. 数据库连接池存在的意义是什么?
  3. ORM 或数据库连接池有哪些关键配置参数?这些参数应该如何设置?

六、Redis 数据结构、Rehash 与集群#

1. 基础数据结构#

  1. Redis 支持哪些主要数据结构?
  2. 这些数据类型的底层编码分别是什么?
  3. Redis Set 通常使用什么底层结构?
  4. Redis ZSet 为什么能够排序?它的底层结构是怎样的?

2. 缓存异常#

  1. 什么是缓存穿透、缓存击穿和缓存雪崩?三者有什么区别?

3. Redis Hash 渐进式 Rehash#

  1. Redis Hash 的底层结构和扩容机制是什么?
  2. Redis 为什么采用渐进式 rehash,而不是一次性迁移全部数据?
  3. Rehash 期间的数据具体如何迁移?查询、写入和删除如何处理两张表?
  4. Redis 是按每秒固定数量迁移,还是由其他机制推进迁移?
  5. 如果没有客户端请求、程序处于空闲状态,rehash 还会继续吗?

4. Redis 集群与扩容#

  1. Redis 有哪些集群或高可用模式?分别适合什么场景?
  2. Redis Cluster 如何实现数据分片?
  3. 集群增加分片或节点时,会发生什么?数据如何迁移?
  4. 假设集群从 8 个分片扩到 9 个分片,原来的哈希映射是否会失效?如何完成重新分片?
  5. Redis 集群会发生数据倾斜吗?常见原因是什么,如何解决?

七、RabbitMQ 与消息可靠性#

  1. RabbitMQ 如何保证消息从生产者、Broker 到消费者的完整链路不丢失?
  2. 生产者确认、消息持久化、镜像或仲裁队列、消费者 ACK、重试与死信队列分别解决什么问题?

八、RAG、检索与排序#

1. 文档处理与召回#

  1. RAG 的文档分块策略是如何定义的?分块大小和重叠窗口如何选择?
  2. 为什么同时选择 Milvus 和 Elasticsearch?两者分别承担什么职责?
  3. Milvus 语义召回与 Elasticsearch 关键词召回后,如何进行排序融合?
  4. 你了解 Elasticsearch 的倒排索引吗?它是如何构建和查询的?

2. 检索路由#

  1. 当一个 Query 进入系统时,如何判断应该走 Elasticsearch 关键词检索、向量检索、RAG 还是 SQL Agent?
  2. 检索路由由规则、分类模型还是大语言模型完成?为什么?
  3. 如果大模型对检索意图发生误判,系统如何发现、兜底和纠正?

九、Agent、MCP 与 AI Coding#

1. Agent 框架与范式#

  1. 你了解哪些 Agent 常见范式,例如 ReAct?它们有什么区别和适用场景?
  2. 你对 LangChain 和 LangGraph 了解多少?实际使用过哪些能力?
  3. 你是否了解或使用过 OpenCloud 这类 Agent 调度工具?
  4. RAG 应该如何与 Agent 结合?
  5. Agent 遇到公开网络中不存在的私有或内网文档时,如何安全获取这部分知识?

2. MCP#

  1. 你了解 MCP 协议吗?它解决了什么问题?
  2. MCP 中的 Server(或 Service)、Resource 和 Prompt 分别是什么?它们有什么区别?

3. SQL Agent#

  1. 请介绍 SQL Agent 从接收用户问题到返回结果的完整执行链路。
  2. SQL Agent 如何理解自然语言、获取数据库 Schema、生成 SQL、校验权限、执行查询并处理结果?
  3. SQL Agent 如何限制写权限并防止危险 SQL?

4. 对话记忆与任务编排#

  1. 多轮对话中的记忆压缩有哪些常见方法?
  2. 短期记忆和长期记忆分别如何设计?
  3. 长期记忆存放在 MySQL 时,表结构如何设计?
  4. 一个长任务或复杂任务执行时,如果上下文过长或模型注意力被分散,应如何拆解和编排任务?
  5. 如何编排 AI 编程工具,使不同阶段共享必要上下文,又避免上下文持续膨胀?

5. AI Coding 与 Skills#

  1. 你了解哪些 Web Coding 或 AI Coding Skills?实际使用过哪些?
  2. 如何根据项目需求设计或选择适合自己的 Skill?
  3. 如何保证 AI 生成代码的质量和正确性?
  4. 你会如何使用代码审查、静态检查、单元测试、集成测试和多模型复核来校验生成结果?

十、现场编码#

  1. 请现场完成一道算法或编码题,并说明思路、复杂度、边界条件和测试用例。

十一、面试收尾与反问#

  1. 部门的核心业务、当前技术架构和主要挑战是什么?
  2. 这个岗位希望候选人重点掌握哪些能力?
  3. 结合我的 Feed、RAG 和 Agent 项目,您对后续学习方向有什么建议?
  4. 团队在 Agent 开发、AI Coding 和 Skills 方面有哪些实践或建议?
  5. 本轮面试结果大概什么时候出来?后续流程是什么?