interview大厂面试真题草录

2021-07-10

question:

  1. epoll原理
  2. redis 穿透,击穿,雪崩解决方案
  3. 多线程相关 锁
  4. 算法:二叉树的最大深度

answer:

  1. epoll原理
    周志垒视频

  2. redis 缓存穿透,缓存击穿,缓存雪崩及解决方案
    缓存穿透:
    大量查询请求进来,访问的是压根儿在缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。这种查询不存在的数据的现象我们称为缓存穿透。
    缓存穿透带来的问题:
    试想一下,如果有黑客会对你的系统进行攻击,拿一个不存在的id 去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。
    缓存穿透的解决方案:布隆过滤器;缓存空值;接口层增加校验:鉴权校验,参数校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。详见链接

    缓存击穿:
    缓存击穿是指一个Key非常热点,在不停的扛着大并发,大量的请求同时集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。这种现象我们称为缓存击穿
    缓存击穿带来的问题:
    会造成某一时刻数据库请求量过大,压力剧增。可能会导致你的数据库由于压力过大而宕掉。
    缓存击穿的解决方案:
    设置热点数据永远不过期。或者加上互斥锁搞定:多个线程同时去查询,第一个查询数据的请求用一个互斥锁来锁住它。其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存
    缓存雪崩:
    当某一时刻发生大规模的缓存失效的情况,比如在同一个时间点大量的key全部过期了或者你的缓存服务宕机了,会有大量的请求进来直接打到DB上面。结果就是DB扛不住,挂掉。这种现象我们称为缓存雪崩
    缓存雪崩带来的问题:
    大量的请求进来直接打到DB上面。结果就是DB扛不住,挂掉。
    缓存雪崩的解决方案:
    缓存的过期时间设置一个波动随机值;限流&降级;分治法:将热点数据打散分不到不同的机房中,有效缓解

    https://juejin.cn/post/6844903807797690376

  1. 多线程相关 锁
  2. 算法:二叉树的最大深度
    public int getDeep(Node node){
    if(node == null) {
    return 0;
    }
    return Math.max(getDeep(node.left), getDeep(node.right)) + 1;
    }

2021-07-12

question:

  1. redis 分布式锁的实现原理 setnx的弊端 redis分布式锁的过期时间设置方法
  2. mysql 索引方法论 幻读 间隙锁实现原理
  3. cms g1 要回收的内存花费的时间 大于指定的时间,怎么办
  4. 算法:将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。

answer:

  1. redis 分布式锁的实现原理 setnx的弊端 redis分布式锁的过期时间设置方法
    redis分布式锁的过期时间设置方法:
    redisson watch dog watch dog 如何配置
    redis做分布式锁历程中遇到的问题:1.原子性;2过期时间小于业务执行时间;3. 主从下master宕机,slave还没有master上的key,造成重复获取锁

  2. mysql 索引方法论 幻读 间隙锁实现原理
    https://stackoverflow.com/questions/26215071/rationale-behind-difference-between-unique-and-non-unique-indexes-in-mysql-innod?rq=1
    https://ningyu1.github.io/site/post/50-mysql-gap-lock/

  3. cms g1 要回收的内存花费的时间 大于指定的时间,怎么办

  4. 算法:将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。

2021-07-23

question:

  1. jvm的类加载过程
  2. redis如何实现延时队列
  3. 阻塞队列 delayQueue
  4. 线程池原理 为啥用阻塞队列,使用普通的集合不可以吗

answer:

2021-07-26

question:

  1. threadlocal hash冲突是怎么解决的
    https://www.shangmayuan.com/a/71c07f8e44f147a18cc5dd16.html
    http://www.cxyzjd.com/article/xiaoxiaodaxiake/107732928z
  1. java8 新增加的特性是哪些
  1. jvm的类加载过程

answer:

2021-08-02

question:

  1. 遇到过死锁吗,如何发现死锁
  2. spring/springboot 加载过程
  3. mysql间隙锁
  4. 双亲委派机制,哪些组件破坏了双亲委派机制
  5. 如何保证系统稳定性?事前,事中,事后
  6. 秒杀的设计,1000份,10分钟后活动结束,未付款30分钟后自动失效,从页面,从服务,从db的角度设计下
  7. 你的优势 劣势

