字节面经(3+3)
去年秋招期间,因为没有实习经历,结果十分惨淡,收到的面试寥寥无几,基本都是简历挂。于是在8月份转变了思路,直接投字节实习,果真收到了面试,第一次面字节,闯到了第三轮技术面,被挂了。后面被字节另外一个部门捞了,最终顺利拿到了字节offer,也是凭借字节的这份实习经历,在今年2月敲开了几家大厂的大门,获得了面试机会。当时记录了一些面经,想发出来回馈给牛客,毕竟我的校招之路都有牛客的陪伴,牛客记录了我求职过程中的喜怒哀乐。
抖音开放平台一面(8.17)50min:
1 自我介绍(详细介绍项目)
2 项目中Redis怎么用的(缓存,分布式锁)
3 Redis分布式锁的具体用法,如何实现的,加锁(加唯一标识,设置过期时间,保证原子性)具体命令,解锁(读取,判断和del),还知道可以用哪些来实现分布式锁
4 Rocketmq的事务消息的执行流程,详细说一下
5 项目中如何解决消息重复消费的,具体说一下
6 项目中的令牌大闸如何实现的,令牌桶算法
7 还知道哪些限流算法(说了漏桶算法),漏桶算法和令牌桶算法的区别?
8 项目为什么选令牌桶算法不选漏桶算法?
9 令牌桶算法是自己实现的还是用的组件,令牌桶算法如何保证不会单击TPS在某一刻超出系统承受能力(没答出来)
10 Redis有哪些优势,为什么它应用这么广泛,为什么适合做缓存
11 Redis数据类型,经典的应用场景?
12 Redis的有序集合的底层实现原理(说了跳表,还不够,面试官还问了另外一种实现,没答出来)
13 Redis的哈希扩容流程(说了渐进式reHash,追问为什么要这么用)
14 Redis的持久化机制(AOF和RDB,区别,应用场景,AOF的缺点,RDB的缺点)
15 MySQL的两阶段提交(具体讲解,如果中间几个阶段分别崩溃怎么办)
16 redo log和bin log的用途,区别
17 MySQL索引数据结构,为什么不用二叉查找树,为什么不用B树,B+树和B树的区别
18 事务的持久性如何保证(redo log 和bin log)
19 事务的隔离性如何保证(MVCC+锁,分别讲实现原理,还有间隙锁)
20 MVCC的如何判断行记录对某一个事务是否可见
21 MVCC在四种隔离级别中如何实现(讲了只能在RC和RR下实现,追问RC和RR两者实现的区别)
22 RR解决了什么问题,有没有解决幻读,MySQL默认隔离级别是什么,各大企业通常采用什么隔离级别,为什么
23 HTTPS 的加密过程
24 Java垃圾回收(说了可达性分析算法,分代回收,标记复制,标记整理和标记清除…)
25 LC209 (ACM模式)
26 反问
抖音开放平台二面(8.22) 75min:
1 项目中的技术难点,怎么解决?
2 项目中使用Redis分布式锁就可以解决超卖问题吗?
3 Redis分布式锁如何实现(说了三个点,设置过期时间,保证设置锁和过期时间的原子性,保证锁的值的唯一性),释放锁呢(先判断,再释放,同样需要保证原子性)
4 这样设置分布式锁有什么问题吗(单个Redis宕机,则锁失效。为了提升锁的可靠性,Redis集群部署分布式锁,RedLock算法)
5 Redis的扩容过程(reHash详细流程),Redis进行reHash时,客户端对Redis进行读操作,此时查找的流程是怎样的(再次多看,两次面试都问到了,第一次没回答好,只知道是渐近式reHash,具体过程不知道。应该是一面面试官知道我在糊弄,写在面评上来了,二面面试官上来就问。)
6 MySQL前缀索引,最左匹配原则,联合索引底层怎么放的,还举了几个例子考察我会不会走索引
7 Kafka的 reBalance, raft算法(不会,崩),consumer和partition的对应关系(单播消息,多播消息)
8 Kafka的高可靠性如何保证(说了副本冗余机制,详细介绍broke和partition中leader与follower之间的关系)
9 Kafka的滚动策略(完全不知道是什么,崩),面试官说看得出来我有在认真准备面试,但是有些点还是没有覆盖到
10 Kafka 的零拷贝,详细说一下(从操作系统层面说)
11 MySQL的关键字 in 和 or 的区别(没说好,真的不知道怎么说,感觉底层不同,从走索引角度?被面试官diss说不清楚,崩)
in 与 or 的区别主要为执行效率方面:
in 或 or 在字段有添加索引的情况下,查询很快,两者查询速度没有什么区别;
in 或 or 在字段没有添加索引的情况下,所连接的字段越多(1 or 2 or 3 or 4 or …),or 比 in
的查询效率低很多
SELECT * FROM tbName WHERE KEY IN (a1, a2, ...... , an);
in 先将 a1, a2, …, an 变成二叉搜索树,用过二叉树查找,时间复杂度为O(LogN);
SELECT * FROM tbName WHERE KEY = a1 OR KEY = a2 OR ...... OR KEY = an;
or 是从 a1 匹配,匹配失败,去匹配 a2,直到匹配成功或者一个都匹配不上,时间复杂度是 O(N);
12 MySQL为什么要用redo log?(缓冲区刷盘不是每次一点改动就立即执行的,为了执行性能高,会将多次改动结果一起刷盘,为了防止还没刷盘时MySQL宕机导致数据丢失,所以用了redo log,将改动同时写在redo log)
追问redo log也是磁盘中的文件,也要写盘,为什么性能会提高(顺序写和随机写)
追问为什么不用bin log来实现崩溃恢复(说了redo log的环形结构,刷盘指针和写日志的指针记录位置)
13 如何设置一个秒杀系统(说了Redis缓存预热库存,在Redis中扣减库存,分布式锁保证查库存和扣减库存的原子性,同时用分布式事务消息保证MySQL与Redis的库存一致性,限流算法,页面静态化减轻服务器压力)
14 令牌桶算法,还知道哪些限流算法,详细说下,两种算法的区别和适用场景
15 给我刚刚设计的秒杀系统加点料,秒杀一个商品,要求立即返回商品编号,而不是简单扣减库存(这个真的崩溃,因为我设置的秒杀系统扣减MySQL库存是异步执行的,现在要求返回秒杀成功后立即给用户一个反馈秒杀的商品的编号是多少,这就成了同步,但又要保证原来的异步的性能,提到把商品编号加入到Redis,说了对同步调用和异步调用的思考)
追问具体如何设置 到Redis中(回答用Redis的hash数据类型,给请求编码,requestId,作为redis的hash类型的键,商品编号作为值,完全乱扯。。)
再次被追问存到Redis中如何解决 请求的公平性(请求先到先秒杀成功)(不会,被面试官diss我紧张过度)
16 算法 二叉树路径和(自己建树)(秒了)
实现千位分隔符(这边因为紧张,加上对字符串的插入和删除的api不熟悉,卡在字符串那里了,面试官让我换一个思路,不一定要用字符串)
然后慌了,没搞出来,被diss脑筋太死了,重要的是解决问题,没限制时间复杂度,然后跟我说可以用数组,队列都行。然后扯了好大一堆,就因为字符串API不熟悉这么点小问题就把我拦住了,没有解决问题的能力,其实有很多思路。重要的是解决问题,方法不计。。。然后这边心态是真的彻底崩了。面试官说了很多安慰的话,看得出来我是紧张过度才没写出来easy题目,从我前一道算法题看得出我写代码速度没问题。。。
17 最近看什么书(不一定要是技术类),具体讲了什么(因为某些原因答得稀烂,然后被面试官教育了一翻,说这题答得不行,主要为了考察沟通能力和记忆力,我连最近看的书的内容都不能很好的讲出来。然后谈看这些书是出于兴趣,但总要留下些什么)
18 反问(问了面试官两个问题,面试官很耐心的解答,收获颇多)
目前为止收获最大的一场面试,对面试官佩服至极,真的是技术大牛。还学到了很多方法论。
抖音开放平台三面(8.25)55min(三面挂)
问了40分钟项目。。。把项目问了个底朝天。。。。
1 问项目背景,是不是自己练手做的,是自己一个人实现的后端吗,时间如何安排的,项目部署过吗,具体做了些什么
2 扣减库存时MySQL行锁遇到过吗,没优化前QPS是多少?
3 用的什么压测工具?压的时候考虑的是单个商品的扣减库存还是整个系统的?为什么不压测整个系统的(属实没考虑到)
4 你觉得单商品QPS达到多少是可以达到要求,你做项目前预期是多少?
5 你这个秒杀的TPS是指什么,是指从接口层面压测然后扣减Redis库存和Rocketmq发消息扣减库存这一系列流程吗?
6 我理解你这个TPS到了这么多,Rocketmq端肯定是会有消息积压的,你这个消息积压量大概是多少(没考虑到,崩)?
7 你知道消息队列会有消息积压的问题吗(知道,消费消息的速度赶不上生产消息的速度)
RocketMQ单机也可支持亿级的消息积压能力,500个线程,1200次循环,60万条消息,即使消费者消费消息过慢,也不会产生消息积压问题。
8 Redis中扣减库存很快,而MySQL扣减库存很慢,你知道这会产生消息积压的问题吧,你遇到会如何解决呢?(考虑并发度,前端限流)
追问 除了前端限流之外,消费端能做什么呢,写MySQL还是很慢,有什么其他的方法吗(乱说一弃,崩)
9 在优化之前是用MySQL扣减库存吧,那个sql如何写扣减保证不会超卖 (先查再扣,保证事务,写sql)
追问还有其他方法吗,可以不用合并这两个操作为一个事务吗,如何写sql?
10 你如何对项目进行优化(答了两个点:1 把扣减库存和回补库存操作 改成了 查询库存和扣减库存,并用Redis分布式锁保证原子性)
2 在消费者端实现消息幂等,防止消息被重复消费导致MySQL和Redis的库存不一致。
追问具体流程,说了很久(看样子面试官听明白了)
11 那按照你说的你本地事务在Redis中扣减库存时,还是会涉及MySQL写操作(插入流水号),那性能又是如何提升的呢?你觉得会和你原来扣减库存时遇到行锁一样有瓶颈吗(不会)?为什么呢?
(流水号的主键是uuid,是可以多线程插入行记录,而原来用行锁扣减库存只能单线程执行)
12 你觉得你现在做了这么多优化,还有哪些点未来是可以继续优化的(我都已经说了两个优化的点了,还让我继续优化。)
(说了下单未支付可以考虑回补库存,延时消息实现)
13 Rocketmq延时消息原理?(不会,寄)
14 项目中有遇到啥问题,怎么排查的?(扯了很多,被追问很多)
15 你项目中用到了分布式锁,分布式事务消息,看你还解决了分布式session,那你说说分布式id的生成吧(真的没了解,只知道听说过这个东西)
16 项目用的java是吧,SpringBoot开发的好处是什么,你对比一下Spring说说看?
17 SpringBoot自动装配?SpringBoot starter 如何实现?SpringBoot源码,Spring源码?(没看过)那你看过哪些源码?(JUC.lock的源码)
18 Java的可重入锁是怎么实现的,你从源码角度说一下,怎么就可重入了
19 Java中多个线程如何通信?(synchronized,wait和notify搭配使用,lock,await和notifyAll搭配使用。需要详细展开讲讲)
20 Thread类中有三个方法join,yiled和sleep,说说这三个方法的区别?
21 sleep和Object的wait的区别(从synchronized的角度回答,wait只能和它搭配使用,并且调用后释放锁,sleep则不会释放锁)
22 Java线程池?ThreadPoolExcutor? 线程池的执行流程?
23 你项目中用了很多MQ,如何保证不会丢失消息(生产者:事务消息;broker:同步刷盘,主从部署集群;consumer:至少一次消费原则,消费失败重试)
24 可是同步刷盘性能很低呀,那怎么保证效率呢,你觉得各大公司怎么做的?
25 长短链接问题(如何把长链接变成短链接,但访问的资源不变,后端如何做?),寄
26 你觉得你做了这两个的项目收获了什么,获得了什么成长
27 你觉得你这个项目中有没有做的不好的地方呢?
28 个人职业规划?
29 设计模式了解哪些(单例,模板方法模式)
30 详细说下单例模式(饿汉式,懒汉式,线程安全和内存浪费问题)
31 反问 ,你有什么想了解的吗?
tiktok直播一面(9.6 75min)
1 介绍项目,为什么用分布式锁,这样做会有什么问题(不如直接使用lua脚本解决原子性问题)
2 为什么前一个项目用Kafka,后一个项目用Rocketmq
3 如何保证Redis和MySQL数据的一致性,事务消息的具体流程是什么
4 为什么要用令牌桶算法,你还知道哪些限流算法,区别
5 如果给你一个分布式系统,要求你限流,你怎么做,如何优化
6 Java线程池的工作原理
7 Java线程池是如何销毁线程的,如果是你,你怎么设计
8 线程池的好处,为什么要使用线程池
9 Java垃圾回收,如何解决跨代引用问题的(忘了),如果让你设计,你如何做
10 Java中的锁说一下,lock和synchronized的使用方面的区别,lock和synchronized在锁的灵活性方面的区别
11 volatile关键字详细说一下
12 在网址中输入url,说下过程,各层都发生了什么,详细点
13 常见排序算法的时间复杂度说一下
14 归并排序复杂度为什么是nlogn,让你合并多个大小为n的数组,你如何做(具体点),逐个合并会有什么问题
15 项目中压测如何做的,秒杀流程是怎样的
16 项目中整个限流过程是怎样的
17 如果你没有库存信息,你如何设置令牌的初值,让你的QPS和令牌数完美搭配起来
18 java线程的资源都有哪些,线程栈的大小大致在多少
19 有没有遇到过栈溢出的异常,为什么无限递归会造成栈溢出
20 算法题:树的子结构
21 代码题:两个线程交替打印A和B
tiktok直播二面 9.9 45min
1 介绍数据库索引
2 为什么把二叉查找树变成多路平衡查找树就能减少磁盘IO?为什么树的高度决定了磁盘的IO次数 ?如果查找某一个数据,用二叉查找树和用B+树的时间复杂度分别是多少?
3 B+树的叶子结点的默认大小是多少?如果把B树的非叶子结点只存放指针,那B树是不是就和B+树一样了呢
4 除了二叉树,B+树,B树这些索引,还有什么常见的存储数据结构适合做索引呢?
5 为什么InnoDB不用哈希做索引,用哈希和用B+树有什么区别?
6 Redis里面有序集合用的索引?介绍一下跳跃表,与哈希的区别?
7 MySQL事务隔离级别有哪些,会产生哪些问题,MySQL默认的隔离级别是什么
8 MySQL如何实现可重复读?MVCC的底层原理?
9 看你用过Rocketmq,也用过Kafka,那你说一下这两者不一样的地方?或者设计上有哪些不一样?
10 为什么你认为Rocketmq的可靠性比Kafka好?(跟面试掰扯很久,被驳回)
11 Rocketmq消费消息失败了之后,是如何保证消息不丢失的呢
12 那kafka也可以按照Rocketmq这样做呀,为什么kafka可靠性就不如Rocketmq高呢
13 Kafka和Rocketmq除了你说的这些区别,还有什么区别?(底层存储消息的方式)
14 说说两者底层存储消息方式的区别(Rocketmq把所有消息存到一个文件中,每个队列有索引标注,kafka的消息是分区存放)
15 为什么这两者要这么设计(Rocketmq磁盘顺序写,Kafka磁盘随机写,前者性能更高)
被追问Rcoketmq虽然是顺序写,但是也带来了随机读的问题,为什么这么设计
16 Redis如何实现高可用和高可靠的?
17 Redis的主从复制是同步的还是异步的?异步和同步的优缺点?
18 了解go吗,说说协程,为什么要用协程?
19 为什么多线程访问共享资源需要加锁处理?
20 说说可见性,为什么一个线程看不到另外一个线程的修改
21 volatile 如何实现可见性呢?
22 让你设计一个任务调度器的类,add一个task,指定这个task的执行时间,可以add很多任务,但每个task执行的时间又各不相同,你如何实现,用什么数据结构?(优先队列,分数为时间戳,队头为最先执行的任务,队尾是最后执行的任务)
23 优先队列的实现原理
24 算法题:二叉树的完全性检验
tiktok直播三面(9.20)
主要问题
1 课程相关
2 项目相关
3 设计相关 点赞问题引出
对相关组件的应用能力,对问题的解决方案,具体设计
用Redis的set和string分别存用户id和点赞总数,达成显示点赞总数的目的,同时set可以保证点赞只能一次,重复点赞会取消,还能显示点赞人的信息。为什么用Redis,出于性能考虑,并且天然的数据结构很适合应用。string和set是两个操作,引出原子性问题,redis如何保证原子性?分布式锁和lua脚本。问Redis的热key问题,本地缓存(hashmap等)解决,问削峰限流问题,引出消息队列解决。问验证码存储问题,引出session,采用Redis优化解决。
4 问前面一二轮面试的复盘,再给次机会再答一次
5 算法题 大数相加(字符串可以是负整数,也可以是正整数,不能用API直接将字符串转成整数)
#字节跳动面经#