面试复盘|美团后端开发工程师面经
8.16 美团后端一面
1.项目中数据库用的什么,用了哪些表。
2.用户完成了一个商品下单,数据库发生什么变化,修改哪些表。
3.如果一张表改了,另外的表没有改,怎么解决,在项目中用过吗,transaction事务具体怎么实现。(这里transaction我没答上来,二面又问到了)
4.数据库的事务怎么实现。
5.sql写过吗,了解吗?商品表有哪些模块?查询排名第二的商品名称(存在多个一样价格的商品,就是写一个sql,秋招让写sql我就遇到两次,问的也都不难,把牛客的sql前十几道刷了我觉得就没问题了)。
6.用户注册登录密码找回怎么做的。
7.秒杀系统最难的点在哪里。
8.限流在那些地方限流,怎么限流。
9.redis了解,用过吗,有哪些基本数据类型。
10.redis和MYSQL的差别在哪里?redis会不会丢失数据?有哪些持久化方式?ROF也会写硬盘为什么redis优于mysql;
11.分布式session怎么实现。cookie过期怎么办;
12.不同层次的缓存怎么做的。
13.URL缓存怎么做的,和刚刚的页面缓存有什么区别。
14.cdn(具体不了解,简单和面试官聊了一下概念)
15.实现两个线程交替打印,怎么做。
16.LeetCode.143。
★
8.20 美团二面
1. 有过实习经历吗?
2. 简单介绍一下项目里的电商平台系统
3. 在商品模块中有哪些关键的表
4. 商品的价格写在表里会有什么问题吗
5. 表的加锁,加锁是为什么解决什么问题呢
6. 如果有多个价格(平常价格,活动价格)怎么处理?
7. 数据库的三范式
8. 什么情况下我们会去打破数据库的三范式
9. 怎么防止多个人同时更改商品信息时,第二个人把第一个人的信息给覆盖掉(我说的是类似简历版本号机制,修改前读取一个版本号,然后提交时再读取一下版本号与之前读的一样不一样)
10. 事务有哪些隔离级别
11. MVCC是为了解决什么问题
12. 开启了事务后,本事务内的查询结果都相等吗(应该也是和事物的隔离级别有关,不同隔离级别,结果不一样)
13. Spring怎么实现对事物的支持?Transaction注解的底层原理了解吗(二面又问到这个了,我还是没答上来= =,提醒大家自己的面经一定要复盘!!!)
14. 商品数据量很大,解决商品查询的性能问题一般有哪些方法(通过增加索引)
15. MySQL索引的底层实现(主要是说说B+树的结构和优点)
16. 一个SELECT查询打到MySQL,执行过程是怎样的
17. 用户模块做的是什么?登陆是怎么实现的?
18. 前端要传数据给后端,怎么防止被攻击(我项目里用的http,考虑用https?)
19. HTTPS为什么安全?描述一下HTTPS协议的整个过程
20. Session的有效期怎么管理
21. Redis用过什么数据类型
22. Redis使用的存储的对象大小是多大
23. Redis分配内存的策略(这里我有点懵,没太明白面试官的意思,后来想想面试官可能是再考察我关于redis的String的底层实现的embstr和raw两种方式)
24. Redis分配内存的时间复杂度
25. 通过这些项目,你觉得呢最大的收获是什么
26. 限流一般有哪些措施
27. Spring的AOP了解吗,底层实现了解吗
28. JDK动态代理和CGLIB动态代理的区别
29. 为什么需要红黑树?
30. JAVA有哪些基本数据类型,各多长
31. Hashtable的get的时间复杂度,为什么是O(1)
32. 平时喜欢看一些什么书,看一些什么博客
★
8.24 美团三面
1.技术Leader面,自我介绍。
2.做项目的目的。
3.在实验室主要做什么项目?简单介绍一下。
4.秒杀系统核心?特性在哪里?挑战在哪里?
5.如何用MQ做异步下单?
6.秒杀之后没有立即生成订单如何支付?
7.轮询在前端还是后端轮询?轮询时间多久,一直轮询不到怎么办?
8.数据用的什么,外部高并发如何处理,大量的并发请求是怎么处理的?
9.有了解过SpringBoot对高并发的处理方式吗?能处理多高的并发?如果并发量超过线程池大小怎么处理?
10.每个对象到达的时候调用的都是一个Controller吗,怎么保证线程安全?
11.在你们研究专业方面用什么做开发?
12.写一小段代码。两个有序整数数组,合并成一个有序整数数组。
13.top(k)问题;
14.假设事务里先更新了一条记录,然后select,然后再commit,第二个事务在第一个事物更新后select前进行读,能读到吗?(这个问题我也是结合设置不同的隔离级别来说的)
8.26HR面
常规HR面,就不细说了。
★
总结:
因为我没有实习经历,所以对于那些同样没有实习经历的小伙伴可能有一些参考价值。主要就是多刷leetcode,多背八股,没有实习的话自己最好做些项目,面试复盘,面试别紧张。
刷leetcode:这块就是看平时习惯了,每天刷几题保持手感吧,大部分面试出的题还是很常规的,尽量把leetcode的常规题刷了,我个人目前leetcode刷了400多题,只要题刷的差不多,面试手撕基本问题不大。面试前可以去codetop.cc,刷一刷面试公司最近考过的题,或者高频题;
八股:八股我个人觉得理解更重要,不理解的话背了就忘,可以在牛客多刷刷别人的面经,jvm和多线程这款我比较推荐b站黑马程序员的对应课程,两个课程是同一个老师,我觉得讲的很好,还有就是github上的JavaJuide和CS-Note也可以关注一下,也总结了很多常见的面经。如果可以的话自己总结一份八股是最好的,自己撸过一遍肯定更熟悉,我自己的话总结了一份大概300页的面经(抱歉不能共享),还有就是面试问到不熟悉的点的话我建议直接跟面试官说不会,在那尬着也不太好。
项目:有实习项目可以聊当然最好,秒杀、RPC项目也可以,面试官也知道这些项目都烂大街了,但是有项目聊总比没有好,但是对于项目一定要吃透,能自己做一些优化是更好的
复盘:复盘也很重要,特别是同一家的面试,当前轮次面试官应该是可以看到之前的面试记录的,之前没有答上来的问题很有可能再次问到。
心态:心态也很重要,面试的时候过于紧张的话,可能八股会忘掉,脑子完全不会思考导致题也撕不出来,这一点只能建议多参加参加面试,有一个良好的心态,面试才能发挥得更好。如果面试的时候面试官一下子抛出一大堆问题,不要慌,跟面试官一条一条捋,能回答的就回答,回答不了的就抱歉。
以上就是我的总结,如果有问题的话欢迎提问。
还有些问题想问问各位大佬,一起讨论一下~
1.问到CDN的时候一般要说道什么程度呢?
2.Redis分配内存的时间复杂度?这个我也没找到答案
3.还有就是美团三面的14问?
文|牛客:.Ray