准备很久,还是被小红书虐了。。。
大家好,我是小林。
前段时间跟大家偷偷盘点 24 届校招薪资!其中最亮眼的就是小红书了。
然后很多同学好奇小红书的面试难度如何?
其实互联网公司面试的内容都差不多,不过具体还是看面试官的风格,有的面试官喜欢通过八股细节来考察候选人的基础知识,有些面试官不喜欢问八股,而是通过项目+场景问题来考察候选人是否具备能利用技术思维解决问题的能力。
不过,不管怎么样,大家简历上所写的内容一定要是熟悉的,因为有可能面试官会对着你所写的内容,一个一个问你,看你是不是真的懂简历所写的内容,简历上写着熟悉,如果一问三不知,基本就凉了。
今天分享一位校招同学的小红书面经,简历上写了熟悉分布式协议和分布式事务,然后面试官追着这一点去深问了,整体的面试难度就会加大了,相当于自己给自己选择了困难模式。
八股
ArrayList和LinkedList有什么区别?
array:连续空间、局部性好、查找快
linked:不连续、增删改快
如果一个有序的ArrayList查找怎么样最快
二分
如果是linkedlist呢?不想遍历这个有序的linkedliist?
利用多级索引思想,构建跳表,查找性能也能提升
如果我写一个for循环,调用List的add方法,这个时候用arrylist好还是linkedlist好呢?
这个我感觉还是linkedlist好。因为arraylist还要考虑扩容,linkedlist直接修改尾指针就行了
讲讲redis内存淘汰
分为两种,淘汰和不淘汰
不淘汰的话,内存超过阈值就会报错
淘汰的话分成两种,可以在所有key中淘汰,也可以在设置了过期时间的key中淘汰。
淘汰的话有三种算法,分别是lru,也就是淘汰最久没有使用过的key,lfu,就是淘汰使用次数最少的key,和随机淘汰
如果让你实现一个lfu,怎么实现
构建一个node结构,存储key value 和次数time
使用小根堆,增删改查元素的时候根据time排好序
淘汰的时候淘汰堆顶元素
我看你说了解分布式事务是吧,那你先讲讲rocketmq的事务消息,怎么操作的
本地事务投递mq,发送一个半消息,然后执行本地事务。broker会查本地事务状态,本地事务返回rollback或者提交或者不确定,broker做出相应执行。但是这个回查是有次数限制的,如果达到一定次数还是没能获得本地事务是否提交的答复,就会丢弃这个消息
你讲讲2pc和3pc本质的区别是哪里?
不是很清楚
那你先讲讲2pc和3pc的流程吧
2pc是事务提交的时候,协调者先向参与者发送请求事务提交,协调者执行事务,返回
协调者等到所有参与者都返回了,发出提交请求
协调者提交事务
3pc由CanCommit、PreCommit和doCommit组成
cancommit是参与者检测自身状态,precommit是参与者执行事务,docommit是参与者提交事务
2pc有什么问题吗
协调者的单点问题
协调者单点会有什么异常情况呢?
这个不是很清楚
那你知道3pc解决了这个问题了吗,是怎么解决的?
这个不是很清楚
我看你写了解raft,raft主要解决什么问题呢?有手写过吗?
raft解决分布式系统中的数据一致性问题。之前使用go语言写过leader选举和日志复制
讲讲leader选举的流程
集群中有一个节点的leader选举计时器超时,成为candidate,开始leader选举
首先,candidate的term+1,发送请求投票RPC,follower进行投票
candidate如果收到过半以上的票数,成为leader,开始发送心跳
如果candidate收到了leader的心跳,证明已经选举出了leader,更新自己的任期
否则就开始下一轮选举
follower怎么判断该不该投票给candidate呢?
如果follower的最新的日志的任期小于candidate最新日志的任期,就投票
如果follower的最新的日志的任期等于candidate最新日志的任期且follower最新日志的编号小于等于candidate最新日志的编号,就投票
其他情况不投票
知不知道选票分割,你自己手写的时候有解决这个问题嘛?
在leader挂的时候,如果很多follower同时变成candidate并发出requestVoteRPC,这样的话可能所有candidate都不能获得过半以上选票,这样的话就会不断进行下一轮的选举,永远无法选举出leader
你自己手写的时候,有没有去考虑其他可能出现的异常情况?
考虑过不少异常情况,在raft一个动画网站上去模拟了各种机器宕机和网络分区的情况,但是因为过去比较久远,记得不是太清楚了
讲讲日志复制
日志复制是leader主要是通过appendEntriesRPC来完成的
appendEntriesRPC不仅仅能进行日志复制,还作为发送心跳的RPC
当leader接受到了上层的写操作的时候,首先将这个日志条目追加到自己的日志末尾,然后要保证过半follower提交,leader才会提交然后返回上层写成功
当leader将日志条目追加到自己日志的结尾,然后发送appendEntriesRPC
appendEntriesRPC包含了自己的任期、last log index和 last log term、具体的日志条目。
当follower收到请求后:
如果发现leader的任期号小于自己的任期号,拒绝请求 如果发现任期号大于等于自己的任期号,表示找到了合法的leader,更新自己的状态,然后比较leader的last日志与自己的日志,尝试匹配日志条目。如果匹配成功,追加新日志,返回给leader成功;如果匹配不成功,follower会给leader返回失败,leader下一次appendEntriesRpc的时候会提前一个日志条目供follower匹配
raft是CP还是AP?和redis保证高可用的方式有什么区别,能讲讲细节嘛
cp,这个不是很清楚
Java中HashMap什么情况下,解决hash冲突的时候链表会变成红黑树?
受两个因素影响,一个是总结点数,一个是链的长度。总结点数我记得是64,链长度的阈值有点记不清了
知道怎么自定义比较两个对象的大小呢?
使用比较器,实现Compartor接口当中的compare方法
如果有对象是不可比较的,加入红黑树中,用什么方案去比大小呢,能说出哪些方案呢?
使用hash函数去算hash值
面试官:是使用hashcode吗?
不是,可以用一个更散列的hash函数做,减少冲突的可能性
面试官:如果冲突了怎么办
不是很清楚
面试官:还有什么方案吗?
使用内存地址比较
我看你简历上写熟悉IO多路复用,平时有用过吗,介绍一下
之前写NIO的时候用过IO多路复用,NIO中的select其实本质上就是使用linux的epoll实现的。
IO多路复用是一种IO得处理方式,指的是复用一个线程,处理多个socket中的事件。能够资源复用,防止创建过多线程导致的上下文切换的开销
常见的IO多路复用系统调用有select、poll和epoll
你知道epoll是怎么实现的吗?
epoll实现IO多路复用主要依赖于三个系统调用
epoll_create:创建一个Epollevent的对象
epoll_ctl:向epollevent的对象去注册感兴趣的socket,epoll底层通过红黑树去存储这些socket
epoll_wait:进程挂到epoll对象的阻塞队列中,当有socket事件到来的时候,将这个socket添加到rdlist组织的链表中,回传给应用层,唤醒被阻塞的进程去处理
epoll相比于前两种有哪些优势?
不需要回传整个socket集合,只需要传递发生事件的socket
消息队列
我看你简历上写熟悉RocketMQ使用,具体讲讲项目中怎么用的吗
主要是将对一些业务流程进行了解耦和异步化,比如会把每个人的抽奖信息放到mq中,消费者拉取消息进行消费,进行后续的发奖过程。
那你在这期间rocketmq挂了怎么办?
我们做了兜底,定时任务扫描库表中的抽奖信息,如果抽奖单的“已发送”字段为0,会再发一次rocketmq
rocketmq和kafka有什么区别?
Kafka比较适合日志场景,rocketmq适合业务场景
为什么呢?
不是很清楚,日志场景可能允许一些消息的丢失,kafka为了追求性能,是会丢消息的
项目
介绍一下最近做的最有成就感的项目是什么?
开始了。。。项目足足拷打了 30 分钟,对着简历项目经历中的一条条问题,足足问了 25 个问题,累蹦了!
因为是实验室项目,就不贴出来了,对大家也没有参考意义,主要是想告诉大家,简历上所写的一定要掌握,而且还要自己的研究下,你实现的项目,是否有其他方案来解决。
比如你用 redis 实现了分布式锁,为什么选择 redis,而不用 mysql 、zk、etcd 来实现分布式锁,所以平时还是要多扩宽自己的技术视野,多掌握一些实现方案,进行对比。
场景
给你一个场景吧,在支付界面让用户同时选择支付宝和微信支付,但是用户点了微信,这个时候网卡了,又点了支付宝,这个时候如何保证用户不重复付款
前端页面变灰,或者执行支付逻辑之前先加锁,返回给前端成功再释放锁
还有别的方案呢?前端往往是不可信的
不知道了
面试总结
感觉
全程无算法
场景题偏多,和面试官整体聊下来很愉悦,项目中的每一个点基本上都会问有无别的方案解决,八股也不常见,而是以场景为基础
不足
临场应变能力不行,很多场景问题没有头绪,比如怎么保证用户点击支付按钮的幂等性,只能想出比较简单的方案。
基础知识细节上掌握不牢靠,比如问2pc和3pc本质区别,3pc是如何解决2pc的问题的,之前知识粗略进行死记硬背,不够灵活。
历史好文: