共计 3383 个字符,预计需要花费 9 分钟才能阅读完成。
首发于我的博客
介绍
17 年毕业双非一本。面试抖音社区安全部门,以 java 进行面试。
字节一面
- 先进行自我介绍
- 问:数据库,中间件用了什么?答:mysql+postgres+kafka+redis
- 问:有用过 ThreadLocal 吗?应用的场景是什么?答:用过,在登录的时候记录用户的登录信息。
- 问:具体怎么实现?答:在拦截器中对 token 进行解析,而后将用户信息写入 ThreadLocal。
- 问:拦截器具体要实现哪个接口记得吗?答:不记得。
- 问:有的接口须要进行登录判断,有的不须要这个怎么解决?答:应用注解,标记不须要登录判断的接口。
- 问:ThreadLocal 原理有理解吗?答:外部是一个 Map,由线程持有,这是它线程平安的起因。ThreadLocal 与 Map 之间是弱援用,误用会造成内存透露。
- 问:为什么会造成内存透露?答:弱援用在 GC 时会被回收,因为线程还是沉闷的,还是有强援用在 Value 上,所以 value 不会被回收,然而 Map 中对应的 key 会变成 null。
- 问:什么时候去申请 key 为 null 的数据(如何防止)?答:get/set/remove(和面试官产生分歧,我保持本人印象中的内容),应用完 ThreadLocal 之后及时 remove。
- 问:线程池外围参数?答:五个,外围线程数、最大线程数、最长沉闷工夫、阻塞队列、回绝策略。
- 问:阻塞队列用过哪些,应用场景是怎么样的?答:只用过 ArrayBlockingQueue 和 PriorityBlockingQueue。
- 问:锁降级过程?答:~
- 问:遇到过线上 JVM 问题吗?答:没有
- 问:线上 JVM 配置是怎么样的?答:设置最大堆,最小堆,gc 收集器为 G1
- 问:为什么线上应用 G1?答:没想过。。。
- 问:G1 和 CMS 什么区别?答:CMS 多线程并发,采纳标记革除算法,谋求更快的 GC 速度。G1 将内存分为小块,谋求更高的回收效率。
- 问:什么时候用 G1,什么时候用 CMS?答:不分明
- 问:介绍下我的项目,和一些细节?答:。。。次要介绍一下我的项目背景和计划,而后将一下有亮点的设计,比方为何要这样设计:我有个设计就是借用了 HashMap 的链表变红黑树的阈值 8,红黑树变链表的阈值时 6 这个思维(留下肯定的缓冲空间防止频繁变动)。而后能够谈谈这个计划的有余,与改良的方向与思考。
- 问:解决热点 key 的计划?答:1. 内存缓存 2. 拆分多份
- 问:限流算法?答:窗口计数,漏桶,令牌桶(具体解释一下)
- 问:别离应用的场景?答:不分明
- 问:分布式状况下如何实现漏桶和令牌桶?答:令牌桶能够以肯定速率写到 redislist 中,而后接口上来先拿一个令牌。漏桶不晓得。
- 问:mysql 什么时候用主库,什么时候用从库?答:事务,写用主,读操作用从。因对主从复制提早,须要马上晓得的数据,应用主。
- 问:主从复制,基于什么?答:binlog,复制八股文。
- 问:主从复制有几个线程?答:这里答错了,应该是有三种线程。
- 问:主从复制模式?答:同步,半同步,异步(介绍)。
- 问:半同步是期待几个从答复?答:一个。
- 问:binlog 模式?(这里应该是想问 binlog 的格局)答:不晓得(应该是 statement,row,mixed)
- 算法:有一个递增数组,然而领有反复数字,须要原地将反复数字移到数组的前面。
比方
[10,11,11,12,12,12,13,14,15,15,15]
挪动之后
[10,11,12,13,14,15,11,12,12,15,15]
后面的局部自增有序,前面的局部,不要求递增与有序
空间复杂度要求为 O(1)
总结:这轮面试,答得不是很好,很多货色都没答上来,最初的算法也写了有二十多分钟。总得来看体现不是特地好,但还是过了面试。给我的面评大略是说,技术计划毛糙,短少领导,算法卡了挺久。
平时还是更重视积攒一些工具的应用场景。
字节二面
- 自我介绍
- 介绍我的项目(很细,各种细节,继续了半个多小时)
- 问:Redis zset 构造,底层数据结构。答:ziplist,跳表 + 字典
- 问:跳表的数据结构。答:多层的链表构造
- 问:跳表的插入过程。答:略
- 问:如何确定层数。答:抛硬币算法
- 问:为什么要用抛硬币,解决什么问题。答:应该是为了让层数散布更平衡(不确定)
- 问:抛硬币正反面概率是 50% 吗?答:不分明
- 问:跳表查问过程。答:略
- 问:数据反复怎么办。答:字典 + 跳表。score 不一样,再插入一个。值一样,更新 score
- 问:http 协定理解吗?答:理解不是特地多(跳过了)
- 问:罕用索引类型?答:聚簇索引,非聚簇索引。
- 问:非聚簇索引与聚簇索引应用阐明数据结构?答:应用 B+Tree
- 问:B+Tree 有哪些益处?答:1. 优化 IO 2. 不便范畴查问 3. 部分拜访准则
- 问:B Tree 与 B+Tree 的区别?答:B Tree 节点上存数据,IO 更多。范畴查找反对不好
- 问:非聚簇索引与聚簇索引的却别?答:非聚簇索引只存索引与主键。
- 问:ABC 三个字段联结索引,什么时候不须要回表?答:只查问 id+ABC 三个字段不须要回表
- 问:ABC 联结索引,where A and B > 2 and C =3,是否应用索引,为什么?答:A,B 能用,C 不行。最左前缀准则。(然而不会回表,c=3 会由索引下推规定判断)
- 问:原子性如何实现?答:反对 rollback,由 undolog 实现
- 问:事务开启到回滚如何实现?答:略
- 问:undolog 存的是什么?答:逻辑日志,记录改变内容
- 问:持久性如何实现?答:保障 crash-safe 能力,redolog + binlog 的二阶段提交。
- 问:如何体现?答:二阶段提交过程(略)
- 问:事务提交胜利,redolog 可能没写到磁盘吗?答:redolog 不 fsync(redo log 刷盘的三个策略)(事务没提交也可能曾经落盘)。
- 问:此时是否保证数据不丢?答:不行。
- 设计题:设计拼手气红包(并发是春晚发红包)?答:(防止反复抢、红包调配问题、超发问题)略。
- 算法:最长无反复子串
总结:这一面体现的不错,面试官问的问题根本都答上来了。给我的感觉就是,面试官及其的粗疏,粗疏到一个 redis 键的键名怎么设计都须要说分明。
字节三面
- 自我介绍
- 介绍我的项目
- 问:如何解决死锁?答:锁定资源程序,优先级保持一致。(答的不是很好)
- 问:事务管理器如何设计?答:threadlocal,aop 加 栈。在栈里保留办法的执行先后顺序。
- 问:Concurrenthashmap 做了哪些优化?答:分段锁改为 cas+ 自旋,synchronized。
- SQL 题:公司部门表与部门员工表,找出部门人数最多的部门列表(人数最多的部门可能不止一个)答:
select a.dept_id from (select dept_id,count(id) as count from dept_user group by dept_id) as a ,(select dept_id,count(id) as count from dept_user group by dept_id order by count desc limit 1) as b where a.count = b.count
- 设计题:抖音关注设计,要求:1. 判断本人是否关注对方。2. 判断对方是否关注本人。答:应用 redis 的 hash,保护本人的关注列表和粉丝列表。留神判断 大 V 是否关注本人,应用本人的粉丝类别来判断。
-
设计题:观看抖音的视频 feed 流。答:外围为 读扩散和写扩散。
- 每个用户都有一个观看列表
- 小 V 公布视频写入本人粉丝的观看列表(写扩散)
- 大 V 公布视频,粉丝从大 V 的公布列表读取数据(读扩散)
- 拉去视频流,从本人的观看列表中选取 N 个视频,而后从本人关注的大 V 中选取 M 个大 V,别离去他们的公布列表拿去一个视频。共 N + M 个视频,下发给观众。
- 问:大 V 掉粉变成小 V 过程,如何防止频繁变动?答:参考 HashMap,列表变红黑树过程,设置一个缓冲区。例如:10 万粉丝变大 V,然而要掉到 8 万粉丝一下才会变小 V。
总结:细,还是很细。然而三面关注的更多的是零碎设计。属于凑巧了,在面试前钻研过很多 feed 流的设计,而且本人自身的工作也和 feed 比拟相似,所以这面答的还不错。这面没有算法题,预计是因为太晚的缘故。
总结
三场面试,历时一个半星期,之后就是 HR 面和等着走流程发 offer。整个过程继续三个星期,最终还是拿到 offer 了。
感觉下来,这次的面试很粗疏,面试官给我的感觉很也好。感觉上一面最难,因为知识点的广度很深度都波及到了。
正文完