本人工作 6 年多,最近一份工作在一家知名的二手车公司。近期我面试了 4 家二线大厂:陌陌、猎豹移动、映客和作业帮。
下面分享一下面试经验,希望对大家有所帮助。分享之前,先谈两点感受:
1、面试后端岗位,要准备的知识点很多:常规算法、编程语言、常用框架、数据库、主流中间件、以及项目中具体问题的解决方案。原理知识和实战经验都不能忽视。
2、充足的准备很重要,尤其对于很久没有面试的同学,可以先找几家小公司练练手,等找到面试感觉后,再投心仪的公司,要注意把控好整体节奏。
第一家:陌陌
1、说一下 MySQL InnoDB 的索引原理是什么?B+ Tree 索引的优势是什么?使用索引查询时,它的完整流程是什么样的?
2、是否做过分库分表?如果数据量很大了,你会怎么设计分表方案?
3、平时项目中,MySQL 单表的数据量有多大?访问量如何?如果碰到性能问题,你会怎么优化?联表查询的隐患是什么?都有哪些优化方案呢?
4、实际项目中,redis 都用在了哪些场景?能说下 Redis 基本的数据结构以及适用场景吗?
5、Redis 和 Zookeeper 分别是如何实现分布式锁的?优缺点各是什么?
6、目前线上业务的 Redis 使用了什么部署架构?了解哨兵是如何保证 Redis 高可用的吗?知道哨兵架构下 Master 节点的选举流程吗?
7、是否了解过 Nginx?Nginx 的负载均衡方式有哪些?是如何配置的?
8、谈一下你在项目中做得比较出彩的地方?
9、系统设计题:假设现在有一个陌陌群,有人发了一个群红包,群里面有100 个人去抢这个红包,请从存储以及业务流程角度简述一下实现方案。
陌陌这边比较关注:项目过程中你是否会主动思考,高并发的实践经验,线上问题的解决能力,同时对运维和架构知识有一定要求。
第二家:猎豹移动
1、简历上提到有做过接口性能优化,能谈谈具体是怎么做的吗?
2、简述下一个 HTTP 请求,从发起请求开始到响应的大概流程。
3、平时项目中 MySQL 用的哪种存储引擎?InnoDB 和 MYISAM 的区别是什么?事务的四个特性分别是什么?MVCC 的作用是什么?
4、清楚 MySQL 的架构吗?简述一条查询 SQL 的完整执行流程?在上述执行流程中,提示 SQL 语法错误发生在哪个环节?表字段不存在发生在哪个环节?
5、有一张 USER 表,表中有 id、name 、age、sex、login_time 五个字段。
问题1:需要查询男性用户在某个时间段内的登录情况,请问索引该如何建立?
问题2:现在有一个联合索引 (sex、login_time、age),下面这条 SQL 语句 where sex in (1,2) and login_time between 1 and 10 and age > 20 能否用到这个联合索引,为什么?
6、实际项目中,你接触过的最大数据量是多少?分库分表你们是怎么做的?什么情况下会选择分库,什么情况下又会选择分表?
7、能谈一下项目中的异常处理机制吗?你们是怎么设计的?
8、项目中有用过消息队列吗?具体是什么场景?对消息队列的原理了解多少?
猎豹移动对 MySQL 知识的掌握程度有一定要求,同时比较看重实战经验。
第三家:映客
1、看你简历当中提到有做过 SQL 优化,能谈一下具体的优化方案吗?
2、假设一个场景:某个接口的并发量很高,如果此时缓存失效,那么将会出现非常多的请求击穿缓存去访问数据库,你会如何处理?
3、介绍下 Redis 分布式锁具体解决了项目中的什么问题?请解释下 setnx 为什么是一个原子性的命令?
4、对 Redis 的底层数据结构是否有过了解?请简单介绍其中的一到两种
5、怎么解决 Redis 里面的大 Key 问题?
6、介绍下 MySQL InnoDB 引擎的索引原理,主键索引和非主键索引有什么区别?什么情况下可以避免回表?
7、我们在写业务代码时,一般尽量少用子查询,原因是什么?
8、介绍下 MySQL 主从之间的数据同步原理
9、Kafka 里面的 Consumer、Broker、Partition,三者之间的关系是什么?
10、订单服务调用库存服务扣减库存,怎么保证数据一致性?
11、如何设计一个延时队列?
12、在数据量以及并发都非常大的情况下,如果要你开发一个点赞接口,你会如何设计?
映客比较注重原理知识,对于中间件关注也很多,同时需要候选人对服务的稳定性有较多的考虑。
第四家:作业帮
1、手撕算法题:从两个有序数组中选出两个数,求最小差值(差值取绝对值),分别说出算法的时间复杂度和空间复杂度,如何优化算法至 O(1) 的空间复杂度和 O(n) 时间复杂度?
2、使用 explain 分析 SQL 的执行计划时,主要关注哪些字段?type 字段的主要类型有哪些?
3、有一张人员信息表,表里面有 name、age、sex 等字段,现在需要以上述三个字段作为查询条件,如果你来设计联合索引,各字段的顺序应该怎么放?原因是什么?
4、MySQL 索引的底层存储结构是什么样?有什么特点?
5、Redis 分布式锁的 key 以及过期时间该怎么设置?如果业务执行时间超过了设置的过期时间,又该怎么办?
6、Redis 是分布式的吗?Redis 对于过期 key 是怎么处理的?
7、你们的四层负载均衡使用的是什么?谈一谈 Nginx 的进程模型?
因为作业帮的数据量级比较大,对基础算法以及性能调优比较关注。
面试感想
这次面试,其实暴露了自己长期以来都做得不好的两点:首先,平时工作过程中缺少主动思考;其次,对于线上服务的部署情况、架构细节了解也不多。
最大的收获是:在做好 CRUD 的同时,一定要多思考和总结,关注原理知识、关注接口的性能和可用性,只有这样才能在日积月累中不断提升自己,面试时也会更加游刃有余,否则就只能日复一日地做着 CRUD 的工作。
最后,也祝愿大家能收获自己满意的 offer,在技术路上越走越远!