Bigo后端开发一面面经
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- TCP 与 UDP 有什么区别,TIME_WAIT 为什么要等待 2MSL?
- HTTP/1.0、HTTP/1.1、HTTP/2 和 HTTP/3 有什么区别?
- 进程、线程和协程有什么区别?虚拟地址如何映射到物理地址?
- MySQL 为什么使用 B+ 树,什么是回表、索引下推和最左匹配?
- 可重复读隔离级别下还会出现幻读吗,间隙锁如何解决?
- Redis 跳表的结构和时间复杂度是什么?
- 线程池提交任务后的执行流程是什么?volatile 为什么不能保证线程安全?
- RAG 如何解决单片段召回造成的上下文缺失?
- 为什么 PDF 要分片存入 Redis,如何检测分片缺失?
- 慢 SQL 如何定位和优化?
- 如何反转链表?
《参考解析》
- TCP 面向连接且可靠,UDP 无连接但开销低。主动关闭方进入 TIME_WAIT,等待 2MSL 是为了让旧报文消散并确保对端收到最后确认。
- HTTP/1.1 支持持久连接,HTTP/2 通过二进制分帧和多路复用提升并发,HTTP/3 基于 QUIC/UDP,减少连接建立和 TCP 队头阻塞。
- 进程拥有独立地址空间,线程共享进程资源,协程由用户态调度;虚拟地址通过页表映射到物理页,TLB 缓存常用转换。
- B+ 树层数低且叶子节点有序,适合磁盘范围查询;回表是先查二级索引再回主键索引取完整行,覆盖索引可避免回表。
- 快照读通常不会出现幻读,但当前读在范围未加锁时仍可能出现;间隙锁锁住索引区间,阻止并发插入。
- 跳表由多层有序链表组成,平均查找、插入和删除为 O(log n),实现简单且适合范围遍历。
- 线程池先创建核心线程,再入队,队列满后创建非核心线程,仍满则执行拒绝策略;volatile 保证可见性和有序性,但复合操作仍非原子。
- 召回后按文档相邻关系向上、向下扩展窗口,并对多个相关窗口去重合并;综合问题可结合摘要和多路召回。
- Redis 单值过大影响网络和阻塞,分片可控制单次读写大小;保存总片数和校验信息,读取时检查序号连续性与校验和。
- 用慢查询日志和 EXPLAIN 定位扫描行数、索引和排序问题,再通过索引、改写 SQL、减少返回列和分页优化;上线前用真实数据压测。
- 迭代或递归维护前驱、当前和后继指针,逐个反转 next,最后返回新的头节点。