26届美团暑期实习后端开发一面面经(面完马上约二面)
总结:项目+算法+围绕简历问八股,感觉是贴主面得最差劲的一次,比之前的腾讯和阿里都要差(背的八股记得不太熟练),结果面完不一会就约二面了有点出乎意料,3.25已oc
#美团# #美团求职进展汇总# #Java# #后端#
首先自我介绍还是老套路把面试官往项目上引
1.问在项目中参与的角色,以及为什么做这个项目
答:个人项目,参照开源项目做的,为了深入学习Spring开发流程(略)
2.你在项目中redis和数据库的一致性保障怎么保障
答:采取“先更新数据库,再删除Redis缓存“的策略,引入消息队列,让消费者来删除缓存,如果失败可以重新消费,这种重试机制进一步保证了一致性。(补充:还可以通过订阅MySQL的binlog,用里面的数据库更新信息来操作更新缓存)
3.采用Kafka作为消息队列如何就能对系统进行解耦呢?
答:Kafka采用异步通信形式,将生产者和消费者解耦,生产者将消息发送到Kafka,消费者从Kafka中读取消息,生产者和消费者不再直接依赖于对方的实现,彼此之间不需要知道对方的存在,只通过消息队列来传递信息。这种模式使得两个系统之间的耦合度大大降低
4.那了解Spring微服务框架吗?
答:不了解,我的论坛系统项目是基于Spring Boot开发的,没有使用Spring Cloud
5.那Spring Boot和原生Spring之间有什么差别
答:原生Spring配置起来更为复杂,需要写很多的xml,而Spring Boot配置更为简单,开发起来可以更注重于业务逻辑而不是繁琐的配置
6.问项目二,你为什么会想去自己手写一个Spring框架
答:深入自己对Spring框架的理解,进一步的了解他的底层
7.那Spring的IOC你是怎么理解的
答:(我把IOC和依赖注入一起讲了,后面面试官提醒我只需要讲IOC),就是把需要自己通过代码进行管理的对象创建和依赖关系管理交给Spring容器,这减少了应用程序中的耦合度,提高了代码的可维护性和扩展性。
8.面试官发现我简历上手写Spring框架采用了TDD开发模式,说她们自己在工作中都很少会用到这种开发模式,感到很惊讶,询问我为什么使用TDD开发模式?(我跟着卡哥做的手写Spring,跟着用的TDD)
答:背诵了项目面试题里的TDD开发模式流程与好处
9.其实我只是想问你是因为什么导致你去采用这个TDD开发模式
答:(答了好处居然都不好使,我瞎编说是浏览文章时学习到了这个开发模式,所以就想应用一下试试看)
10.那你应用完这个开发模式后学到了什么?
答:因为是先写测试用例再写逻辑代码,使得代码错误率降低,开发出来的代码质量更高,学到了以后写代码前都认真准备相应测试用例,避免出现更多bug
11.jvm内存结构
答:(之前背过但有点忘了,甚至因为试图去想起来的时间太久,面试官还调侃我刚刚不会是去问ai了吧)粗略说了堆区和栈区
12.看你项目中用了ThreadLocal,说说用在哪
答:说在论坛项目中,获取当前登录角色,使用ThreadLoacl使得每个线程都能获得一份互相独立当前用户副本
13.那ThreadLocal的实现原理呢?
答:(之前用的时候粗看过,但是后面忘了)老实交代不熟悉
14.那你在项目中使用了哪些设计模式
答:创建Bean使用工厂模式,实现JDK动态代理和CGLIB代理使用了代理模式,许多代码块使用了模版方法模式,实现MVC时请求的传入处理过程采用了责任链模式
15.责任链模式优点
答:解耦,将每个阶段独立开来,可以对此进行单独配置扩展
16.那你使用责任链模式的时候,要是我中途一个阶段出现了问题,我前面的数据怎么进行回滚
答:(完了盲区)老实交代我做的MVC处理请求这里没有涉及事物的回滚,这方面我不熟悉
17.那我在一个代码块里大量使用了if-else,采用什么设计模式优化好
答:策略模式,将不同的逻辑封装成不同策略类中
18.数据库的隔离级别了解吗?
答:Read Uncommitted,Read Committed,Repeatable Read,Serializable
19.Repeatable Read具体是啥,怎么实现的
答:可重复读,就是多次读取数据是一致的,通过加共享锁和排他锁,或在MySQL中通过mvcc实现,原理就是通过read view...
20.那什么是排他锁?
答:施加了排他锁的数据,在给他施加排他锁的事务释放锁前,其他事务都无法读或写该数据
21.那你举例一个发生死锁的场景,并说解决方法
答:没答对(面后补充:假设这个数据库隔离等级为可重复读,比如我在一个订单表里,每次插入操作前想保证操作幂等性,先查查表里有没有这个id的订单,就执行select。。。for update,这时有两个不同的事务一个查了id为1007的,一个查了id为1008的,这时候两个事务在查找for update时都获取了间隙锁,因为间隙锁是可以兼容的,所以两个表都获得了,但是后面两个表要执行插入操作前要插入意向锁,但是意向锁不兼容间隙锁,两个事务都在等待对方释放锁,就造成了死锁。除了在设计层面避免出现死锁的场景,在发生死锁后可以通过设置事务等待锁的超时时间,超时则回滚避免死锁,或者添加死锁检测机制,检测到系统死锁就对事务进行回滚)
22.MySQL的索引了解吗?一级索引二级索引说一说?
答:了解,(八股背少了,一时没想起一级索引二级索引是啥)说了个主键索引和非主键索引
23.索引的底层实现是什么?
答:B+树,数据存储在叶子节点,节点直接像链表一样用指针相连,对查询范围数据很有效
24.(很明显对我MySQL不太满意)你们学校学MySQL了吗?Java呢?
答:学了MySQL,但Java是选修课
25.(面试官默认我是研究生,其实我是本科生)那你在学校实验室里和导师做哪方面研究呢?
答:说自己是本科生,没有导师做研究
26.那你在学校有和老师做什么研究吗?
答:有个大创项目,是无人机路径规划,但是是机器学习方面的,不是我的侧重点
27.那你实习能实习几个月,一周来几天?
答:我说我不是研究生学校束缚不了我,可以四月干到九月,一周出勤五天及以上
28.你自己的优势?
答:对新技术的学习比较热爱,学习能力和规划能力比较强,比如我的项目,Java以及Spring相关的学习都不是学校教学的,是我通过自己指定计划自学的,再运用到实际开发中来。
29.那你是怎么自学的?
答:csdn找文章,b站找视频,制定好学习路线,通过跟着视频、文章,或者阅读Spring的官方手册文档,循序渐进的进行学习
30.算法题
又是快速排序,之前腾讯面试也是快速排序,给了十五分钟
5分钟不到速通了,原本十五分钟后差不多就到时间了,后悔写太快了,导致后面问我有没答出来的
31.Redis缓存穿透、缓存击穿、缓存雪崩,及其解决方案
答:Redis三剑客,八股照着背
32.Redis主从复制
答:有主服务器和从服务器,Redis会将数据从主服务器复制到从服务器上,哨兵机制保证主服务器宕机就切换到从服务器,这样不至于主服务器宕机后Redis就无法使用
33.看了简历上写了GC,就问GC的的垃圾回收器有哪些
答:(后悔了面之前简历没有背牢)答非所问的回答了垃圾回收算法,因为回收器我记不得了只记得算法
34.你使用Kafka有遇到重复消费吗?重复消费会怎样?
答:重复消费会导致通知推送多次,比如QQ发一条消息应该只推送一条通知,重复消费的话推送多条通知
35.(面试官之前问出来我MySQL掌握不牢,最后两分钟继续发问MySQL)那sql如何优化?sql执行后底层是怎么样的?
答:瞎说了几个感觉的sql优化方式,然后执行后底层回答不知道(面后补充:sql优化首先从索引入手,可以尝试使用覆盖索引,这样可以避免查询时使用二级索引引发的回表问题,插入数据时多行插入,以及为数据库引入缓存等;以一条select语句为例,首先MySQL由Server层和存储引擎层组成,首先在Server层先经过连接器,通过用户输入的用户和密码尝试建立客户端与服务器的连接,连接完成后进行第二步,第二步查找缓存,Server以键值对的形式存储sql查询结果,key为sql语句,value为查询返回值,如果查找到对应的key则直接返回value,否则进行下一步,但是这个查找缓存的功能在经常更新里的数据库很鸡肋,在MySQL8.0之后就被删掉了,然后呢就Server层的解析器,解析SQL语句,首先进行词法分析,提出select,form这样的关键词,然后对sql进行语法分析,判断语法正确与否,正确就构建SQL语法树,不对直接返回报错,正确之后呢就进入SQL执行过程,首先预处理阶段,看看是否有这个表或是否有对应字段,然后进入优化器阶段,确定SQL的搜索方案(就是根据索引搜索成本选索引),然后执行器和引擎交互执行SQL。然后在引擎方面,如果select传进来是主键,就直接在主键索引建立的B+树,由根节点进行二分查找找到主键key的指针,再递归指针指向的节点,找到对应数据返回,如果传入的是二级索引,则要在二级索引树上找到主键索引再去重复上述过程,最终将找到的结果返回给客户端。)
反问流程:
感觉自己面得稀碎,都不好意思反问,直接道谢下播了
没想到刚面完一个多小时,美团就来电话约2面了
#美团# #美团求职进展汇总# #Java# #后端#
首先自我介绍还是老套路把面试官往项目上引
1.问在项目中参与的角色,以及为什么做这个项目
答:个人项目,参照开源项目做的,为了深入学习Spring开发流程(略)
2.你在项目中redis和数据库的一致性保障怎么保障
答:采取“先更新数据库,再删除Redis缓存“的策略,引入消息队列,让消费者来删除缓存,如果失败可以重新消费,这种重试机制进一步保证了一致性。(补充:还可以通过订阅MySQL的binlog,用里面的数据库更新信息来操作更新缓存)
3.采用Kafka作为消息队列如何就能对系统进行解耦呢?
答:Kafka采用异步通信形式,将生产者和消费者解耦,生产者将消息发送到Kafka,消费者从Kafka中读取消息,生产者和消费者不再直接依赖于对方的实现,彼此之间不需要知道对方的存在,只通过消息队列来传递信息。这种模式使得两个系统之间的耦合度大大降低
4.那了解Spring微服务框架吗?
答:不了解,我的论坛系统项目是基于Spring Boot开发的,没有使用Spring Cloud
5.那Spring Boot和原生Spring之间有什么差别
答:原生Spring配置起来更为复杂,需要写很多的xml,而Spring Boot配置更为简单,开发起来可以更注重于业务逻辑而不是繁琐的配置
6.问项目二,你为什么会想去自己手写一个Spring框架
答:深入自己对Spring框架的理解,进一步的了解他的底层
7.那Spring的IOC你是怎么理解的
答:(我把IOC和依赖注入一起讲了,后面面试官提醒我只需要讲IOC),就是把需要自己通过代码进行管理的对象创建和依赖关系管理交给Spring容器,这减少了应用程序中的耦合度,提高了代码的可维护性和扩展性。
8.面试官发现我简历上手写Spring框架采用了TDD开发模式,说她们自己在工作中都很少会用到这种开发模式,感到很惊讶,询问我为什么使用TDD开发模式?(我跟着卡哥做的手写Spring,跟着用的TDD)
答:背诵了项目面试题里的TDD开发模式流程与好处
9.其实我只是想问你是因为什么导致你去采用这个TDD开发模式
答:(答了好处居然都不好使,我瞎编说是浏览文章时学习到了这个开发模式,所以就想应用一下试试看)
10.那你应用完这个开发模式后学到了什么?
答:因为是先写测试用例再写逻辑代码,使得代码错误率降低,开发出来的代码质量更高,学到了以后写代码前都认真准备相应测试用例,避免出现更多bug
11.jvm内存结构
答:(之前背过但有点忘了,甚至因为试图去想起来的时间太久,面试官还调侃我刚刚不会是去问ai了吧)粗略说了堆区和栈区
12.看你项目中用了ThreadLocal,说说用在哪
答:说在论坛项目中,获取当前登录角色,使用ThreadLoacl使得每个线程都能获得一份互相独立当前用户副本
13.那ThreadLocal的实现原理呢?
答:(之前用的时候粗看过,但是后面忘了)老实交代不熟悉
14.那你在项目中使用了哪些设计模式
答:创建Bean使用工厂模式,实现JDK动态代理和CGLIB代理使用了代理模式,许多代码块使用了模版方法模式,实现MVC时请求的传入处理过程采用了责任链模式
15.责任链模式优点
答:解耦,将每个阶段独立开来,可以对此进行单独配置扩展
16.那你使用责任链模式的时候,要是我中途一个阶段出现了问题,我前面的数据怎么进行回滚
答:(完了盲区)老实交代我做的MVC处理请求这里没有涉及事物的回滚,这方面我不熟悉
17.那我在一个代码块里大量使用了if-else,采用什么设计模式优化好
答:策略模式,将不同的逻辑封装成不同策略类中
18.数据库的隔离级别了解吗?
答:Read Uncommitted,Read Committed,Repeatable Read,Serializable
19.Repeatable Read具体是啥,怎么实现的
答:可重复读,就是多次读取数据是一致的,通过加共享锁和排他锁,或在MySQL中通过mvcc实现,原理就是通过read view...
20.那什么是排他锁?
答:施加了排他锁的数据,在给他施加排他锁的事务释放锁前,其他事务都无法读或写该数据
21.那你举例一个发生死锁的场景,并说解决方法
答:没答对(面后补充:假设这个数据库隔离等级为可重复读,比如我在一个订单表里,每次插入操作前想保证操作幂等性,先查查表里有没有这个id的订单,就执行select。。。for update,这时有两个不同的事务一个查了id为1007的,一个查了id为1008的,这时候两个事务在查找for update时都获取了间隙锁,因为间隙锁是可以兼容的,所以两个表都获得了,但是后面两个表要执行插入操作前要插入意向锁,但是意向锁不兼容间隙锁,两个事务都在等待对方释放锁,就造成了死锁。除了在设计层面避免出现死锁的场景,在发生死锁后可以通过设置事务等待锁的超时时间,超时则回滚避免死锁,或者添加死锁检测机制,检测到系统死锁就对事务进行回滚)
22.MySQL的索引了解吗?一级索引二级索引说一说?
答:了解,(八股背少了,一时没想起一级索引二级索引是啥)说了个主键索引和非主键索引
23.索引的底层实现是什么?
答:B+树,数据存储在叶子节点,节点直接像链表一样用指针相连,对查询范围数据很有效
24.(很明显对我MySQL不太满意)你们学校学MySQL了吗?Java呢?
答:学了MySQL,但Java是选修课
25.(面试官默认我是研究生,其实我是本科生)那你在学校实验室里和导师做哪方面研究呢?
答:说自己是本科生,没有导师做研究
26.那你在学校有和老师做什么研究吗?
答:有个大创项目,是无人机路径规划,但是是机器学习方面的,不是我的侧重点
27.那你实习能实习几个月,一周来几天?
答:我说我不是研究生学校束缚不了我,可以四月干到九月,一周出勤五天及以上
28.你自己的优势?
答:对新技术的学习比较热爱,学习能力和规划能力比较强,比如我的项目,Java以及Spring相关的学习都不是学校教学的,是我通过自己指定计划自学的,再运用到实际开发中来。
29.那你是怎么自学的?
答:csdn找文章,b站找视频,制定好学习路线,通过跟着视频、文章,或者阅读Spring的官方手册文档,循序渐进的进行学习
30.算法题
又是快速排序,之前腾讯面试也是快速排序,给了十五分钟
5分钟不到速通了,原本十五分钟后差不多就到时间了,后悔写太快了,导致后面问我有没答出来的
31.Redis缓存穿透、缓存击穿、缓存雪崩,及其解决方案
答:Redis三剑客,八股照着背
32.Redis主从复制
答:有主服务器和从服务器,Redis会将数据从主服务器复制到从服务器上,哨兵机制保证主服务器宕机就切换到从服务器,这样不至于主服务器宕机后Redis就无法使用
33.看了简历上写了GC,就问GC的的垃圾回收器有哪些
答:(后悔了面之前简历没有背牢)答非所问的回答了垃圾回收算法,因为回收器我记不得了只记得算法
34.你使用Kafka有遇到重复消费吗?重复消费会怎样?
答:重复消费会导致通知推送多次,比如QQ发一条消息应该只推送一条通知,重复消费的话推送多条通知
35.(面试官之前问出来我MySQL掌握不牢,最后两分钟继续发问MySQL)那sql如何优化?sql执行后底层是怎么样的?
答:瞎说了几个感觉的sql优化方式,然后执行后底层回答不知道(面后补充:sql优化首先从索引入手,可以尝试使用覆盖索引,这样可以避免查询时使用二级索引引发的回表问题,插入数据时多行插入,以及为数据库引入缓存等;以一条select语句为例,首先MySQL由Server层和存储引擎层组成,首先在Server层先经过连接器,通过用户输入的用户和密码尝试建立客户端与服务器的连接,连接完成后进行第二步,第二步查找缓存,Server以键值对的形式存储sql查询结果,key为sql语句,value为查询返回值,如果查找到对应的key则直接返回value,否则进行下一步,但是这个查找缓存的功能在经常更新里的数据库很鸡肋,在MySQL8.0之后就被删掉了,然后呢就Server层的解析器,解析SQL语句,首先进行词法分析,提出select,form这样的关键词,然后对sql进行语法分析,判断语法正确与否,正确就构建SQL语法树,不对直接返回报错,正确之后呢就进入SQL执行过程,首先预处理阶段,看看是否有这个表或是否有对应字段,然后进入优化器阶段,确定SQL的搜索方案(就是根据索引搜索成本选索引),然后执行器和引擎交互执行SQL。然后在引擎方面,如果select传进来是主键,就直接在主键索引建立的B+树,由根节点进行二分查找找到主键key的指针,再递归指针指向的节点,找到对应数据返回,如果传入的是二级索引,则要在二级索引树上找到主键索引再去重复上述过程,最终将找到的结果返回给客户端。)
反问流程:
感觉自己面得稀碎,都不好意思反问,直接道谢下播了
没想到刚面完一个多小时,美团就来电话约2面了
全部评论
贴主会更新每一个面试的面经,可以点进贴主主页查看其他面经(都会写的详细),可以关注我获得最新面经通知。
牛牛牛,你的水平已经超过至少百分之八十的研究生了,本科就能有自主学习未来工作技能的意识真的很强!而且不受束缚这个太有生活了,这几天面试甚至有hr直言非常想要我,但是因为时间的考虑(导师六月中旬都不一定放人),他们需要先搁置我再对比一下。
很厉害,加油!
很强,大佬的面经很详细,加油佬


太强了,羡慕坏了
佬,哪个部门
这么快约二面了
狠狠羡慕了
mark一下
mark一下
接好运
想问一下佬什么bg 啊
大佬厉害,我面完到现在还没有回音
责任链回滚确实没听过
佬我也是这个部门 约了二面 佬二面是啥时候
八股盛宴
mark一下
mark一下
不懂就问二面还会问哪方面呢?和一面有啥区别呀
mark一下
大佬先更新数据库再更新缓存的场景可以说一下吗
相关推荐

点赞 评论 收藏
分享

点赞 评论 收藏
分享


点赞 评论 收藏
分享
点赞 评论 收藏
分享