面试复盘 | 杭州有赞 Java后端 一二三面

首先夸下有赞的面试效率挺高的,一天就面完了三面,技术面的体验也都挺好,一面着重考察基础,二面考察项目,HR面了接近40min,是面过最久的HR面。。

一面 45min

一面的面试官挺友善的,交流起来没有太大压力。

  1. 自我介绍之后,面试官问了我比较擅长哪方面,答了MySQL和Redis之后,就狂问MySQL

  2. MySQL的B+树结构是什么?聚簇索引和非聚簇索引的区别?

  3. MySQL为什么用b+树实现索引?为什么不用红黑树、跳表、哈希?

    一开始答的比较混乱,后来面试官提示说可以对比红黑树、跳表、哈希来回答。
    首先是在相同的数据量下,红黑树的树高更高,IO次数会变多,而B+树的结构使得3层高度就能存储接近2000w的数据;
    第二是B+树的叶子节点是按照主键顺序存放,同时使用前后指针相连,在范围查询时遍历更加方便,以及可以利用磁盘预读特性将相邻节点读取出来;
    第三是哈希结构只适用于等值查询,无法在范围查询下使用。

  4. MySQL的事务实现

    ACID特性。原子性和隔离性基于undo log,持久性基于redo log。具体展开可以再讲讲redo log的两阶段提交。

  5. MySQL可重复读级别下,什么情况会出现幻读

    其实可重复读无法保证完全的隔离性。如果在事务A中,第一次select使用快照读(使用MVCC),同时另外一个事务B在第一次select的范围内插入了数据,那么如果A在第二次读时使用了当前读(for update/in share mode),此时就会出现幻读问题,因为当前读并不会使用MVCC,而是从数据库读取最新数据。

  6. 如何判断一条SQL是否使用到了索引?

    explain分析执行计划

  7. MySQL场景题:MySQL机器上CPU飙升,怎么解决

    我以为是缓存失效了,面试官说那如果是MySQL出现死锁怎么解决。于是我简单答了下打印出线程执行信息去分析,以及编写相同的事务时操作的顺序保持一致。更好的答案网上挺多博客有写。

  8. 问完MySQL之后,面试官突然邪魅一笑,说想到了一个有趣的问题,我就知道情况不妙,果然问了个让人摸不着脑袋的问题:数组下标为什么是从0开始的??

    一顿瞎掰之后,面试官让我自己后面去了解下。。后来查了一些资料发现一个大致的说法是,数组的首地址就是第一个元素的地址,如果从1开始,那么每次获得第n个元素时,都要做下n-1操作,所以多了不必要的运算。

  9. 后面就是Java相关了。HashMap中的数组容量为什么总是2的n次方?

    为了扩容时转移节点不用去重新计算hash值,通过与运算判断后直接把元素放到新数组的原位置or原位置+旧数组长度。

  10. ConcurrentHashMap中线程是怎么去协助扩容的?他是怎么知道扩容已经结束了?

  11. JVM八股:内存布局、回收算法、GC Root可达性分析、内存分配担保、CMS G1

  12. 线程池场景:核心10、总数10、队列20,瞬间60个线程请求,在线程和队列都饱和的情况下有多少个线程会触发拒绝策略?(60-10-20=30个)

  13. 简单讨论了下实习的内容,在学校做项目遇到技术问题时怎么处理

二面

二面的话会去抠项目细节,面的头很大。没有录音,写一些印象比较深刻的问题

  1. 项目是做什么的的,有哪些技术难点,为什么不用其他技术方案实现 等等等;实习做了哪些工作
  2. 悲观锁和乐观锁的场景,扣减库存的场景应使用哪一种锁?
  3. 你的项目里网关的鉴权流程?
  4. 缓存和DB一致性怎么保证?
    答了让后台的线程使用队列去串行化更新,然后面试官问可以由客户端请求的线程来更新缓存吗?
    我说可以,更新时使用分布式锁保证只有一个请求的线程在操作
  5. 接着面试官就问了分布式锁的使用会有什么问题?这里答的不是很好,后来才知道问的应该是锁的唯一性、可重入等问题。。
  6. Redis除了缓存、分布式锁还有其他场景吗?
  7. API和SPI区别
  8. 讲一下依赖倒置
  9. 项目有使用到什么设计模式吗?(策略模式)

HR面

HR面了很久,感觉很看重你对公司的意向,对过往经历问的很细。。。主要围绕下面几个部分

  1. 实习的收获,为什么不去实习公司
  2. 家庭环境、从小到大有经历过什么困难吗
  3. 团队中出现分歧怎么办
  4. 都投了哪些公司,为什么
  5. 比赛时印象最深的困难

讨论

想和大佬们讨论下

  1. 扣减库存的场景应使用乐观锁or悲观锁?
  2. 缓存DB一致性的保证有没有更好的解决方案呢?
  3. MySQL机器上CPU飙升,怎么解决?

总结

首先在基础方面自己要有比较擅长的一块,这样如果面试官给力的话会让你说自己擅长的,不然也可以引导面试官向自己擅长的部分去提问,尽量给自己加分。二面的面试官会根据你的项目去引申出一些场景题,所以对于项目使用到的技术栈还是要多去思考,之前一直背八股文,导致对于一些实际场景的使用不了解,继续改进。最后许愿offer~

#面试复盘##有赞##面经##java工程师#
全部评论
回答下第三个问题吧。 当 cpu 飙升时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。 如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。 一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。 也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。
10 回复 分享
发布于 2021-09-29 09:55
回答下第二个问题。 一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况。串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。 还有一种方式就是可能会暂时产生不一致的情况,但是发生的几率特别小,就是先更新数据库,然后再删除缓存。
2 回复 分享
发布于 2021-09-29 09:59
大佬是学计算机的么,这些问题我甚至连看都看不懂,😥在哪些地方哪本书里能搞懂这些问题啊
点赞 回复 分享
发布于 2021-09-29 10:38
楼主我也是有赞的,最近面完了HR面,但是面试官都使用的go感觉好离谱啊
点赞 回复 分享
发布于 2021-09-28 22:05
mark
点赞 回复 分享
发布于 2021-09-29 00:17
楼主,想问下你是好久面试的,面试之前有没有笔试啊。有赞的简历我投了很久了,一直没动静。
点赞 回复 分享
发布于 2021-09-29 11:20
想问一下楼主有没有过呀,可以留个联系方式吗?
点赞 回复 分享
发布于 2022-01-25 19:14

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
17 93 评论
分享
牛客网
牛客企业服务