answer:

  1. 遇到过死锁吗,如何发现死锁
    a. 死锁代码实践
    b. 死锁检测方法
    c. 避免死锁方法 顺序加锁(顺序性的进行加锁) 和 时限加锁(使用ReentrantLock.tryLook(time))
    https://juejin.cn/post/6844904100488806413#heading-10

  2. spring/springboot 加载过程

  3. mysql间隙锁
  4. 双亲委派机制,哪些组件破坏了双亲委派机制
    jdbc tomcat spring等
    为什么Tomcat要破坏双亲委派
    我们知道,Tomcat是web容器,那么一个web容器可能需要部署多个应用程序。
    不同的应用程序可能会依赖同一个第三方类库的不同版本,但是不同版本的类库中某一个类的全路径名可能是一样的。
    如多个应用都要依赖hollis.jar,但是A应用需要依赖1.0.0版本,但是B应用需要依赖1.0.1版本。这两个版本中都有一个类是com.hollis.Test.class。
    如果采用默认的双亲委派类加载机制,那么是无法加载多个相同的类。
    所以,Tomcat破坏双亲委派原则,提供隔离的机制,为每个web容器单独提供一个WebAppClassLoader加载器。
    Tomcat的类加载机制:为了实现隔离性,优先加载 Web 应用自己定义的类,所以没有遵照双亲委派的约定,每一个应用自己的类加载器——WebAppClassLoader负责加载本身的目录下的class文件,加载不到时再交给CommonClassLoader加载,这和双亲委派刚好相反。

https://zhuanlan.zhihu.com/p/343563937

  1. 如何保证系统稳定性?事前,事中,事后
  2. 秒杀的设计,1000份,10分钟后活动结束,未付款30分钟后自动失效,从页面,从服务,从db的角度设计下
  3. 你的优势 劣势

2021-08-07

question and answer:

海量数据

  1. 100G的文件,每行是一个字符串,找出重复数最多的行
    步骤一:分而治之:分成1000个文件,每个文件存放的数据:hash(每个字符串)%1000,这样既保证了相同的字符串被存放到一个文件中。又把大文件分成了1000个相对小的文件中
    步骤二:HashMap统计:统计每个相同字符串的个数,HashMap<str_hash, count>
    步骤三:快速排序/堆排序:把1000中每个HashMap的最大count那个再组合到一个HashMap中,对count使用快速排期/堆排序,找到目标数据

https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/06.02.html
https://segmentfault.com/a/1190000021109127

1G = 1000m = 1000 1000KB = 1000 1000 * 1000B

2021-08-07

question:

  1. 操作系统:拔网线和kill -9, 服务端的异常是啥样的
  2. 如何设计一个100万用户的聊天系统
  3. 操作系统为啥有父进程和子进程
  4. 一个服务器支持的最大连接数,长链接
  5. 带人注重的是哪些方面

2021-08-10

question and answer:

  1. mysql
    学生表:student(学号,学生姓名,出生年月,性别)
    成绩表:score(学号,课程号,成绩)
    课程表:course(课程号,课程名称,教师号)

    1.查询平均成绩大于60分学生的学号和平均成绩
    2.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
    3.查询两门以上课程成绩小于60分的学生的学号及其平均成绩

    1. select 学号,avg(成绩) as avgScore from score group by 学号 having avgScore > 60;

    2. select * from
      (select avg(成绩) as avgScore, 课程号 from score group by 课程号)
      t_table order by avgScore, 课程号 desc

      // select * from score as sc JOIN student st ON as.学号 = st.学号

    3. select 学号, avg(成绩) from score where 学号 in (
      select 学号 from
      (select 学号, count(课程号) 课程号count from score where 成绩 < 60 group by 学号 having 课程号count > 2)
      t_table
      ) group by 学号
  2. mysql事务隔离级别,每个级别对应的问题:脏读,不可重复度,幻读,间隙锁的实现原理

  3. 两个栈实现一个队列

2021-08-11

question:

  1. java锁
    1.1 synchronized锁能降级吗
    1.2 condition实现原理
    1.3 reentantlock 是乐观锁吗
    1.4 锁能降级吗,ReentantReadWriteLock的实现原理,适用场景
    1.5 Lock能被中断吗 synchronized能被中断吗
    1.6 synchronized和Lock分别适用什么样的场景
    spring定时任务的底层队列是什么
    代码规范
    mysql联合索引的生效问题
    kafka提高consumer吞吐量
    redis
    集群下一组一个master和两个slave挂了, redis还能提供服务吗
    高并发下redis和数据库的强一致如何保证
    接口鉴权
    服务c只让a服务访问,不让b服务访问,每次请求生成一个key?
    Nio是异步阻塞

