暑期实习-拼多多 AI后端开发一面
面试题目
- 实习与项目经历拷打
- 论文介绍:解决的问题与创新点
- 挑选一个JAVA项目进行详细讲解
- 数据库设计:关注表设计方案
- 中间件:Canal如何确保消息被安全消费
- 缓存:三级缓存存放内容是否一致
- 分布式:为什么分布式锁能避免回源风暴
- 秒杀系统:库存扣减时机?订单未支付导致库存无效占用的解决方案
- Java基础:new String对象创建了几个对象
- 多线程:线程池核心参数及任务提交流程
- 数据库:MySQL事务特性及其底层实现
- JVM:类加载过程及双亲委派机制的作用
- Spring:Bean的生命周期(单例/多例)、循环依赖问题及解决方案
- 手撕算法:带环链表反转,需分别反转环内与环外部分
参考解析
- Canal消息消费: Canal通过ACK机制确保消费。消费端在处理完消息后发送ACK给Canal Server,若处理失败或未收到ACK,Canal会进行重发,需结合业务实现幂等性。
- 分布式锁避免回源: 在缓存失效时,分布式锁保证只有一个请求能查询数据库回写缓存,其余请求阻塞等待或直接返回旧数据,防止高并发请求击穿数据库。
- 库存扣减与无效占用: 可采用预扣减库存(Redis预减),设置订单过期时间,过期后通过定时任务或延迟队列回补Redis库存,防止恶意占用。
- new String: 若字符串常量池中无该字符串,创建2个对象(堆中对象+常量池对象);若已有,创建1个对象。
- Spring循环依赖: Spring通过三级缓存(singletonObjects, earlySingletonObjects, singletonFactories)解决Setter注入产生的循环依赖,通过提前暴露Bean工厂实现对象引用注入。