面试者背景

:::warning 27届,双一流本科,数藏项目,交易链路开发,秒杀,Java,

介绍下项目,秒杀下单,订单防重提交、订单超时关单。

订单的超时关单怎么实现的?主动关单**&被动关单。Xxl-job,关单扫表扫描条件?30分钟是代码中配置的?如果改成15分钟,怎么不改代码?SQL有用到索引吗?状态+时间,为什么这么设计?状态区分度不高为什么还建索引?除了XXL-JOB****还有其他 方案吗?MQ延时消息。**

SQL****扫表关单,有做分页吗?没做,那会不会把内存干爆呢?为啥不做分页。如果要做怎么做?

XXL-JOB****扫表有缺点吗?被动关单,同步的还是异步的?怎么实现的异步的?虚拟线程,

介绍下什么是虚拟线程?守护线程,你这里用守护线程没问题吗?

主动关单和被动关单,如果并发了,怎么办?状态机控制、乐观锁版本号,介绍下用乐观锁实现版本号的原理,CAS。关单的幂等怎么做?订单操作流水。主动**&**被动用的幂等号是同一个吗?用的订单号。Xxl-job如何确保只有一台实例可以执行任务,DB锁。Select for update,这个方案好吗。

**Select for update ****是乐观锁还是悲观锁,锁的是什么?锁的是哪个索引。**name <-> age

你的关单任务是单机的还是分布式。单机任务,什么时候会做优化?

秒杀的下单和非秒杀下单的难点是什么?数据库热点行更新,超卖问题。什么是超卖?

数据库热点行更新存在啥问题?锁等待、死锁检测、数据库链接被占用。耗CPU

**怎么做的防超卖?redis预扣减、lua脚本做库存判断。****Sql **做库存检测。

为啥要在redis搞个库存?流量过滤做限流不行吗?不关心顺序呢?如果做限流器可以用什么方案?限流算法了解么?漏桶**&令牌桶,滑动窗口?短信验证码5****分钟内只能发一次。**

**Redis中什么时候做的初始化?手动set???**上架、

如果redis库存扣成功了,数据库扣失败了怎么办?一直重试**+人工对账。没办法保证一致性,少卖怎么办?秒杀方案中的MQ的作用是什么?削峰填谷。减少瞬时流程。订单的创建延迟问题怎么处理?怎么提高MQ消费速率,批量消费。MQ异步创单成功之后怎么通知前端,前端通过预生成的订单号轮询,前端一直轮训吗?大量的轮询任务+秒杀用户数多,对数据库造成很大压力?只能靠数据库抗。MQ用的RocketMQ****,RocketMQ如何保证的消息的可靠性的?怎么保证消息不丢。**

项目中用过线程池吗?用的哪个线程池,有哪些核心参数?核心线程数、最大线程数、工作队列、时间、拒绝策略。拒绝策略都有哪些?队列可以用哪些队列。ArrayBlockingQueueLinkedBlockingQueue有啥区别?线程池和虚拟线程之间有必要配合使用么?

介绍下AQS?队列为啥用双向链表、

G1CMS区别,ZGC知道么。介绍下垃圾清理的过程。GCRoot ,三色标记法、初始标记、并发标记、重新标记、垃圾清除。哪个过程是STW的?清理需要STW吗?为啥并发标记可以不需要STW**?**

1TB的搜索日志,查询出搜索量最高的10个关键词


:::

题目解析

:::color4 订单的超时关单怎么实现的?主动关单**&被动关单。Xxl-job,关单扫表扫描条件?30分钟是代码中配置的?如果改成15分钟,怎么不改代码?SQL有用到索引吗?状态+时间,为什么这么设计?状态区分度不高为什么还建索引?除了XXL-JOB****还有其他 方案吗?MQ延时消息。**

SQL****扫表关单,有做分页吗?没做,那会不会把内存干爆呢?为啥不做分页。如果要做怎么做?

XXL-JOB扫表有缺点吗?被动关单,同步的还是异步的?怎么实现的异步的?虚拟线程,

:::

✅基于XXL-JOB的分片实现分库分表后的扫表

✅数据库扫表任务如何避免出现死循环

✅定时任务扫表的缺点有什么?

:::color4 介绍下什么是虚拟线程?守护线程,你这里用守护线程没问题吗?

:::

✅JDK21 中的虚拟线程是怎么回事?

:::color4 主动关单和被动关单,如果并发了,怎么办?状态机控制、乐观锁版本号,介绍下用乐观锁实现版本号的原理,CAS。关单的幂等怎么做?订单操作流水。主动**&**被动用的幂等号是同一个吗?用的订单号。Xxl-job如何确保只有一台实例可以执行任务,DB锁。Select for update,这个方案好吗。

**Select for update ****是乐观锁还是悲观锁,锁的是什么?锁的是哪个索引。**name <-> age

你的关单任务是单机的还是分布式。单机任务,什么时候会做优化?

:::

✅基于状态机+乐观锁解决订单支付和关单的并发问题

✅乐观锁与悲观锁如何实现?

:::color4 秒杀的下单和非秒杀下单的难点是什么?数据库热点行更新,超卖问题。什么是超卖?

数据库热点行更新存在啥问题?锁等待、死锁检测、数据库链接被占用。耗CPU

**怎么做的防超卖?redis预扣减、lua脚本做库存判断。****Sql **做库存检测。

为啥要在redis搞个库存?流量过滤做限流不行吗?不关心顺序呢?如果做限流器可以用什么方案?限流算法了解么?漏桶**&令牌桶,滑动窗口?短信验证码5****分钟内只能发一次。**

**Redis中什么时候做的初始化?手动set???**上架、

如果redis库存扣成功了,数据库扣失败了怎么办?一直重试+人工对账。没办法保证一致性,少卖怎么办?秒杀方案中的MQ的作用是什么?削峰填谷。减少瞬时流程。订单的创建延迟问题怎么处理?怎么提高MQ消费速率,批量消费。MQ异步创单成功之后怎么通知前端,前端通过预生成的订单号轮询,前端一直轮训吗?大量的轮询任务+秒杀用户数多,对数据库造成很大压力?只能靠数据库抗。MQ用的RocketMQ,RocketMQ如何保证的消息的可靠性的?怎么保证消息不丢。

:::

✅让你设计一个秒杀系统,你会考虑哪些问题?

✅库存扣减如何避免超卖和少卖?

✅为什么不用分布式锁来实现秒杀?

✅RocketMQ如何保证消息不丢失?

:::color4 项目中用过线程池吗?用的哪个线程池,有哪些核心参数?核心线程数、最大线程数、工作队列、时间、拒绝策略。拒绝策略都有哪些?队列可以用哪些队列。ArrayBlockingQueue,LinkedBlockingQueue有啥区别?线程池和虚拟线程之间有必要配合使用么?

:::

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

✅线程池有哪些核心参数?

✅为什么虚拟线程不要和线程池一起用?

:::color4 介绍下AQS?队列为啥用双向链表、

:::

✅如何理解AQS?

✅AQS为什么采用双向链表?

:::color4 G1和CMS区别,ZGC知道么。介绍下垃圾清理的过程。GCRoot ,三色标记法、初始标记、并发标记、重新标记、垃圾清除。哪个过程是STW的?清理需要STW吗?为啥并发标记可以不需要STW?

:::

✅G1和CMS有什么区别?

✅介绍下CMS的垃圾回收过程

✅为什么初始标记和重新标记需要STW,而并发标记不需要?

:::color4 从1TB的搜索日志,查询出搜索量最高的10个关键词

:::

✅如何从 1TB 的搜索日志中找出搜索量最高的 10 个关键词?