answer:

  1. java锁
    1.1 synchronized的实现原理,升级过程
    1.2 condition实现原理
    https://www.cnblogs.com/bendantuohai/p/4738792.html

    1.3 reentantlock 是乐观锁吗
    1.4 锁能降级吗,ReentantReadWriteLock的实现原理,适用场景
    https://zhuanlan.zhihu.com/p/136884541
    https://zhuanlan.zhihu.com/p/138274427

    ReentantReadWriteLock使用实例:
    https://bestzuo.cn/posts/1665595927.html

    1.5 Lock能被中断吗 synchronized能被中断吗
    Lock相较于Synchronized优势如下:
    可中断获取锁:使用synchronized关键字获取锁的时候,如果线程没有获取到被阻塞了,那么这个时候该线程是不响应中断(interrupt)的,而使用Lock.lockInterruptibly()获取锁时被中断,线程将抛出中断异常。
    可非阻塞获取锁:使用synchronized关键字获取锁时,如果没有成功获取,只有被阻塞,而使用Lock.tryLock()获取锁时,如果没有获取成功也不会阻塞而是直接返回false。
    可限定获取锁的超时时间:使用Lock.tryLock(long time, TimeUnit unit)。
    同一个所对象上可以有多个等待队列(Conditin,类似于Object.wait(),支持公平锁模式)
    1.6 synchronized和Lock分别适用什么样的场景

    整体参考:
    https://tech.youzan.com/javasuo-de-na-xie-shi-er/
    https://jishuin.proginn.com/p/763bfbd345d9

  2. spring定时任务的底层队列是什么 堆排序数据结构的优先队列

  3. 代码规范
  4. mysql联合索引的生效问题
  5. kafka提高consumer吞吐量
  6. redis
    集群下一组一个master和两个slave挂了,redis还能提供服务吗
  7. 高并发下redis和数据库的强一致如何保证
  8. 接口鉴权
    服务c只让a服务访问,不让b服务访问,每次请求生成一个key?
  9. Nio是异步阻塞

synchronized锁升级过程 jvm debug

2021-08-12

question:

  1. springboot 三级缓存 循环依赖
  2. 锁 reentantLock实现原理 AQS,锁升级过程
  3. kafka offset存在哪里,为啥用kafka不是其他消息组件,他最大能支持多少并发,如何保证消息的可靠的
  4. mysql 事务是如何实现的,实现原理(redo undo),回滚时是怎么个操作流程,
  5. ConcurrentHashMap是如何做到线程安全的,他的数据结构是什么

answer:

  1. springboot 三级缓存 循环依赖
    https://www.cnblogs.com/grey-wolf/p/13034371.html#_label10_0
    https://cloud.tencent.com/developer/article/1497692
    https://juejin.cn/post/6882266649509298189

  2. 锁 reentantLock实现原理 AQS,锁升级过程

  3. kafka offset存在哪里,为啥用kafka不是其他消息组件,他最大能支持多少并发,如何保证消息的可靠的
  4. mysql 事务是如何实现的,实现原理(redo undo),回滚时是怎么个操作流程,
  5. ConcurrentHashMap是如何做到线程安全的,他的数据结构是什么
    CAS + synchronized

2021-08-16

如何准备系统设计面试?
如何设计一个 RPC 框架?
如何设计微博 Feed 流/信息流系统?
如何解决网站大文件上传问题?
如何设计一个排行榜?
如何设计站内消息系统?
如何设计一个秒杀系统?

面试的时候,大家都是怎么回答“请简单介绍一下你做的这个项目”的?

1、项目背景

为什么要做这个项目,让完全陌生的面试官能知道大概是干嘛的,需要有逻辑,条理清晰,说白了就是讲背景和概况

2、项目模块和业务介绍

看情况大致讲一下项目整体或者举例几个项目的业务流程和功能讲解

3、职责和产出

你负责了部分还是全部,花了多久,做了什么努力,遇到了什么问题,如何去解决,最后取得了什么效益

注意:讲的过程中注意观察面试官,如果有明显看出来不耐烦的不能太过于啰嗦,一定要抓重点讲,提前组织好框架,比如上述的1点2点3点,切记不要死记硬背全文朗诵

2021-08-12

question:

  1. 线程池
    核心线程何时销毁
    线程池设置多少合适呢 cpu密集型的设置多少,io密集型的设置多少
  2. synchronized 和 lock的区别,多线程竞争激烈时哪个效率高;如何决定何时使用哪个
  3. mysql
    B+树相比平衡树和红黑树的优势;
    查询第100万那条记录的时候,为啥比较慢(比查第一条慢)
    10万数据时,B+数是多少层
  4. threadlocal的key是啥
    threadlocal的key是啥
  5. 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
    子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
    示例 1:
    输入:nums = [10,9,2,5,3,7,101,18]
    输出:4
    解释:最长递增子序列是 [2,3,7,101],因此长度为 4。
    示例 2:
    输入:nums = [0,1,0,3,2,3]
    输出:4
    示例 3:
    输入:nums = [7,7,7,7,7,7,7]
    输出:1

