阿里后端开发面经03
- 时间
- 2025-11
- 来源
- 牛客网
《面试题目》
- 用户提交订单后,数据库应维护怎样的订单表?关键字段有哪些?
- 大量用户同时提交订单时,如何保证处理效率?
- 商家也需要查询订单时,如何设计路由表或分片算法?
- 支付请求因网络波动未收到结果时,如何避免用户重复支付?
- 什么是幂等?如何实现消费场景的幂等?
- 互斥锁、自旋锁、乐观锁和悲观锁分别是什么?它们有什么关系?
- MySQL 为什么使用 B+ 树?什么是事务、ACID 和隔离级别?
- MySQL 如何实现不同的事务隔离级别?
- 高并发场景下,MySQL 插入数据可能出现哪些问题?
- Redis 如何删除大量过期数据?
- HTTPS 为什么安全?
- HTTPS 握手完成后为什么使用对称加密传输数据?
- 如何启动三个线程并按顺序打印
ABCABCABCABC?
《参考解析》
1. 订单表设计:核心字段包括订单号、用户与商家标识、商品快照、金额、状态、支付流水号、创建与更新时间以及版本号。订单号应全局唯一,常用查询建立组合索引;分片键要同时考虑用户查单、商家查单和数据倾斜。
2. 支付幂等:客户端生成或服务端下发唯一请求号,支付接口用唯一约束或幂等记录保证同一请求只创建一次交易。结果未知时主动查询支付渠道状态,而不是再次扣款;回调处理同样按渠道流水号去重并校验状态机转换。
3. Redis 过期删除:Redis 结合惰性删除和定期抽样删除。大量 key 同时过期可能造成 CPU 抖动,应给过期时间增加随机离散、分批写入与删除,并监控过期扫描耗时和内存水位,避免在业务代码中执行阻塞式全量删除。
4. HTTPS 加密:证书和非对称密码用于验证服务端身份并安全协商会话密钥,后续使用对称加密是因为其吞吐更高、计算开销更低。完整性校验还能防止密文在传输中被篡改。
5. 三线程顺序打印:可以为 A、B、C 各准备一个信号量,初始只放行 A。每个线程打印后释放下一个线程的信号量,C 再释放 A;也可以使用同一把锁、条件变量和共享状态实现相同的有序交接。