虾皮SSC后端一面面经
面试题目
一、项目深挖
- 项目介绍:详细讲解第一个项目及其技术实现。
- RocketMQ:在项目中的具体应用,前端如何获取异步消息,WebSocket长连接原理,以及轮询的优缺点。
- 系统优化:RocketMQ的弊端与优化方案,其他异步实现方式及MQ选型对比。
- 分布式事务:分布式事务问题的解决方案。
- 存储设计:MySQL和Redis在项目中的数据存放及其作用。
- 数据库并发:乐观锁的具体应用背景与实现方式。
二、数据库与并发基础 7. MySQL死锁:死锁发生的场景及间隙锁的底层机制。 8. 索引优化:联合索引的最左前缀法则,AB联合索引中A和B的命中情况及其原理,索引选用B+树的原因。 9. Java并发:volatile关键字的可见性、有序性原理,如何禁止指令重排,以及是否能解决伪共享问题。
三、算法题 10. 题目:给定一个完全无序数组,求中位数(类似LC215数组中第k个最大元素)。 11. 延伸:快排的思想及实现。
参考解析
-
RocketMQ异步与选型:RocketMQ具备高吞吐、高可用特性;前端获取消息通常用WebSocket长连接减少轮询带来的无效开销;异步方案还有Kafka、RabbitMQ或本地消息表。选型需根据吞吐量、顺序消息需求及社区活跃度决定。
-
MySQL间隙锁与死锁:间隙锁(Gap Lock)用于锁定索引记录之间的间隙,防止幻读。当两个事务分别持有对方请求的锁时(如互斥的X锁)会产生死锁,死锁检测通常由数据库引擎自动完成并回滚代价小的事务。
-
volatile可见性与有序性:通过内存屏障(Memory Barrier)实现。可见性通过MESI协议缓存一致性机制强制刷新缓存;有序性通过禁止指令重排(LoadStore屏障等)保证单例或状态标记的逻辑正确。volatile不能解决伪共享,伪共享需使用@Contended注解。
-
B+树索引:B+树非叶子节点不存数据,使得树的高度更低,减少磁盘I/O次数;叶子节点间通过双向链表连接,非常适合范围查询和全表扫描,满足数据库的高性能查找需求。
-
寻找中位数/第K大元素:最优解为快速选择算法(Quick Select),基于快排的思想,平均时间复杂度为O(N)。先随机选基准值,将数组分为两部分,根据基准位置与K的关系决定向左或向右递归查找。