有赞一面+二面+HR

8.27笔试算法题AC leetcode 中等+困难

8.29一天面完

9.3收到意向书

有赞是分批次面试的,一批会拉到一个群里在一天内完成所有流程,效率非常高,面试体验极佳。

一面(1h)

一面偏基础

1、自我介绍

2、介绍项目

会提出很多优化和问题。

3、redis持久化操作,优缺点?

rdb和aof

数据完整性不同

aof最后一秒命令没写进去怎么办?

这里我不知道怎么回答了。aof可以设置一秒进行一次sync,好像也没办法完全保证数据安全,如果设置成always的话又会十分影响性能,写的时候redis宕机的话,aof文件如果出错可以通过redis-check-aof --fix修复。

4、Redis数据类型?

String(字符串) List(列表) Set(集合) Hash(哈希) ZSet(有序集合)

geospatioal(地理位置) Hyperloglog(基数 ) Bitmaps(位存储)

String:SDS

List:ziplist linkedlist

ZSet:ziplist skiplist(跳表)->zskiplist和zskiplistNode

5、跳表的好处

有序链表没办法二分查找,想办法对有序的链表优化,使查找速度能更快

跳表是基于链表的升级,使一个有序链表获得了高效增删改查,并始终维持有序的能力。

在原始链表的基础上,增加了一个索引链表,多层次的索引链表。

平均查找和插入时间复杂度都是O(logn) ,空间复杂度 O(n*MaxLevel))

6、RabbitMQ组织结构

RabbitMQ项目里的应用场景?

img

7、RabbitMQ主从同步怎么实现?

不清楚,项目里面就是简单的使用。不是ACK吧?刚刚上个问题简单介绍了一下,但是主从同步真的不清楚了。

https://wuhulala.blog.csdn.net/article/details/90649323

8、项目里面多线程使用?

项目里面只有ThreadLocal是关于多线程的,我就把ThreadLocal 介绍了一下,说了下ThreadLocal 的优缺点,使用场景。

主要是ThreadLocal内存泄漏风险

9、ThreadLocal什么时候key为null?

这里又涉及到Java的引用关系,key是弱引用,value是强引用

ThreadLocalMap的生命周期与Thread的一样长,如果没有及时删除对应的key,就会导出内存泄漏

JVM通过利用设置ThreadLocalM的key为弱引用,来避免内存泄漏;

但是弱引用的话也是存在内存泄漏风险的,如果当前线程没结束,但是key==null了就算key为弱引用,还是存在内存泄漏的问题,比如使用线程池,多个线程堆积。

10、强引用、软引用、弱引用、虚引用各自的区别?

主要是回答上面的问题,解释了下4个不同的引用关系的特点和应用场景

11、然后分析我项目里面的引用关系?

怎么保证使用过程中,value不会被回收

我并没有去想这些,因此这里答的并不好,因为我是在使用完后手动remove掉了的,所以没去考虑

每个请求对应一个线程,这样只要线程不结束,value都不会被回收吧,这里还真是没去想。

真的每个问题都深挖到不会为止,这也反映出在准备的过程中,其实并没有真正追根溯源的去考虑问题。

12、Mysql事务

ACID

A:uodo log保证

C: AID+业务保证

I: MVCC保证

D:redo log保证

13、4种隔离级别?分别解决了什么问题?

1. ISOLATION_READ_UNCOMMITTED(读取未提交内容)

2. ISOLATION_READ_COMMITTED(读取提交内容):解决脏读

3. ISOLATION_REPEATABLE_READ(可重复读) 解决不可重复读

4. ISOLATION_SERIALIZABLE(可串行化):解决幻读

14、你的意思是可重复读会有幻读问题?

其实这个题挺有争议的

首先《高性能Mysql》这本书里面其实说了RR级别是解决了幻读的。

我在博客中看到有人说这本书是说的PostgreSQL 的实现方式,按照Mysql的官方文档,其实是没有解决幻读的

因为innodb里面涉及快照读和当前读,对于正常的 select 查询 innodb 实际上进行的是快照读,即通过判断读取到的行的 DB_TRX_ID 与 DB_ROLL_PTR 字段指向的 undo log 回溯到事务开启前或当前事务最后一次更新的数据版本,从而在这样的场景下避免了可重复读与幻读的问题。

