Loading

中级Java开发工程师面经(3)

面试没答好问题汇总
抽象接口和普通接口的区别,什么场景下用抽象接口
 
抽象接口是对接口的一个扩展 比如一个业务流程的功能的某一个点是无状态的,实现类实现都是不变的这个时候可以抽象出来
 
mysql存储的值区分大小写吗
 
不区分
 
怎么设计一个qps5000的系统
 
首先、从机器的角度去考虑,目前我们都是微服务化的系统架构、一般我们的机器是4核8g,按照经验一般能够承受2000qps、在机器部署这块、我们可以采用部署4台机器、每台承受个1000多的qps没有什么问题。
 
 
从数据库的角度去考虑、一般4核8g的机器能够承载2000的并发。所以数据库考虑部署一个1主二从的集群。然后写请求从主节点写入、读请求从从节点读取。强一致性的功能强制从主库写入、读取。
 
 
从缓存层面考虑、可以把一些不经常变得、查询频率高的数据缓存进redis也可以提高一些并发。
 
 
最后从代码层面、优化一些代码逻辑也是可以提高并发的。
 
 
MQ也可以流量削峰,但是适用于一些实时性不高、可以接受异步的业务。
 
 
rocketMQ和kafka的区别,同数量级的需求,为啥不选kafka
 
 
怎么实现一个阻塞队列
 
缓存穿透、缓存雪崩解决方案(忘了)
缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
 
缓存空key
 
 
布隆过滤器
 
 
加上互斥锁
 
 
缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
 
缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
 
随机给key设置过期时间
 
 
热点key永不过期
 
redis cluster集群扩容节点之后,客户端怎么感知节点扩容。
 
redis cluster集群是通过goossip协议感知各个节点的数据。
 
 
spring事务的传播行为
 
 
cglib动态代理的优点,相对于jdk动态代理
 
线程的几种状态
 
1、新建状态(New):新创建了一个线程对象。
 
 
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权,即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
 
 
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
 
 
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
 
 
5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
 
 
怎么暂停一个线程
 
 
什么情况下需要用到序列化
 
 
netty的一些组件、以及netty框架的优势
 
 
new一个对象会影响jvm运行时数据区域的哪些模块
 
 
MQ消息怎么保证顺序消费
 
千万级大表在新增索引或者添加表字段时会锁表吗?如果会锁表该如何处理?
 
停服处理、选择用户较少的时间断处理
 
 
使用换表操作:会存在数据不一致的问题(数据迁移过程中、老表被用户所更新)
 
使用pt-online-schema-change工具具体原理
 
创建一个跟原表一模一样的新表,命名方式为'_正式表名_new
 
 
使用alter语句将要变更的内容在新创建的新表上做变更,避免了对原表的alter操作
 
 
在原表中创建3个触发器,分别是insert、update和delete,主要是用于原表在往新表复制数据时,如果用户有DDL操作,触发器能够将在这期间出现的DDL操作数据也写入到新表中,确保新表的数据是最新的,不会丢失掉用户的新操作数据
 
 
按块拷贝数据到新表,拷贝过程对数据行持有S锁(读锁)
 
 
重命名,将原表重命名为老表,命名为“_正式表名_old”,将新表重命名为正式表,可通过配置决定执行完成后是否删除掉老表
 
删除3个触发器
posted @ 2022-06-23 16:07  我心如雷  阅读(41)  评论(0)    收藏  举报