虾皮SSC后端一面面经

虾皮 (Shopee) · 后端开发 · 一面 · 2026-03

面试题目

一、项目深挖

  1. 项目介绍:详细讲解第一个项目及其技术实现。
  2. RocketMQ:在项目中的具体应用,前端如何获取异步消息,WebSocket长连接原理,以及轮询的优缺点。
  3. 系统优化:RocketMQ的弊端与优化方案,其他异步实现方式及MQ选型对比。
  4. 分布式事务:分布式事务问题的解决方案。
  5. 存储设计:MySQL和Redis在项目中的数据存放及其作用。
  6. 数据库并发:乐观锁的具体应用背景与实现方式。

二、数据库与并发基础 7. MySQL死锁:死锁发生的场景及间隙锁的底层机制。 8. 索引优化:联合索引的最左前缀法则,AB联合索引中A和B的命中情况及其原理,索引选用B+树的原因。 9. Java并发:volatile关键字的可见性、有序性原理,如何禁止指令重排,以及是否能解决伪共享问题。

三、算法题 10. 题目:给定一个完全无序数组,求中位数(类似LC215数组中第k个最大元素)。 11. 延伸:快排的思想及实现。


参考解析

  1. RocketMQ异步与选型:RocketMQ具备高吞吐、高可用特性;前端获取消息通常用WebSocket长连接减少轮询带来的无效开销;异步方案还有Kafka、RabbitMQ或本地消息表。选型需根据吞吐量、顺序消息需求及社区活跃度决定。

  2. MySQL间隙锁与死锁:间隙锁(Gap Lock)用于锁定索引记录之间的间隙,防止幻读。当两个事务分别持有对方请求的锁时(如互斥的X锁)会产生死锁,死锁检测通常由数据库引擎自动完成并回滚代价小的事务。

  3. volatile可见性与有序性:通过内存屏障(Memory Barrier)实现。可见性通过MESI协议缓存一致性机制强制刷新缓存;有序性通过禁止指令重排(LoadStore屏障等)保证单例或状态标记的逻辑正确。volatile不能解决伪共享,伪共享需使用@Contended注解。

  4. B+树索引:B+树非叶子节点不存数据,使得树的高度更低,减少磁盘I/O次数;叶子节点间通过双向链表连接,非常适合范围查询和全表扫描,满足数据库的高性能查找需求。

  5. 寻找中位数/第K大元素:最优解为快速选择算法(Quick Select),基于快排的思想,平均时间复杂度为O(N)。先随机选基准值,将数组分为两部分,根据基准位置与K的关系决定向左或向右递归查找。