趁周末,我来汇总一下这周遇到粉丝朋友们的一些面试题,来供大家参考。
基本上面试是围绕以下这几点问的:
- 项目(重要)
- 多线程
- 消息队列
- mysql
- redis
- jvm
- netty
- rpc
项目
项目有多重要就不说了,几乎必问。
问的一些点就是:
- 介绍下项目架构
- 介绍下项目中的一些实现选项,为什么要选择这样的实现方式
- 介绍下项目中比较难或者复杂的实现
- 说下项目里遇到的难点
- 是否有从0到1自己实现项目架构的经历
这里主要是为了考察你是否真正的做过这个项目,项目是否有难度,是否有自己的思考。
所以面试第一步,你应该把你手头的项目过一遍,按照我上面的问题,自己组织下语言,先自己说一遍,或者写下来反复打磨。
项目的重要性,值得你这样做 。
多线程
主要考察你是否实际用过多线程。
主要提问的就是锁、线程池。
有 3-4 家都问到了 AQS,包括 AQS 是如何设计的,原理是什么,加锁解锁的流程等等。
有 5 家都问到了线程池的原理,包括问你在项目中如何用到线程池的,如何配置参数的,等等。
所以 AQS 和线程池需要重点去准备下。
有一家问到了我 CAS 的实现原理,我当时回答硬件指令上把比较和替换弄成了一条指令使得可以原子性执行,所以是硬件层面支持的。
然后他问我硬件是如何实现的,我当时就纳闷了,我说 cmpxchg ?
他说我指的是如何实现的,我一时半会不知道该怎么答。
事后我找了下,他想要的答案是:
- 通过锁总线,其他 CPU 就无法操作共享变量
- 通过缓存锁定,就是利用MESI,使得其他 CPU 内共享变量的缓存失效。
消息队列
我列举下这次面试问到的关于消息队列的面试题:
- 消息队列主要的作用是什么?
- RocketMQ 的延时消息是如何实现的?
- 说下 RocketMQ 源码组成模块(我简历里写了熟悉 RocketMQ 源码)
- 说下 RocketMQ 的底层存储?
- Kafka 的时间轮有了解过吗?
- Kafka 和 RocketMQ 哪个吞吐高?
- 如何提高 Kafka 的吞吐?
- kafka 都通过什么吞吐才这么高的?
- 分布式事务消息了解过吗?
- Kafka 可能丢消息吗?
基本上就这么几种,可能也因为我每次回答都会扯到源码,所以面试官问的不太多。
而以上这么些个问题的答案, 我都我写的那个 pdf 中,没有的也写了 。
我不吹牛,吃下这个 pdf ,面试过程中消息队列这一趴基本上 稳如老狗 。
mysql
这个基本上让你介绍下 mysql 的几个 log,比如 redo、undolog、binlog、relaylog 的作用。
然后说下 mvcc 的原理。
几个隔离级别。
索引的结构,覆盖索引等。
还有 sql 的调优经验。
不过可能会有一些刁钻的:比如 mysql 5.7 相比于 5.6 新增了哪些功能,这种比较少见,而且严格来说不能作为面试能力的判断依据,只能算是加分项,所以遇到一个,网上再查一个吧。
还记得两个面试题,比较少见,分享下:
- 如何记录所有sql的执行
- 一条update语句,数据库5000w数据,可能要执行很久,请问如何知道执行到哪了?
答案我贴文末 ,你可以先思考下。
redis
会让介绍下 redis 的几个数据结构,包括底层的结构:raw、压缩链表之内的,不会很深,但是会看你知道不知道。
会问你项目里如何用 redis 的,主要用来干嘛,用过哪些数据结构。
会问你项目用到的是 redis 集群还是什么,知道哨兵吗。
redis 主从同步的原理。
说下 redis 源码结构(这个是因为我简历里写看过 redis 源码,一般不会问)。
redis 的 reactor 模型。
redis 4.0 新增了哪些新特性(这个答个 lazy free,lfu 淘汰策略差不多了)
总而言之,redis 的种种问题,你只要看黄健宏老师的《redis设计与实现》这本书就差不多了。
如果你想更深的多了解一下,可以看下我这篇文章:
分享下我是如何深入学习 Redis 的
jvm
- 说下知道的 GC 算法
- 说下 JMM
- 说下 GC 调优的思路
其他的我记不太得,不会很多,反正会问一个题目左右:
netty
我一直以为 netty 没人问的,没想到还挺多的。
会拐着弯问,比如问我 Dubbo 底层是如何实现通信的,实则就是让我说下 Netty。
然后会问 Netty IO 模型是怎样的,接着顺带问到 BIO、NIO、AIO 。
还问了 NIO 一定比 BIO 好吗,之类的问题。
吃下后,几乎随便问,其实一般面试官对 Netty 也不会了解得太深,除非你面的是做 IM 或者 IOT 相关的等会自己做网络通信的公司。
rpc
这个可能由于我答的过于完整,每次面试官问了一题之后就不问的。
起手式都是让我说下常见的几个 RPC 框架,然后问我懂里面的实现原理吗,然后我就一顿输出,然后就换下一个方向了......
而原理,其实我写过一篇文章:
RPC 核心,万变不离其宗
吃下去,面试直接冲。
总结
因为我也好久没面试了,所以这次整理面试题很有新鲜感。
而且我还发现一个情况,如果面试官问你一个点,如果你答的很全,这点他就不问了(我以为他会想想一些生僻的压压我),直接换到下一个方向了,直到他轮完我上面列的几点,面试就结束了。
说明面试射程也就上面这几点。
其实我遇到的面试题不止我上面说的那些,但是核心点都在我列出来的文章中,包括面试仓库,所以你看完基本上差不多了。
只有当你充分理解一个知识点之后,才不怕随便面试官从多个来角度,所以我没有单纯的列出我遇到的面试原题,因为意义不大。
每个人遇到的面试官不同,即使是面同一家公司,你也不能保证遇到的是同个面试官对吧?
只要掌握原理,才能不动如山 。
还有一些场景题,不过我遇到的场景都是基于我的项目的,不独立,所以不太好说。
不过有一题可以分享下,我觉得这题有点奇怪:
算法那边需要你提供一个接口来拉取计算数据,数据很大共15g,算法就通过这一个接口,得到完整的 15g 数据,要 json 格式。你的服务内存就 2g,请问怎么做?
我说:获取数据,拼接 json 输入到文件中,然后返回算法那边文件的 url。
面试官说:不行,算法那边很懒,要直接拿数据。
我说:分页给他数据呗。
面试官说:不行,他就要拿完整的。
我说:我们自己分页,批量获取,然后通过 http 分块流式给他。
面试官:不对。
我:麻了。
所以面试官的答案是什么?你们可以思考下,我到时候朋友圈公布下答案,看看各位怎么看。
最后,上面 mysql 的两道题的答案:
- general log
- 降低数据库隔离级别,然后查询
ok,我这周的面试总结就到这了