面灵AI

字节后端面经:亿级关注系统、外部排序与 Redis 热点

时间
2026-09
来源
牛客网

《面试题目》

抖音电商开发,8 月 26 日

  1. 能否自我介绍,并说明实习中最有代表性的工作与技术难点?
  2. 亿级数据的关注系统怎样设计存储、分库分表和访问性能?
  3. Agent 框架与 RPC 框架分别解决什么问题?

后端开发,8 月 25 日,第一场

  1. 实习中承担了哪些工作?
  2. Go 的 slice、channel、map 分别怎样使用,map 是否线程安全?
  3. 怎样求二叉树中的第二大节点?

后端开发,8 月 25 日,第二场

  1. HTTP 与 WebSocket 有什么区别?
  2. 传输层有哪些协议,各有什么特点?
  3. 一次 HTTP 请求的完整过程是什么?
  4. TCP 怎样实现流量控制和拥塞控制?
  5. 带输出语句的可执行文件,从加载到执行经历哪些步骤?
  6. MySQL 数据碎片化是什么,怎样处理,底层存储怎样组织?
  7. MySQL 有哪些锁,行锁与表锁怎样协调?
  8. Redis 集群中的热点数据导致负载不均时怎样处理?
  9. 只有 4 GB 内存,怎样对 1 TB 数据排序?
  10. 如何设计令牌桶限流器?
  11. 怎样求二维矩阵中的最大正方形面积?

后端开发,8 月 21 日,第一场

  1. 项目用了 MVC 的哪些部分和 Spring Cloud 的哪些组件?
  2. 项目背景、核心流程和实际使用场景是什么?
  3. MySQL 索引为什么常使用 B+ 树而非 B 树?
  4. Redis Key 应该怎样设计,Redis 速度快的原因是什么?
  5. 消息队列解决什么问题?
  6. Elasticsearch 的基本原理与适用场景是什么?
  7. 二叉树的层序遍历怎样实现?

后端开发,8 月 21 日,第二场

  1. 客户端执行 Redis HGETALL 是本地操作还是网络请求,怎样评估 Hash 字段数量?
  2. 为什么不宜直接对大 Hash 执行 HGETALL?
  3. Lua 脚本除了原子执行,还有哪些收益,耗时脚本有什么风险?
  4. Redis 分布式锁怎样设计,发生故障切换时怎样考虑安全性?
  5. MySQL 覆盖索引怎样减少回表?
  6. Undo Log、Redo Log、Binlog 与 Relay Log 分别做什么,Redo Log 怎样支持崩溃恢复?
  7. 慢 SQL 怎样排查与优化,哪些场景会使预期索引无法有效使用?
  8. 联合索引遇到范围查询后,后续字段一定完全失去作用吗?

《参考解析》

关注关系至少有两个查询方向

按用户查询“我关注了谁”和“谁关注了我”,访问方向不同。设计时先估算关系总量、读写比例及大用户的倾斜,再选择正向关系存储和反向查询索引。只按发起者分片容易查关注列表,但不能直接解决超大粉丝列表的分页与热点。

关系写入需要唯一约束或幂等标识,关注数可以异步聚合,但要说明延迟。分页尽量使用稳定游标;热点列表可以缓存近期页,不能假设亿级关系都能放进单个缓存键。

外部排序把磁盘当作中间结果空间

每次读取内存能容纳的一块数据,排序后写成有序文件,重复到全部输入处理完。随后对这些有序文件做多路归并,每路维护读缓冲,使用小顶堆挑出下一个输出值。不能把 4 GB 全用于数据块,还要留出运行时、归并堆和输入输出缓冲。

有序文件太多时分多轮归并,归并路数受到内存与文件句柄上限限制。主要成本通常是磁盘读写,面试时还可以说明临时空间、失败恢复与重复值处理。

热点键不能只靠增加分片解决

同一个键仍然落在同一个分片上。只读热点可以考虑客户端本地缓存或在允许旧数据的范围内分发读负载;计数类热点可以拆成多个计数桶再汇总。拆分前要说明一致性要求,不能把本来必须原子完成的操作随意分散。

HGETALL 会读取整个 Hash,网络传输、结果分配和服务端执行都随字段数量增长。确实需要遍历时可以分批扫描,但扫描并不提供稳定快照,业务要接受并发修改下的相应语义。

锁的过期时间不是业务完成证明

基础方案使用带过期时间的条件写入,锁值保存本次持有者的唯一标识,释放时原子比较标识再删除。业务执行超过租期后,另一个持有者可能已经开始工作,因此受保护的资源仍需要版本检查等约束。

Redis 主从复制是异步的,尚未复制的锁在主节点故障后可能丢失,不能把主从切换直接等同于互斥安全。参见 Redis 分布式锁文档

范围条件之后的索引列仍可能有用途

要区分缩小扫描区间、在索引层过滤、以及覆盖查询。某个范围条件限制了后续列继续构造扫描边界,并不代表后续列完全无用。例如符合条件时,索引条件下推可以先在索引记录上检查部分条件,再决定是否读取完整行。应结合具体 SQL 与执行计划判断。参见 MySQL 索引条件下推文档

算法题先确认输入定义

第二大节点要确认是普通二叉树还是搜索树,以及重复值是否算两个名次。普通树可遍历并维护最大的两个候选;搜索树可以借助逆中序遍历。最大正方形则要先确认题目是否指全为 1 的二值矩阵;若是,当前位置的边长由左、上、左上三个位置的最小值加一得到,答案取最大边长的平方。