insert 和 update 操作虽然是进行当前读,但 insert 与 update 操作后,该行的最新修改事务 ID 为当前事务 ID,因此读到的值仍然是当前事务所修改的数据,不会产生不可重复读的问题。 但如果当前事务更新到了其他事务新插入并提交了的数据,这就会造成该行数据的 DB_TRX_ID 被更新为当前事务 ID,此后即便进行快照读,依然会查出该行数据,产生幻读。

但是在描述的时候,由于我没办法根据具体的查询事务举例来论证,因为要完整的从具体的事务说起,内容很多。只能说总结的,就是上方描述的文字。

15、MVCC是什么?

多版本并发控制,是MySQL的InnoDB引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。

基于乐观锁理论

在MySQL中,会在表中每一条数据后面添加两个字段:最近修改该行数据的事务ID,指向该行(undolog表中)回滚段的指针。

16、已经标识了事务id,同一个事务为什么还会出现幻读,我MVCC已经读了一个快照了

这里我还是按照第14个问题那样答的,面试官说让我再看看,再了解了解,平时看八股很多,但是聚焦到具体的细节上面,我可能就答的不好了。还需要多去学习提高提高。

17、线程池了解吗?

创建方法、七大参数,线程执行流程

18、任务队列的实现原理?

这里面试官是想让我说任务队列的工作原理,阻塞唤醒这些。

但是我理解错了。第一次面试问这么深,所以这里没答好。

我答的是ArrayBlockingQueue:底层是数组,有界队列LinkedBlockingQueue:底层是链表,可以当做无界和有界队列。

实际上应该回答阻塞队列,原理就是读操作和写操作都需要获取到 AQS 独占锁才能进行操作。如果队列为空,这个时候读操作的线程进入到读线程队列排队,等待写线程写入新的元素,然后唤醒读线程队列的第一个等待线程。如果队列已满,这个时候写操作的线程进入到写线程队列排队,等待读线程将队列元素移除腾出空间,然后唤醒写线程队列的第一个等待线程。

面试官觉得我没理解对问题,然后给我解释就是一个线程,当前线程执行完了会怎么办?