Answer:

  1. 线程池
    -> 核心线程何时销毁
    -> 线程池设置多少合适呢 cpu密集型的设置多少,io密集型的设置多少
    CPU密集型程序: CPU 核数(逻辑)+ 1 个线程数
    I/O 密集型程序: 最佳线程数 = CPU核心数(1/CPU利用率) = CPU核心数(IO耗时/CPU耗时)
    我怎么知道具体的 I/O耗时和CPU耗时呢?
    怎么查看CPU利用率?
    APM(SkyWalking CAT zipkin)工具可以帮我们得到准确的数据,学会使用这类工具,也就可以结合理论,在调优的过程得到更优的线程个数了。

  2. synchronized 和 lock的区别,多线程竞争激烈时哪个效率高;如何决定何时使用哪个

  3. mysql
    B+树相比平衡树和红黑树的优势;
    查询第100万那条记录的时候,为啥比较慢(比查第一条慢)
    10万数据时,B+数是多少层

  4. threadlocal的key是啥
    threadlocal的key是啥
  5. 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

2021-08-12

question and answer:

  1. redis key过期策略和内存淘汰策略
    https://juejin.cn/post/6869396128228442119#heading-22

  2. eureka的机制,如何做到eureka高可用
    心跳注册:
    服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

    保护模式:
    当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last min),当Renews(last min)(最后一分钟收到的心跳数)小于Renews threshold(心跳阈值)的时候,如果某个服务实例宕机掉,触发保护机制

    Renews threshold:Eureka Server 期望每分钟收到客户端实例续约的总数。
    Renews (last min):Eureka Server 最后 1 分钟收到客户端实例续约的总数。

    实际上,该警告就是触发了Eureka Server的自我保护机制,服务注册到Eureka Server之后,会维护个心跳连接, 告诉Eureka Server自己还活着。Eureka Server在运行期间,会统计客户端节点的心跳失败的比例在最后一分钟之内是否低于85%如果出现低于的情况,如果低于85%,那就触发自我保护机制,

    参考:
    https://www.infoq.cn/article/jldjq*3wtn2pcqtdyokh
    https://tech.yangqianguan.com/607d1e7ece7094706059f124/
    https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html

  3. mysql主从的实现方式,哪些方式
    https://www.cnblogs.com/rickiyang/p/13856388.html

  4. oom发生的场景和java命令查看oom的方法
    总结起来是四个区域:堆,栈,matespace,堆外
    https://cloud.tencent.com/developer/article/1730910
    https://xie.infoq.cn/article/74d7449272c21dd9f8d706957

    内存泄漏的例子和检测方式
    参见<java技术栈知识点草集> 之 jvm 发生的场景和java命令查看oom的方法

  5. 给定一个二叉树的 根节点 root,想象自己站在它的右侧,
    按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
    输入: [1,2,3,null,5,null,4]
    输出: [1,3,4]

LC199 二叉树的右视图:https://leetcode-cn.com/problems/binary-tree-right-side-view

2021-09-02

question and answer:

  1. 单例(懒汉模式+线程安全)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Singleton {
    volatile private Singleton instance;

    private Singleton(){}

    public static Singleton gegSingleton() {
    if(instance == null) {
    synchronized(Singleton.class) {
    if(instance == null) {
    instance = new Singleton();lx

    }
    }
    }

    return instance;
    }
    }
  2. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

LC236 二叉树的最近公共祖先 ttps://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

2021-09-07

question and answer

  1. 延迟队列实现

  2. redis cluster的原理

  3. redis hotkey如何解决,超高的qps 写操作

  4. redis zset 底层的数据结构是什么
    跳跃表和堆排序的区别是什么

  5. 算法 - 动态规划

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输入:m = 3, n = 7
输出:28

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

输入:m = 7, n = 3
输出:28

输入:m = 3, n = 3
输出:6

2021-09-07

question and answer

标题
n 个倒序的链表找 top k

题目描述
input:​
7->6->3->2->1​
6->4->2​
5->3->2->1​

k=4​

output:7,6,6,5

1.需求讨论及技术方案设计
2.核心项目搭建、服务架构迭代
3.项目攻关带队,多部门协作
4.设计基础组件研发提效
5.团队事务管理建设、任务分配

2022-06-15

question and answer

  1. 你们那微服务是怎么划分的

  2. 高性能

超高瞬时点赞 收藏如何解决

  1. 高并发

写高并发

读高并发

2022-06-16

question and answer

  1. mysql 写多读少场景,更新一条语句时,条件中唯一索引和普通索引哪个选择更好的,为什么

本质想问的是 mysql change buffer
https://www.modb.pro/db/50671

关联知识点 mysql buffer pool

  1. 如何从一个无序数组中求出第 K 大的数