上海逸迅信息科技有限公司-Java后端-base西安 已OC

一共两轮(技术+hr)

技术面

1.先简单的自我介绍一下

2.当时你们这个项目人员配备是怎么样的?

我引出了项目的背景...

3.讲一下你这段实习经历干了什么?

4.你再介绍一下你这个项目吧?

5.说一下redis常用的数据类型吧?

6.比如我现在要实现一个场景如何保存页面的一个点击量和用户量,你会怎么设计?(场景设计题)

我回答的是,在刚刚谈到的我提取出了一个关键信息就是无论一个用户访问了多少次同一个页面,都只算一次,那这个体现的其实就是唯一性,我会想到用set的数据类型进行存储,key放的是页面url,value放的是user_id。对于像页面点计量,其实我想到一个比较简单的,用string数据类型就行,因为他不用保证唯一性,key放的是页面url,value放的是count次数。

7.你说一下你的缓存一致性怎么做的,采取的是什么策略机制?

我回答的是主动更新数据库再删除缓存

8.你刚刚只是说了一个实现的大概过程,能具体说一下实现细节吗?比如现在我有一个帖子发生了变更?

好,我这个缓存一致性主要是对像文章热点数据进行一个缓存,虽然说是帖子的热点数据,但其实他对文章的实时性要求不高,因为一个帖子发布,是不怎么会去进行更改的。所以当帖子数据发生更改,首先我会先去更新数据库,然后将帖子变更信息投到消息队列中,再异步的由监听mq的消费者去删除缓存,当帖子下一次再被读取时,再加载到缓存中,保证的是数据的最终一致性。

9.对于像点赞数这种频繁发生数据变更的,是怎么保证数据库的数据一致性,也就是如何保证不漏请求?每一次都能更新数据库成功?

我在设计其实考虑到了这个问题,因为像点赞数这种频繁发生数据变更的,如果所有请求打到数据库都去写数据的话,可能会把db瞬间压垮,所以我在设计的时候没有用mysql去存储点赞量,而是将点赞数是保存到了redis中,数据的持久性是用redis保证的(RDB和AOF)。

思考:如果我一定要保存数据到数据库中呢?你会想到什么解决方案?

一定要保存到数据库的话就有一个点赞表然后方式的话是同步和异步,但是同步的话性能就很差,我觉得用异步会好些,当有点赞请求来了之后可以把请求保存到rabbitmq,他保证了消息的可靠性,如果追求高吞吐kafka会更好,同时mq又能起到一个消峰限流的作用,把请求都存到mq中,然后再根据mysql的消费能力,让mysql批次的来拉取数据比如一次100条,然 后再对这100条消息做聚合,比如10条请求都是对同一个帖子的点赞,那就合成一次,减少数据库的写入次数,提高性能,对于数据库的更新成功是保证了数据的最终一致性。

10.面试官说我现在交付给用户一个后台系统,然后用户拿到系统发现其中有一个查询列表的接口响应很慢,造成这个问题的原因可能是什么,以及如何定位这些问题。(场景设计题)

嗯~我想一下,我回答的是如果你用的是redis,因为redis指令是不能保证原子性的,每一个redis指令都会建立连接,如果涉及到多条redis指令,我会想到用lua脚本来保证redis的的原子性。其次就是如果我要查询的数据量比较大,一次查询渲染就会比较大,耗费时间,而且可能造成OOM,我联想到了是MYSQL的一个批次查询。

后续总结补充:如果是在回答一遍,我会说首先这个可能分为两个层面去考虑,一个是网络层,一个是应用层。

对于网络层可能是运维方面需要考虑,像网络延迟,带宽,路由等等,那对于一个java应用层面开发者的话,我可能首先考虑服务器的排查,像线程堆栈分析通过jstack -l <pid> > thread_dump.txt , 内存分析 jmap是不是因为由于申请的内存空间比较大,然后都需要经行GC垃圾回收,然后对于MySQL层面的话,我会开启慢查询日志去定位执行慢的SQL,然后用explain关键字进行执行计划分析,看看要不要加索引,或者是加了索引看看有没有命中,索引会不会失效,还有就是如果数据量比较大的情况,要不要考虑sql语句的优化,分批次查询,不要一次查询了等,像如果用到了缓存层,和上面说所一样,如果涉及到多条redis指令,我会想到用lua脚本来保证redis的的原子性一次连接。或者查看是不是缓存已经失效了,需不需要重建等,其实我们现在说的都是一个事后的补救过程,其实我觉得我们还需要重视事前的一个压测检查,就是在系统交付给用户前我们内部先测试,通过一些成熟的压测工具像我之前有了解过先Prometheus+Grafana去来链路追踪,去尽可能避免这种问题。

11.redis中设置了key的一个过期时间10min,假设现在过了10min了,那他还会在内存吗?是立马被删除吗?

我当时没有马上回答出来,后来结束的时候问了面试官,才回忆起来,我那时候在想面试官是想我说内存的淘汰策略还是过期策略。

答案是:过期数据肯定是会删除的,不过不是立马删除,他要看你的的数据过期策略,在redis中提供了两种数据过期删除策略。第一种是惰性删除。在设置该key过期时间后,我们不去管它。当需要该key时,我们检查其是否过期。如果过期,我们就删掉它;反之,返回该key。第二种是定期删除。定期删除策略是redis会将设置了过期时间的key放到一个单独的字典(dict 其实就是哈希表)中,然后定时的,以一定的算法去每次扫描字典中的部分数据检查,如果发现数据过期,则删除,直到遍历扫完整个字典。定期清理的两种模式是:1) SLOW模式,是定时任务,定期去删除(执行频率默认为10hz,每次不超过25ms,可以通过修改配置文件redis.conf的hz选项来调整这个次数);2) FAST模式,执行频率不固定(每次事件循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms)。Redis的过期删除策略是:惰性删除 + 定期删除两种策略配合使用。

HR面

都是一些软性问题...

1.现居住地在哪?

2.从家里到公司这边需要多久?

3.能接受这个路途时间吗?

4.如果到公司实习了,最看重公司的那个方面?

5.目前是以java语言为主,以后也是以java语言为主吗?

6.我看你之前大二就出来实习了,为什么这么早就出来实习了?

7.你的个人职业规划是怎么样的?

8.如果工作中遇到困难你会怎么解决?

9.那出现问题你会主动的去与他人沟通吗?

10.你觉得可以用那三个词来体现自己?

剩下就到我的反问HR环节...

#双非有机会进大厂吗##27届##发面经攒人品#
全部评论

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
国企上岸了的向宇同桌...:最害怕答非所问了,但是频繁反问确定意思又害怕面试官觉得我笨
AI时代还有必要刷lee...
点赞 评论 收藏
分享
04-19 18:50
已编辑
长沙学院 Java
个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务