java面试场景问题
- 创业
- 2025-08-30 08:00:01

还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论
1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token)思路:前端生成 一个唯一的 requestId(如 UUID或者能表示本次请求的唯一标识字段),每次提交请求时带上它。 后端使用 Redis存储 requestId,如果已经存在,则拒绝处理。 实现:前端:每次提交请求时,生成一个 requestId:
javascript
const requestId = crypto.randomUUID(); // 生成唯一 ID axios.post('/api/submit', { data, requestId });后端java
@Autowired private StringRedisTemplate redisTemplate; public ResponseEntity<String> submitRequest(String requestId, Data data) { Boolean isDuplicate = redisTemplate.opsForValue().setIfAbsent("request:" + requestId, "1", 10, TimeUnit.MINUTES); if (Boolean.FALSE.equals(isDuplicate)) { return ResponseEntity.status(HttpStatus.CONFLICT).body("重复提交"); } try { // 处理业务逻辑 process(data); return ResponseEntity.ok("提交成功"); } finally { redisTemplate.delete("request:" + requestId); // 可选:若确保幂等性,可不删除 } }优点: ✅ 适用于分布式系统 ✅ 性能好(基于 Redis 操作) ✅ Token 过期时间 防止长期占用
方法 2:数据库唯一索引思路:让数据库的唯一索引防止重复提交,常用于订单号、业务唯一键。 实现 数据库表添加唯一索引:
sql
ALTER TABLE orders ADD UNIQUE (order_no);后端插入数据:
try { orderMapper.insert(order); } catch (DuplicateKeyException e) { return ResponseEntity.status(HttpStatus.CONFLICT).body("重复提交"); }优点: ✅ 数据库级防重,最可靠 ✅ 适合订单、支付等业务场景 ⛔ 性能受限于数据库,高并发需优化
方法 3:前端按钮防抖思路:提交后禁用按钮,直到返回响应,防止用户快速点击。 实现
document.getElementById("submit-btn").addEventListener("click", function() { this.disabled = true; // 禁用按钮 axios.post('/api/submit', { data }) .then(response => alert(response.data)) .finally(() => this.disabled = false); // 请求完成后恢复 });优点: ✅ 简单易行,无需改后端 ⛔ 前端可绕过,不适用于高安全性场景
方法 4:悲观锁(数据库行锁)思路:通过 SELECT … FOR UPDATE 加行锁,确保事务内数据不会被其他请求修改。 实现
@Transactional public void submitOrder(Long orderId) { Order order = orderMapper.selectByIdForUpdate(orderId); // 加锁 if (order.getStatus() != OrderStatus.PENDING) { throw new IllegalStateException("订单已处理"); } order.setStatus(OrderStatus.PROCESSED); orderMapper.updateById(order); }优点: ✅ 确保单线程执行,避免重复 ⛔ 数据库性能受影响,不适用于高并发
总结
)
推荐方案: 高并发系统:幂等 Token + Redis ✅ 数据库事务业务:唯一索引 / 状态机 ✅ 简单防重:前端按钮防抖 ✅ 如果并发压力大,可以结合多种方案,例如: Redis 幂等 Token + 数据库唯一索引 🚀 前端防抖 + 后端幂等 Token 🔥
2.redis的哨兵模式是如何选举的3.线程池的原理 4.spring的spi和dubbo的spi机制是什么? 5.流量激增,大批量数据如何处理? 6.rocketma如何防止重复消费,高并发情况下 7.如何防止重复消费? 8.用过那些监控ivm的工具? 9.用过的设计模式有哪些?怎么用的? 10.xxl-job如果任务处理不完了怎么办? 11.spring事务失效情况,传播机制,如何保证事务不失效。 12.dubbo和openfeiqn的区别? 13.nacos支持负载均衡吗,策略是什么? 14.了解过逃逸分析吗? 15.hashmap底层结构,什么时间会形成链表,idk1.8前后有啥区别 16.jvm内存结构,新生代的垃圾回收算法,老年代的垃圾回收算法 17.如何创建线程,start方法可不可以调两次,一个线程如何唤起另一个线程。 18.syncornized和Lock有什么区别 19.volatile关键字的实现原理 20.线程池的基本原理,具体参数是什么 21.redis线程模型,redis的主从、哨兵、集群模式区别 22.消息堆积如何处理,消息重复消费如何避免 23.使用过的设计模式 24.mysql的索引原理 25.sql优化方法 26.springcloud用过哪些组件
java面试场景问题由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“java面试场景问题”