总体而言,整个过程更看你回答的条理与深度,不太需要面面俱到,有自己的理解和思考反而会加分,不需要每道题都回答得百分百,有些问题属于面试官顺带提一嘴,但重点问题要答好。
一面
介绍下项目,因为项目涉及到分布式定时任务,问了下如何保证同一时间只有一个任务在跑。
因为里面用到了elasticjob,聊了下分布式定时任务框架。
怎么保证数据库数据不会重复插入?
唯一索引。
mysql和oracle的区别?
主要是上家公司用到了oracle,实际上面试官不太了解oracle,答一些大致的如oracle和mysql性能上的差异、一些sql语法细节的不同。
mysql分页的缺点?
mysql每次都分都是扫描offset+limit条数据,在深分页的情况下性能劣化很快。
如何解决深分页的性能问题?
先查主键,再根据主键查记录。或者利用索引,加个查询条件提高速度,如id>XXX。
给了个模拟场景写sql,问需不需要建索引。
进程和线程的区别?
进程是程序执行的实例,包含了程序代码、数据以及执行状态等信息。线程是进程中的一个执行单元,是CPU调度的基本单位。进程间与线程间通信方式不同、性能开销不同。
只有单核的情况下是不是只用进程就可以,不用线程。
什么是二叉树,二叉树的好处?
每个节点最多只能有两棵子树。快速查找和插入
给了到easy的算法题(寻找二叉树的公共祖先)
二面
答一下java中线程的五个状态?
一开始按操作系统答了,阻塞,就绪,等待,运行,结束。
面试官要求具体到java中的,答了canceling,running,stop,waiting,blocking。
阻塞和等待的区别?
还是按操作系统的线程答了,他说那在java中的等待就是在等cpu时间吗,我才反应过来是问wait方法(加入等待队列等等)。java调用wait的整个过程。
Arraylist<Integer> 和Arraylist<String>调用getclass返回的是同一个对象吗?为什么?
是。因为是泛型,虚拟机编译的时候只记录Arraylist。
了解类型擦除吗?(上一题想要引申的点,面试官主动提了)
什么是类型擦除?
什么时候确定类型的。(编译时编译器自动插入类型转换)
问了下索引失效情况?
其实就是在问联合索引的最左匹配原则。
explain语句,会返回什么,各个字段具体有什么取值。
给了道hard难度,直线上点最多的个数。
细节和边界没考虑好,算是对了思路,面试官不太满意,再给了道智力题(赛道与狗)。
三面
聊了下zookeeper,为什么用zookeeper做分布式协调中心,有对比过其他的吗?
有监视器。zk侧重CAP中的CP。Eureka是ap
zk怎么知道什么时候删除节点?
心跳链接(其实这里应该具体说说的,zk里面配置ticktime)。
心跳链接一断开就会删除节点吗?
是。
面试官给了问题当做提示,如果断开心跳链接后面又连接上怎么办?
立马反应过来答了sessiontime。
hashmap和concorruenthashmap的区别?
为什么hashmap不是线程安全的?
设置一个值的经过。
concurrenthashmap设置一个值的过程(cas与加锁)。
问了下redis的分布式锁,答了setnx,问了缺点,后面又问redlock。
后面又问redis的sortedset是怎么实现了,答了跳表。
跳表和红黑树的区别。
针对红黑树的缺点(范围查找),设计一种红黑树的区间查找算法(人傻了),答了加个双向链表,要求不改数据结构,乱答了。
给了到medium的lc(判断一个图是不是一个树),写得比较好,面试官问了下思路就过了。
总的来说很多知识点需要一个系统的梳理与学习,才能做到在面试的时候,不管面试官怎么问,都能很快地反应过来考验的是哪个知识点。特别是在项目环节,很多面试官会问诸如为什么这么设计、这么设计会有什么问题、假如是在XXX情况下,系统会遇到什么问题如何解决等发散型问题,如果只是浅显理解或者梳理不完全,有时候会反应不过来答不到点上,导致面试扣分。
为了方便日后复习,在这里精心整理了一份服务端的思维导图,既有进阶内容如云原生、分布式基础、计算技术、存储技术、中间件技术的内容,也有基础知识如计算机基础、数据库技术、网络技术。每个大类都有细分,关键知识点会有对应的博客网页,跳转过去即可学习。
关注公众号【不腾】,回复【服务端】即可获取。