字节跳动后端AI开发日常实习二面面经
《面试题目》
1、实习拷打 2、项目拷打 (1)稍微详细介绍一下你的项目。 (2)听起来是一个仿小红书的网站。你觉得里面主要的难点是哪里? (3)具体怎么做的呢? (4)一个是点赞数到达1000,另一个是时间限制1秒,对吧?这样设计的点赞QPS上限是多少? (5)如果面向用户量很大的APP,除了高并发写,还有其他问题,比如热点数据。如果有一条笔记爆火了怎么办? (6)如果热点流量打破了Redis单节点的上限,怎么处理 (7)服务器转发一般有什么转发算法? (8)Redis和Caffeine两级缓存的数据一致性怎么保证? (9)你设计了点赞、评论等服务,是自己去搭的平台,没有真实用户吧? (10)AI大模型发展很快,有用AI去生成代码吗? 3、八股文 (1)二维数组按行遍历和按列遍历性能上有什么差异? (2)CPU缓存是怎么设计的?有几层缓存? (3)有一棵二叉查找树,找第K小的元素怎么找? (4)中序遍历查找的时间复杂度是多少?有更快的算法吗? (5)Java的内存是怎么进行管理的? (6)用Java时,有没有遇到过OOM(OutOfMemoryError)问题?应该怎么定位? 4、手撕:从尾节点开始,K个一组反转链表
《参考解析》
1. 热点Key处理与Redis单点瓶颈: 处理方法包括:使用本地缓存(如Caffeine)拦截流量、Key的热点备份(将热点Key在多个Redis实例中加后缀备份)、或使用Redis集群并调整分片策略。核心思路是减少对单一物理节点的访问压力。
2. Redis与Caffeine一致性: 采用“先更新数据库,再删除缓存”的策略。若需强一致性,可结合分布式锁或Canal监听Binlog异步更新。Caffeine更新通常通过MQ发布消息,各节点监听到消息后清理本地缓存。
3. 二维数组遍历与CPU缓存: CPU访问内存遵循“空间局部性”原则,按行遍历时,内存访问是连续的,能有效利用CPU Cache Line(高速缓存行)。按列遍历会导致频繁的缓存未命中(Cache Miss),大幅降低性能。
4. BST找第K小元素: 常规做法是中序遍历,时间复杂度O(N)。优化做法:在节点中记录当前子树的节点个数(Size),利用二叉查找树的性质,通过比较Size快速判断第K小元素是在左子树还是右子树,时间复杂度可降至O(logN)。
5. Java OOM定位: 主要通过Heap Dump文件分析。使用MAT(Memory Analyzer Tool)或VisualVM查看内存占用最高的实例和引用链,寻找内存泄漏点或配置不当的大对象。