Skip to content

面试速答(先看这里)

**一句话结论:**23年毕业,项目是电商运营平台,主要技术mysql,mq,redis,负责过账单模块,

60秒标准回答:

23年毕业,项目是电商运营平台,主要技术mysql,mq,redis,负责过账单模块

拉取订单数据,怎么保证订单不重复?insert or update ?

insert or update 的 SQL 怎么写的? insert into on duplicate key update 的限制是什么?有影响吗?会有额外的加锁吗?

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**拉取订单数据,怎么保证订单不重复?
  • **要点2:**MQ 使用场景?
  • **要点3:**Rabbitmq 和 KAFKA 区别?
  • **要点4:**Rabbitmq和KAFKA区别?
  • **要点5:**分布式锁加锁失败后等待其实是阻塞锁的实现,一般redis实现的都是非阻塞锁。

**记忆锚点:**insert → update → double → 死信队列 → Completablefuture → bigdecimal

关键取舍:

  • insert into on duplicate key update 的限制是什么?
  • 性能提升的原因是什么?

易错提醒:

  • 这里是候选人的项目对MQ做了个自发自收,实现一个异步的场景,但是聊下来其实自发自收消息的必要性并没有特别大,完全可以用线程池来做异步,所以项目中的一些方案,需要了解前因后果,要知道为啥一定要这个方案,或者知道这个方案还有什么不足以及替代方案。
  • 分布式锁加锁失败后等待其实是阻塞锁的实现,一般redis实现的都是非阻塞锁。

加分表达:

  • MQ 使用场景?
  • 线程池的核心参数,拒绝策略有哪些,如何选择?
  • 因为他的项目中提到了做了订单拉取,所以问了下如何防止重复,本质上还是一个幂等问题。

追问准备:

  • 23年毕业,项目是电商运营平台,主要技术mysql,mq,redis,负责过账单模块, 拉取订单数据,怎么保证订单不重复?
  • insert or update ? insert or update 的 SQL 怎么写的?
  • insert into on duplicate key update 的限制是什么?
  • 会有额外的加锁吗?

面试者背景 ​

23年毕业,项目是电商运营平台,主要技术mysql,mq,redis,负责过账单模块,

面试过程 ​

> 拉取订单数据,怎么保证订单不重复?insert or update ? > > insert or update的SQL怎么写的?insert into on duplicate key update 的限制是什么?有影响吗?会有额外的加锁吗? > > 每天的订单量有多少? > > 项目的难点是什么?订单匹配,正则匹配。正则表达式判断字符串是不是邮箱怎么写? > > MQ使用场景?异步导出,发MQ的应用和接MQ是同一个应用吗?不用MQ不行吗?线程池不行吗? > > Rabbitmq的整体架构介绍一下。Exchange起到的作用是什么?转发路由。 > > RabbitMQ消息的一次生成&消费的流程是怎么样的? > > 死信队列用过吗?死信队列的消息需要走exchange吗?死信队列可以做什么?延迟消息。 > > Rabbitmq和KAFKA区别?kafka一定不丢消息吗?rabbitmq能保证不丢吗? > > 线程池用过吗?线程池都有哪些类型?线程池的核心参数,拒绝策略有哪些,如何选择? > > 线程池核心和最大线程数如何设定的?向线程池提交一个任务的处理流程是怎么样的? > > Java中线程有几个状态?waiting和timed wating区别。什么时候会进入timed waiting > > 线程的start方法和run方法区别是什么? > > 如何在主线程中等子线程执行完?wait? > > Completablefuture什么地方用到了?性能提升的原因是什么?编排。 > > Completablefuture实现原理?ForkJoinPool是啥? > > AOP切面实现多数据源切换介绍一下? > > 金额的存储是怎么存的,decimal多少位?如何判断两个BigDecimal是否相等,为啥不用equals方法? > > Bigdecimal如何做四舍五入?bigdecimal传给前端出现科学计数法怎么回事?bigdecimal转字符串?toString?为啥不用double和float?为啥他们会丢失精度?用double存整数有问题吗? > > 为啥有了基本类型还需要包装类?double Double > > 缓存的穿透、击穿和雪崩?bloom过滤器。 > > 分布式锁加锁失败后怎么做的等待?

题目解析 ​

> 拉取订单数据,怎么保证订单不重复?insert or update ? > > insert or update的SQL怎么写的?insert into on duplicate key update 的限制是什么?有影响吗?会有额外的加锁吗?

因为他的项目中提到了做了订单拉取,所以问了下如何防止重复,本质上还是一个幂等问题。

涉及到insert or update的操作,就深入问一下具体用法和实现

📄 ✅如何解决接口幂等的问题?

打开文档:✅如何解决接口幂等的问题?

