前言
首先准备面试:JAVA基础,JVM,JUC,多线程,MQ,redis,Mysql和项目
将自己的项目写成文档,将各个功能的具体实现写出来,反复推敲,有没有需要改进的地方,首先要把自己的项目讲清楚, 不要觉得自己实现的,自己就可以表达的很清楚,一定要写出来,我的项目实现写了三页A4纸
开始面试:
一轮面试:将自己的项目,巴拉巴拉说了40分钟
然后问问题,threadlocal实现原理
b树,b+树,聚簇索引,非聚簇索引,普通索引和唯一索引的区别
线程池核心参数,线程池具体场景实现,线程池的核心参数作用
MQ的数据一致性如何实现
秒杀活动如何实现
秒杀活动的产品是否可以退换,如何实现
集合随便问了问
然后问了同步锁和lock锁
商品秒杀实现过程:可以将数据库中所有的SKU缓存到redis中,进行下单的时候,检查redis中是否存在,如果存在并有库存,满足购买条件,则下单,进行支付,当支付的请求进入服务器的时候,首先检查redis中的SKU商品,如果被其他人抢走了,则支付失败;如果剩余的满足订单条件,获取分布式锁,加入消费消息到数据库中,并将消息发送给rabbitMQ-broker,扣除redis库存,支付成功,释放分布式锁,通过中间件更新mysql中的数据,如果服务器崩溃,可以通过数据库消费消息刷新库存和redis缓存
二轮面试:
你最擅长什么技术?我说mysql学的比较好,自己做了一些总结,就单纯从慢日志讲讲自己的看法
第一步:根据慢日志定位慢查询SQL
1.首先检查SQL中是否使用函数,隐式类型转换(字符串转数字),隐式函数或者传入的值超过索引长度
2.SQL中字段的字符集是否一致
3.如果使用count计数,尽量使用count(*)或者count(1),count(字段)会涉及到回表操作,count(id)会全表扫描,并且count(字段)和count(id)都需要判空操作,也可以按照具体的业务选择MyISAM引擎,直接取值
4.查看当前语句的状态,是否是在等MDL锁,数据页flush,其他线程占用了行锁
5.如果是热点数据,需要控制访问资源的并发事务量,可以将一行数据改成逻辑上的多行数据
第二步:使用explain等工具分析 SQL
查看SQL是否按照理想的状态检索最少的数据行,如果没有则查看是否走了指定索引
判断优化器是否选错索引,可以通过强行选择索引或者重新统计索引信息
第三步:修改SQL或者尽量让SQL走索引
A.在数据库空闲的时候,定期进行索引统计,防止优化器选错索引,造成索引失效
B.优化手段:聚簇索引,覆盖索引,索引下推优化,联合索引
C.字符串索引:前缀索引,倒序存储,hash索引
D.如果需要业务字段做索引,必须确保是唯一索引,符合K-V结构,不需要考虑其他索引叶子节点的大小
E.尽量使用自增主键索引,每次插入新的数据都是追加操作,可以防止数据页黑洞出现,保证索引的紧凑,不涉及挪动其他数据,也不会触动叶子节点的页分裂
F.主键索引的长度不可以过长,造成其他索引树的叶子节点较大
G.在建立联合索引的时候,如果可以通过顺序少建立一个索引,则调整顺序,同时需要考虑空间占用
H.数据写多读少的时候选择普通索引,利用change buffer可以提高效率,合理设置change buffer大小,防止频繁merge
I.如果sql语句出现锁操作,尽量让锁操作最后执行,防止影响其他SQL的执行
J.如果使用长连接,在进行较大查询之后,需要重置链接,防止占用较大内存,造成数据库异常重启
K.不要删除索引,删除索引可能会造成页分裂,导致数据页出现黑洞
L.使用order by查询的时候,如果单行数据过大,会造成回表操作,可以使用联合索引,让字段本身有序
三面:
redis为何高可用?
接口如何优化?SDS的特性
OCP是什么,怎么实现
设计模式会不会?我答得是不会,目前不在学习范围
表单重复提交的问题?在提交的时候使用redis发放令牌验证
四面
是HR面,谈了薪资
面试资料总结
下面先给大家上一个总的目录大纲,基础的东西就不进行过多的赘述,我们将会从面试必问的说起,同时由于每篇的内容过多,我们也只说重点,太过基础的内容谁都会,我就不多敲字浪费大家的时间了!
有需要的朋友点击这里自取就好了,希望资料对你有帮助!
SpringCloud
Redis
JVM
MySQL
Zookeeper
Kafka
Dubbo
spring
Rabbitmq
springboot
最后
由于文章篇幅有限,PDF的内容又很多,全部手敲下来很累…所以需要阅读阅读学习的,大家“一件三连后:“查看下方””即可拿到手之后自己学习吧,博主真的打字打累了。
有需要的朋友点击这里自取就好了,希望资料对你有帮助!
预祝大家前程似锦,工作顺利!