模拟面试

1,缓存架构?
答:讲了一下redis在项目中的具体实现
注:其实面试官想问的是多层架构
2,redsi缓存击穿,穿透,雪崩怎么解决?
答:击穿可以通过设置热key永不过期
穿透可以使用缓存空值和布隆过滤器来解决
雪崩可以通过给键设置基础时间值+随机时间值来解决
注:缓存击穿还可以还通过互斥锁进行解决(性能较低)
关于雪崩上面只说了大量key过期的问题 没有提到redis宕机
解决方法:
(1)设置多层架构
(2)建立redis主从或集群
(3)提前演练redis宕机 从而设计解决方法
3,大量不存在的用户同时登录时会给数据库造成压力,怎么解决?
答:使用redis缓存空值
注:缓存空值不能有效解决这类缓存穿透问题
这里要使用布隆过滤器进行拦截 更加有效
在实际业务开发中最好俩者结合使用
4,jwt?
答:说了一下jwt的生成和解析以及结构
5,讲讲乐观锁和悲观锁
答:讲了一遍sychronized的底层实现
从无锁->偏向锁->轻量级锁->重量级锁
这里轻量级锁就是乐观锁 重量级锁就是悲观锁
6,乐观锁和悲观锁最主要的区别?
答:在低并发场景下乐观锁性能好
在高并发场景下悲观锁性能好
注:乐观锁是认为操作的时候没有线程和我并发操作
通过cas判断 不会让你的线程挂起 可能会不断自旋去尝试获取锁
悲观锁是认为有线程和我并发操作 拿不到锁线程就会进入阻塞状态
直到拿到锁的线程释放锁后唤醒该线程
7,sychronized和reentrantlock有什么区别?
答:sychronized由jvm释放锁 reentrantlock手动释放
sychronized不可重入 reentrantlock可重入(避免死锁)
注:这里答错了sychronized可重入
他们的主要区别在于sychronized不支持公平锁,不支持超时
不可中断,不支持多条件
sychronized是java内置的关键字 reentrantlock是由juc类库所提供的
8,aop怎么理解?
这里答的太乱了不清楚
注:把那些非核心功能抽取出来封装成一个切面去掉冗余代码
通过动态代理的方式 将需要注入切面的对象进行代理
在进行调用的时候直接将公共逻辑注入
侵入性较低
1,缓存架构?
答:讲了一下redis在项目中的具体实现
注:其实面试官想问的是多层架构
2,redsi缓存击穿,穿透,雪崩怎么解决?
答:击穿可以通过设置热key永不过期
穿透可以使用缓存空值和布隆过滤器来解决
雪崩可以通过给键设置基础时间值+随机时间值来解决
注:缓存击穿还可以还通过互斥锁进行解决(性能较低)
关于雪崩上面只说了大量key过期的问题 没有提到redis宕机
解决方法:
(1)设置多层架构
(2)建立redis主从或集群
(3)提前演练redis宕机 从而设计解决方法
3,大量不存在的用户同时登录时会给数据库造成压力,怎么解决?
答:使用redis缓存空值
注:缓存空值不能有效解决这类缓存穿透问题
这里要使用布隆过滤器进行拦截 更加有效
在实际业务开发中最好俩者结合使用
4,jwt?
答:说了一下jwt的生成和解析以及结构
5,讲讲乐观锁和悲观锁
答:讲了一遍sychronized的底层实现
从无锁->偏向锁->轻量级锁->重量级锁
这里轻量级锁就是乐观锁 重量级锁就是悲观锁
6,乐观锁和悲观锁最主要的区别?
答:在低并发场景下乐观锁性能好
在高并发场景下悲观锁性能好
注:乐观锁是认为操作的时候没有线程和我并发操作
通过cas判断 不会让你的线程挂起 可能会不断自旋去尝试获取锁
悲观锁是认为有线程和我并发操作 拿不到锁线程就会进入阻塞状态
直到拿到锁的线程释放锁后唤醒该线程
7,sychronized和reentrantlock有什么区别?
答:sychronized由jvm释放锁 reentrantlock手动释放
sychronized不可重入 reentrantlock可重入(避免死锁)
注:这里答错了sychronized可重入
他们的主要区别在于sychronized不支持公平锁,不支持超时
不可中断,不支持多条件
sychronized是java内置的关键字 reentrantlock是由juc类库所提供的
8,aop怎么理解?
这里答的太乱了不清楚
注:把那些非核心功能抽取出来封装成一个切面去掉冗余代码
通过动态代理的方式 将需要注入切面的对象进行代理
在进行调用的时候直接将公共逻辑注入 侵入性较低
不想写了 直接把问题都扔出来吧
 java线程池的七个参数?
1. Java线程池,5核⼼、10最⼤、10队列,第6个任务来了是什么状态?
任务扔到⼯作队列中
2. 如果在第6个任务过来的时候,5个核⼼线程都已经空闲了呢?
⼀样扔到队列(线程池只关注数量)
3. 第16个任务来了怎么处理?
创建⾮核⼼线程去处理第16个任务
4. 第16个任务来了的时候,要是有核⼼线程空闲了呢?
如果这个空闲的线程,将⼯作队列中的10个任务,取⾛了⼀个,变为了9个,那任务扔队列。
如果空闲的线程还没来得及取⾛任务,投递时,队列⻓度依然为10,那还是创建⾮核⼼。
5. 队列满了以后执⾏队列的任务是从队列头 or 队尾取?
⼀般咱们的阻塞队列都是FIFO的,所以先进先出,从头取。
6. 核⼼线程和⾮核⼼线程执⾏结束后,谁先执⾏队列⾥的任务?
谁空闲了,并且去等待任务,谁先去执⾏队列⾥的任务。
7.为什么⾮核⼼优先执⾏投递的任务?
8.核⼼线程与⾮核⼼线程有什么区别?
9.MySQL中如何实现数据的读⼀致性?
10. MySQL的InnoDB引擎是如何通过⽇志实现事务的?
11. MySQL崩溃恢复为什么不⽤binLog?
12.Redis的事务了解吗?
13.Redis 的持久化机制?

总结:对底层的理解还是不够深入 之前没有了解过redis事务 有的时候答非所问容易跑题
#牛客AI配图神器#
全部评论
这是群友说的大一吗
1 回复 分享
发布于 05-26 22:12 广东
这么难🥹
点赞 回复 分享
发布于 05-23 18:11 天津

相关推荐

评论
1
10
分享

创作者周榜

更多
牛客网
牛客企业服务