📄 ✅SQL语句如何实现insertOrUpdate的功能?

打开文档:✅SQL语句如何实现insertOrUpdate的功能?

> 项目的难点是什么?订单匹配,正则匹配。正则表达式判断字符串是不是邮箱怎么写?

提到自己项目中写了很多正则表达式,那就随便问一个正则的问题。

邮箱正则验证:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+. [a-zA-Z]{2,}$

> MQ使用场景?异步导出,发MQ的应用和接MQ是同一个应用吗?不用MQ不行吗?线程池不行吗?

这里是候选人的项目对MQ做了个自发自收,实现一个异步的场景,但是聊下来其实自发自收消息的必要性并没有特别大,完全可以用线程池来做异步,所以项目中的一些方案,需要了解前因后果,要知道为啥一定要这个方案,或者知道这个方案还有什么不足以及替代方案。

> Rabbitmq的整体架构介绍一下。Exchange起到的作用是什么?转发路由。 > > RabbitMQ消息的一次生成&消费的流程是怎么样的? > > 死信队列用过吗?死信队列的消息需要走exchange吗?死信队列可以做什么?延迟消息。 > > Rabbitmq和KAFKA区别?kafka一定不丢消息吗?rabbitmq能保证不丢吗?

📄 ✅rabbitMQ的整体架构是怎么样的?

打开文档:✅rabbitMQ的整体架构是怎么样的?

📄 ✅RabbitMQ是怎么做消息分发的?

打开文档:✅RabbitMQ是怎么做消息分发的?

📄 ✅什么是RabbitMQ的死信队列?

打开文档:✅什么是RabbitMQ的死信队列?

📄 ✅RabbitMQ如何保证消息不丢

打开文档:✅RabbitMQ如何保证消息不丢

> 线程池用过吗?线程池都有哪些类型?线程池的核心参数,拒绝策略有哪些,如何选择? > > 线程池核心和最大线程数如何设定的?向线程池提交一个任务的处理流程是怎么样的?

📄 ✅线程池的拒绝策略有哪些?

打开文档:✅线程池的拒绝策略有哪些?

📄 ✅什么是线程池,如何实现的?

打开文档:✅什么是线程池,如何实现的?

> Java中线程有几个状态?waiting和timed wating区别。什么时候会进入timed waiting > > 线程的start方法和run方法区别是什么? > > 如何在主线程中等子线程执行完?wait?

📄 ✅线程有几种状态,状态之间的流转是怎样的?

打开文档:✅线程有几种状态,状态之间的流转是怎样的?

📄 ✅run/start、wait/sleep、notify/notifyAll区别?

打开文档:✅run/start、wait/sleep、notify/notifyAll区别?

> Completablefuture什么地方用到了?性能提升的原因是什么?编排。 > > Completablefuture实现原理?ForkJoinPool是啥?

📄 ✅CompletableFuture的底层是如何实现的?

打开文档:✅CompletableFuture的底层是如何实现的?

📄 ✅ForkJoinPool和ThreadPoolExecutor区别是什么?

打开文档:✅ForkJoinPool和ThreadPoolExecutor区别是什么?

> AOP切面实现多数据源切换介绍一下?

📄 ✅介绍一下Spring的AOP

打开文档:✅介绍一下Spring的AOP

> 金额的存储是怎么存的,decimal多少位?如何判断两个BigDecimal是否相等,为啥不用equals方法? > > Bigdecimal如何做四舍五入?bigdecimal传给前端出现科学计数法怎么回事?bigdecimal转字符串?toString?为啥不用double和float?为啥他们会丢失精度?用double存整数有问题吗? > > 为啥有了基本类型还需要包装类?double Double

📄 ✅为什么不能用浮点数表示金额?

打开文档:✅为什么不能用浮点数表示金额?

📄 ✅为什么不能用BigDecimal的equals方法做等值比较?

打开文档:✅为什么不能用BigDecimal的equals方法做等值比较?

📄 ✅Java中有了基本类型为什么还需要包装类?

打开文档:✅Java中有了基本类型为什么还需要包装类?

> 缓存的穿透、击穿和雪崩?bloom过滤器。 > > 分布式锁加锁失败后怎么做的等待?

📄 ✅什么是缓存击穿、缓存穿透、缓存雪崩?

打开文档:✅什么是缓存击穿、缓存穿透、缓存雪崩?

📄 ✅什么是布隆过滤器,实现原理是什么?

打开文档:✅什么是布隆过滤器,实现原理是什么?

分布式锁加锁失败后等待其实是阻塞锁的实现,一般redis实现的都是非阻塞锁。zookeeper更适合实现阻塞锁。

📄 ✅如何用Zookeeper实现分布式锁?

打开文档:✅如何用Zookeeper实现分布式锁?