面灵AI

久远银海 Java 开发:线下笔试 + 面试真题

时间
2026-09
来源
牛客网

《面试题目》

线下笔试 + 面试。笔试卷是选择题加大题,没有手撕,大题四道 SQL、两道 Java 编程(文件输入输出流、递归)。随后是技术面:

  1. 讲讲项目中你担任的角色,开发过程中遇到的所有难点,以及你是如何解决的?
  2. 讲讲你是如何设计你的高并发秒杀机制的?
  3. 如果某个用户抢购成功,但是他要退款,你如何设计这段业务?
  4. 为什么要使用 Lua 脚本来实现库存扣减?
  5. 我看你写了压测数据,你是怎么得到优化前后的数据的?(450ms、68ms 两个数据怎么来的)
  6. 你简历上写了一个异步批量持久化数据,是怎么实现的?这个用来解决什么问题的?
  7. 讲讲你是如何优化你的数据库的?
  8. 我看你写了动态 SQL,MyBatis 中 ${}#{} 的区别是什么?
  9. 你有没有考虑过系统数据过多进行分库分表?
  10. 你为哪些字段设置了联合索引,依据是什么?

《参考解析》

${}#{}

#{} 走预编译占位符,参数作为绑定值传给数据库,天然防注入;${} 是字符串拼接,直接把内容塞进 SQL,只适合表名、列名、排序字段这类无法参数化的位置,而且必须由服务端白名单校验后再拼,不能接用户输入。

联合索引的依据

先看查询模式:WHERE 里高频出现、区分度高、且能覆盖排序的列排在前面。等值条件的列靠左,范围条件的列靠后——范围之后的列用不上索引定位。索引不是越多越好,每个索引都要付出写入放大和存储成本,建之前先确认它真能被某条线上 SQL 命中,上线后用执行计划的 key_len 验证。

退款业务建模

秒杀订单的退款不能简单把库存加回去。要区分「未支付超时关闭」和「已支付退款」两条路径:前者释放预占库存,后者走逆向单,库存回补与支付退款都要幂等。退款本身是一条独立状态机,用业务单号唯一约束防止重复退款,库存回补用带版本的原子自增并留流水,便于对账。

要不要分库分表

先判断是真瓶颈还是可优化项:加索引、改写 SQL、加缓存、归档冷数据、读写分离,这些的成本远低于分片。只有当单表数据量、写入 QPS 或单机容量确实到顶,且业务能接受分片键带来的跨片查询与事务限制时才做。分片键要选查询必带、分布均匀的维度,否则会把问题从「慢」变成「查不出来」。

压测数据要能讲清来源

面试官问的其实是数据是怎么测出来的:用什么工具、多少并发、压了多久、预热没有、机器什么配置、瓶颈落在哪一层。优化前后的对比必须固定其他变量,只改一处。答不上来源的优化数字,比不写还减分。