美团暑期全栈开发面试经
《面试题目》
一、项目与基础考察 Q1-Q4: 自我介绍、Java学习路径与语言基础。 Q5-Q13: 视频处理中的分片存储、跨域问题、断点续传实现、Redis与MySQL一致性、Redis集群故障处理。 Q14-Q15: 分片上传去重机制、Web鉴权与恶意攻击防护。 Q16-Q20: 令牌桶限流算法实现、Key的设计、弹性原理及边界条件测试。 Q21-Q23: RocketMQ消息解耦与顺序性保证、AI转码流程。 Q24-Q33: 秒杀场景下的超卖问题、库存扣减实现、Lua脚本、数据库与缓存一致性方案、Redis主从切换下的库存风险。
二、技术拓展与算法 Q34-Q39: 其他技术栈、AI工具应用、推荐系统Prompt设计。 Q40-Q42: 算法题:合并两个有序数组。 Q43-Q47: 个人情况、实习时间、其他项目经验、龙虾(Llama)应用。 Q48: 反问环节。
《参考解析》
1. Redis与MySQL双写一致性:核心是“先删缓存,再写数据库,再删缓存(延时双删)”。在高并发场景下,可使用订阅Binlog方式(如Canal)进行异步更新,保证最终一致性。
2. 秒杀超卖处理:利用 Redis 的 Lua 脚本实现原子性扣减 DECR,若扣减成功再异步写入 DB。若 DB 写失败,需补偿 Redis 库存(回滚),防止库存丢失。
3. 令牌桶算法弹性:令牌桶允许突发流量,即在令牌桶容量范围内,允许短时间内超过平均速率的流量通过,通过填充速率和容量参数实现流量平滑与突发请求的权衡。
4. RocketMQ顺序消息:对于需要严格顺序的业务,需确保发送到同一个 MessageQueue(通过 Sharding Key),并在消费端使用 MessageListenerOrderly 实现单线程顺序处理。
5. 合并两个有序数组:使用双指针法,从数组末尾开始比较并向前填充,时间复杂度 O(m+n),空间复杂度 O(1)。