腾讯AI后台开发一面面经
面试题目
一、项目经历与秒杀系统
- 实习经历拷打及成果介绍。
- 防超卖和一人一单的实现原理?Redis存储数据结构及Lua脚本使用细节?
- 为什么一人一单使用Set存储用户ID?
- 秒杀系统前端到后端的流量过滤机制(重点考察前端层面)。
- 逻辑过期如何解决缓存击穿?与缓存雪崩的区别?
- 数据一致性保证:更新数据库后删缓存的方案及潜在问题,直接更新缓存的代价为何过大?
- 限流实现:滑动窗口的底层数据结构实现。
二、Redis与MySQL 8. Redis数据结构与数据类型汇总。 9. MySQL索引类型、聚簇索引与非聚簇索引的区别。 10. MySQL索引底层数据结构及B+树特性。 11. 秒杀系统中哪些场景可以/已经使用了索引优化?
三、AI与RAG项目 12. RAG项目架构介绍及查询重写实现细节。 13. Embedding模型选型及对其他模型的了解。 14. RAG检索优化后的准确率提升量化分析。
四、Java基础与算法 15. Java垃圾回收机制(GC)。 16. HashMap底层原理及扩容机制。 17. OpenCL底层原理。 18. 算法题:数组中第K个最大元素。
参考解析
- 秒杀系统高并发:防超卖通常通过Redis Lua脚本保证原子性(DECR操作)。Set存储用户ID是因为Set具有唯一性,可直接判断用户是否已下单(SISMEMBER)。前端限流包括限流器、随机时间延迟、隐藏入口等。
- 缓存击穿与雪崩:击穿是指热点Key过期瞬间被大量并发请求击穿数据库,逻辑过期通过设置一个不过期的Key并异步重构解决。雪崩指大规模缓存同时失效,建议增加随机过期时间及降级熔断策略。
- 数据一致性:更新DB后删缓存可能存在短暂不一致,但比“更新缓存”方案并发冲突小。直接更新缓存若高频写操作会导致大量的无效计算。
- MySQL索引:B+树叶子节点存放数据,非叶子节点存放索引,支持范围查找且高度低,减少磁盘I/O。秒杀涉及到的关键字段(如活动ID、库存ID)必须加索引。
- HashMap实现:Java 8中为数组+链表/红黑树。扩容时通过容量翻倍(2的幂次)并重映射节点,避免大规模重哈希,提高效率。