近期两场小厂后端Java面经
《面试题目》
奇妙思维后端一面
- 自我介绍
- 通过Redis加Lua实现高并发库存扣减,为什么选Lua?对比Java加锁如何?
- 如何用Caffeine及Redis构建二级缓存?
- 分片上传和断点续传的设计实现?
- 抽奖场景(扣除宝石->抽奖->打包入库)存在的问题?
- 有无使用AI Coding/全栈经验?
- 生成前端的全流程?
- Claude模型版本选择及看法?
- 对Codex的评价?
- 各种AI编程模型的编码能力对比?
- 使用AI Coding的完整流程?(追问:拿到大需求如何用AI解决)
嘉为科技Java后端一面
- 自我介绍
- Redis是单线程吗?多线程优点及为何快?
- 项目中Redis的具体应用?
- 项目中分片上传和断点续传的实现?
- 缓存击穿的解决方案?
- 项目中最难的问题?
- 对转全栈或测试的想法?
- 定位慢SQL的方法及优化手段?
- 平时使用的LLM?
- AI是否会取代程序员?
《参考解析》
- Redis+Lua扣减库存:Lua脚本保证了操作的原子性,避免了网络开销和应用锁(如synchronized/ReentrantLock)在集群环境下失效的问题,性能更高。
- 二级缓存(Caffeine+Redis):Caffeine做本地缓存(一级),Redis做分布式缓存(二级)。查询时先查本地,未命中查Redis,再未命中查DB,最后回填。
- 抽奖场景一致性:核心是分布式事务问题。建议使用消息队列异步处理扣减与发货,或引入TCC/本地消息表确保数据最终一致,防止超卖或漏发。
- 缓存击穿:是指热点Key失效导致大量请求直达数据库。解决方案:加互斥锁(如Redis分布式锁),或设置逻辑过期时间,由异步线程更新缓存。
- 定位慢SQL:查看慢查询日志(slow_query_log),使用Explain分析执行计划(重点关注type、key、rows),优化索引结构或改写复杂SQL。