查看原文
其他

准备很久,还是被小红书虐了。。。

小林coding 小林coding 2024-01-01

图解学习网站:xiaolincoding.com

大家好,我是小林。

前段时间跟大家偷偷盘点 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的问题的,之前知识粗略进行死记硬背,不够灵活。

历史好文:

【后端训练营】这一个月惊喜满满!!

不想卷了,冲国企去了!!

不愧是字节,把我吊打了。。。

不愧是微信啊,问的范围贼广!

有大厂实习,贼加分!

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存