我一直没有说对阻塞队列,就算是说ArrayBlockingQueue这些也只是说WorkQueue的形式,然后越说越偏了感觉,说起来源码里面的线程复用了。

 while (task != null || (task = getTask()) != null) {  task.run();//执行task中的run方法  }  }

哎呀,反正这题说的有点偏了。面试官是想问阻塞队列的原理。

19、核心线程会回收吗?

不会回收

20、四种拒绝策略

1、CallerRunsPolicy:该策略下,在调用者线程中直接执行被拒绝任务的run方法。除非线程池已经shutdown,则直接抛弃任务。

2、AbortPolicy:该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。

3、DiscardPolicy:该策略下,直接丢弃任务,什么都不做。

4、DiscardOlddestPolicy:该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列。

21、数据库索引?

B+树+很多八股

面试官说知道我准备很多,然后问一些不那么八股的,哈哈哈,不过可以看出来前面的问题,很多都是问的很深入,如果只是单纯背八股的话,肯定不行,要多理解,只有自己真正会了才能不被问住。

22、树的深度遍历和广度遍历

天天做二叉树前中后的算法做迷糊了。我就答了下这些算法的实现。

其实深度遍历就是dfs 广度是bfs

二叉树的层次遍历可以算广度遍历,通过队列实现。

然后前中后可以使用递归实现,迭代的话使用stack

23、微服务架构了解吗?

不了解

24、使用切面做什么事情?怎么做的?

aop比如日志的实现,日志这个业务就是我们的横切关注点,日志这个类就算切面,通知是切面里面的方法。

我说了简单的概念和简单的场景

面试官想让我说详细一点,但是这里我很久没写过了,一时更具体的描述,没描述好。

25、synchronized 锁升级

从无锁到偏向锁,再到轻量级锁(自旋锁)。深入源码,深入JVM分析,这里特别推荐大家去看《深入理解JAVA虚拟机》

反问

面试官人超级nice,问问题也一直在挖掘我的知识面。

给了我很好的建议,知识不仅要会用,还要深入去了解原理,不能只停留在表面。

每个问题都是问到很细节的方面,一定要多去理解,多去深入。主动push自己擅长的领域

最后面试官让我加油!!!面试体验真的很好,我感觉自己准备的已经很多了,但还是学到了超级多,学无止境哈哈哈。

二面 (1h)

面试官也超级nice,也是个大佬,面的我很慌😂

全程没有八股,项目,深挖项目,场景题

二面感觉自己发挥一般吧,因为一点八股都没有,如果自己说的话,也会被面试官打断,问的问题也是围绕项目,比如做一些优化,还有项目上面的细节问题。

项目没有参考性,所以就不细说了。

总体来说,二面考察更偏向于对实际问题的思考和解决问题的思路

有个比较印象深刻的场景题

实现一个外卖系统?

首先一个外卖系统我们要抽象出具体的元素

外卖系统设计到三个最重要的角色, 商家----用户----骑手

然后根据这三个角色去分析不同角色之间的关系,通过不同角色的关系来分析具体的业务。

比如商家和用户之间,他们的关系就是用户在商家处点外卖,也就是用户通过商家下订单。通过这样的分析,我们可以知道,有用户表,有商家表,还有商家的商品表,还有包括用户下订单后的订单表。然后分析商家和骑手的关系,骑手去商家处拿到外卖送到用户手上,这里就又映射出了骑手表,然后是哪个骑手去商家处拿外卖呢?这里就设计到具体的实现和思路了。根据我自己所学的,我想到可以使用geospatial来实现,当然里面细节涉及很多,面试不一定要你把所有都说出来,但是一定要多去思考里面的逻辑,比如最简单的逻辑,距离最近的骑手会拿到这个订单,但是这个逻辑是正确的吗?显然不是,因为骑手接受订单不是强制的,而是由骑手自己选择是否要接这一单,所以一个订单出现,分配给骑手一定是一定范围内的骑手,然后下面新的问题就又会出现,两个骑手都抢到一个订单怎么办?订单都抢不到怎么吧?很显然,这里是一个并发的问题了。实现的细节又有很多,比如通过消息队列等等这些。下面的分析就是围绕并发问题的分析了。

我这里只是提供个思路,思考问题的思路,当然面试的环境下,不确定因素有很多,我们大多数情况下是不能像平时总结一样的冷静分析问题的,还是要学会如何分析问题,这是重要的。

HR

hr面不是闲聊那种,面试官也很认真,主要围绕一些学校经历展开的。(也很漂亮😂)
如果大家关于上方问题有什么疑问或者想要探讨的,欢迎私信我或者在下方回复。

总结

有赞效率真的很高。一天的时间面试官和面试者,每个时间段,都有人安排,速战速决。

一天走完所有流程,真的太爽了。

对面试官印象都很深刻,问的问题也很深入,不停留在八股表面。一面二面几乎都是围绕项目展开的。

体验极佳的一次面试

我看帖子,不少人1面2面+hr面后还是挂了,希望大家不要失去信心,秋招是场持久战,每一次的面试都是积累经验的过程,不断的进步,一定能收获好的成果。

最后,希望大家秋招都上岸,offer+++😁😁😁


#面试复盘##面经##有赞#
全部评论
21号笔试的现在还没安排面试是不已经挂了
点赞 回复
分享
发布于 2021-09-03 15:03
楼主方便透露薪资嘛
点赞 回复
分享
发布于 2021-09-03 16:15
秋招专场
校招火热招聘中
官网直投
楼主,只有两面吗?
点赞 回复
分享
发布于 2021-09-03 17:48
有赞的面试官水平还是很高的
点赞 回复
分享
发布于 2021-09-04 07:59
有赞体验真的超好,高效且质量高。一面面试官温和,二面非常专业真的挖掘到能让我反思和成长的点,hr也不是空谈,解答问题很耐心。虽然网上对有赞很多不看好,但我还是很想去
点赞 回复
分享
发布于 2021-09-09 00:35

相关推荐

13 87 评论
分享
牛客网
牛客企业服务