面试题
Java
线程有几种创建方式?
- 继承自Thread
- 实现Runnable
- 实现CallBack
线程的状态都有哪些?怎么转换?
- 新建
- 就绪
- 执行
- 阻塞
- 结束
线程池的核心参数?
- coreThreadPollSize
- maxiumThreadPoolSize
- wokerQueueSize
- keepaliveTime
线程拒绝策略?
newFixed固定线程池的拒绝策略是哪个?
AbordPolicy 抛异常处理
讲一下JVM的内存模型?
String 与new String()上的一个异同?
String、StringBuilder、StringBuffered区别以及使用场景?
synchornized原理?
最底层源于操作系统上指令lock comexh
不存在竞争时,对资源进行加偏向锁(即对象头加偏向锁信息),多线程进行资源竞争时,线程通过CAS进行自旋处理,此时加的是一个自旋锁。自旋一定次数之后,线程还是得不到执行,此时,将升级为OS锁,由OS进行调度。
volitate原理?
- 禁止指令重排序
- 线程可见性,线程修改值之后立马同步到主内存之中,其他线程立即感知
ThreadLocal使用的原则?
线程变量。使用时需要注意可能会产生内存泄漏(虽然是弱引用)
类加载机制是怎么样的?主要有哪些步骤?
加载 -> 链接 ->初始化
-
加载:将.class文件加载成为Class对象
-
链接
- 验证:校验文件是否符合规范,安全性验证
- 准备:为静态变量开辟空间,分配内存
- 解析:将常量池的符号转换成为引用
-
初始化:初始化对象,赋值
Redis
缓存一致性。以及解决方案?
数据库数据与缓存数据的一致性。
解决方案:
- 删除缓存,再更新数据库
- 更新数据库,淘汰缓存
- 更新数据库,删除缓存
redis数据类型有哪些?
基本数据类型
- String
- List
- Set
- Hash
- Zset
特殊数据类型
- HerperLogLog
- Geo
redis持久化策略
- RDB
- AOF
redis过期策略?默认是什么?
- 惰性过期 只有访问一个key时才会判断是否过期,过期则清除。对cpu友好,对内存不友好,占用内存。
- 定时过期 每一个key设置一个定时器,时间到了,进行删除。
- 定期过期 每隔一定的时间,判断key是否过期。过期进行清除。
redis中使用了惰性过期和定期过期两种策略。
redis集群主从复制原理?
- 全量复制
- 主节点公国bgsave命令fork子进程进行RDB持久化
- 主节点通过网络将RDB文件发送给从节点
- 从节点清空老数据,载入RDB文件,过程阻塞,无法响应客户端的命令;从节点执行bgWriteaof,也会带来额外的消耗。
- 增量复制
- 复制一个偏移量:执行复制的双方,主从节点,分别维护一个复制偏移量offset
- 复制积压缓冲区:主节点内部维护了一个固定长度,先进先出的队列作为积压缓冲区,当主从节点offset的差距过大超过缓冲区长度是,将无法进行部分复制,只能进行全量复制
- 服务器运行ID: 每个redis节点,都有运行的id,运行id由节点自动生成,主节点会将自己的运行id发送和给从节点,从节点会将主节点的id存起来,从节点redis断开重连时,就是根据运行id来判断同步的进度:
- 如果从节点的runid与主节点的runid相同,说明之前同步过,主节点会继续尝试使用部分复制
- 如果从节点保存的runid与主节点的runid不同,说明从节点在断线前同步的redis节点不是当前的主节点,只能进行全量复制。
redis是单线程还是多线程?为什么这么快?怎么处理多线程调用?
单线程。是基于Reactor模式开发的网络事件处理器,这个处理器乘坐文件事件处理器file event handler,属于单线程的。它采用了IO多路复用技术来监听多个Socket,根据Socket上事件类型来选择对应的事件处理器。文件事件处理器包含4个部分:多个Socket、IOI多路复用选择器、文件事件分派器、事件处理器。
多个Socket并发产生不同的操作,每个操作产生对应的butt同的事件,IO多路复用程序会建通多个Socket,
所有操作在内存中进行操作。单线程减少线程上下文的切换。
处理多线程调用使用了IO多路复用(引出epoll)的技术解决。redis串化处理
redis在项目中的运用?(什么场景下会使用redis结合实际)
redis怎么评估数据量?
聊一下Redis事务?
开启了redis事务之后,所有的命令不会马上执行,确定调用exec命令之后才会执行。事务开启期间只会校验命令的正确性。
常用命令
- MULTI 开启事务
- EXEC 执行事务
- DISCARD 丢弃事务
Redis集群方案
哨兵模式
- 集群监控 负责建通redis master与slave之间的进程是否正常
- 消息通知 某个redis实例有故障,烧饼负责发送消息作为报警通知给管理员
- 故障转移 如果master故障之后,会转移到slave节点上
- 配置中心 故障转移发生之后
主从模式(Redis Cluster)服务端的Sharding技术,采用slot,一共分为16384个槽位。互为主从。
- 通过hash的方式麻将数据进行分片,每个节点均分存储在hash槽位上,默认分配了16384的槽位
- 每个数据分片会存储在多个互为主从的多个节点上
- 数据写入先写入主节点,在同步到从节点
- 同一个分片多个节点的数据不保持强一致性(支持配置为阻塞同步)
- 读取数据时,当客户端操作的key没有分配在该节点上,redis会返回转向指令,执行正确地 节点
- 扩容时需要将旧节点的数据迁移一部分到新节点
redis cluster架构下,每个redis需要放开两个端口号上,比如一个6379另一个是16384
16384端口就是拿来进行节点间通讯,集群之间通讯,进行故障检测,配置更新,故障转移
用了二进制协议gossip
优点:
无中心架构,支持动态扩容,对业务透明
具备sentinel的监控
客户端不需要链接集群的所有节点,链接人一个节点即可。
使用内存满了之后redis新增key的处理?
Mybatis
#{} 与 ${}的区别?项目中怎么使用?
#跟jdbc中的预编译一样,防止 sql注入,$是值替换
mapper.xml是如何load到mybatis中的
SqlSessionFatocy进行管理,获取到SqlSessionFactory之后,由SqlSessionFactory进行生产,每一条SQL语句使用SqlSession,
Mysql
讲一下数据库事务?
索引是什么?数据结构是怎么样的?唯一索引、联合索引是什么?
慢SQL怎么定位?
SQL优化?
数据库中年龄列存放是时间类型,怎么找出具体某一岁以下的男性?
datediff()
聚簇索引是个什么东西?
聚簇索引是指数据储存与索引都保存在叶子节点上,找到索引立马找到数据。
为什么用B+树?有什么好处?
多路查找树,树的高度低。减少查找的深度,加快查找速度。属于排序树,可快速查找数据。一个树除根节点之外都存在>=2的节点数。
什么情况下不会走索引?
- like语句左右都有通配符
- in、not in、not exits
- or条件中存在没有建立索引的列
- 函数运算
Mysql集群数据库的主从复制原理?
- 全量复制 mysqldum进行全量的复制
- 增量复制 数据库除DQL类型的语句都会记录binLog,通过网络,同步binlog
主节点起一个IO线程,将所有的DML,DDL的操作记录到binLog之中。从节点开启一个IO线程将binlog日志通过网络写入到本地relayLog,同时开启SQL线程将relayLog的数据读取到从节点的数据库之中。
数据库事务隔离级别?
首先明白什么脏读、幻读、可重复读的概念
- 脏读 事务A对数据进行了更新,但是事务没有提交。事务B可以看到事务A的更新数据,若此时事务A操作失败进行回滚,事务B读到的数据就是属于脏数据
- 不可重复读 两次查询读取的数据不一样。事务B两次读取事务的过程中,事务A进行了数据的修改
- 幻读 与不可重复读类似,幻读是事务A处理过程中,事务B进行的处理影响了事务A的执行,实际事务A已进行成功,但是由于事务B的执行,导致事务A看着像没有成功一样
隔离级别:
- 读已提交 read-commited
- 读未提交 read-uncommittted
- 可重复读 repeatable-read
- 串行化 seriazabale
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读已提交 | 存在 | 存在 | 存在 |
读未提交 | 不存在 | 存在 | 存在 |
可重复读 | 不存在 | 不存在 | 存在 |
串行化 | 不存在 | 不存在 | 不存在 |
如何解决幻读?
通过间隙锁来实现.
间隙锁:对操作的数据除本条数据之外,临近的其他数据一并加锁进行处理。
如果我有一个Sql存在多个表之间联合查询以及大表,可以从哪些方面进行优化?
- sql层面上查询字段上加索引
- 数据库进行查询时,多表关联查询时是否存在强关联?不存在强关联可以尝试进行sql拆分
- 大表数据是否可以进行分库分表
PG数据库与MYSQL的差别?
https://www.cnblogs.com/geekmao/p/8541817.html
MQ
如何保证消息的消费顺序?
- rocketMq
- 消息生产有序
- 顺序消费的消息发送到同一个nameServer中的同一个队列之中
- rabbitMQ
- 顺序消息扔到一个queue,一个消费者进行消费
- Kafka
- 一个partition对应一个消费者
- topic只有一个partition
- 消息丢在同一个partition同一个topic中
如何解决重复消费?
MQ并不保证消息的重复。由应用程序进行确保。
- 接口设计的幂等性
如何保证消息不丢失?
MQ消息丢失在任意一个阶段都有可能发生。
生产阶段往MQ发送阶段:生产者通过网络发送给MQ时,网络可能存在波动,从而导致消息丢失。该阶段可以通过发送给MQ之后收到MQ消息确认之后在进行确认,如果未收到确认可以尝试重试。
MQ集群同步阶段:MQ收到消息之后先存储 在内存之中,然后立刻响应生产者。MQ定时异步将消息刷入磁盘之中。异步刷盘减少了IO次数,可以用获得更好的性能,但若是发生服务器宕机,掉电,消息有可能丢失,所以可以改成同步刷盘的方式,消息刷入磁盘之后才回响应信息给生产者。
消费者:消费者收到MQ消息之后,确保业务的处理成功之后才给MQ回对应的响应信息。
rocketMq与RabbitttMq的选型?
- 语言不同,rocketmq使用java进行开发,rabbitmq使用erlang语言进行开发(一种高性能的广泛应用于路由方面的语言),二次开发有需求的话需要考虑
Spring
事务隔离级别?
- 读已提交 可以读取到其他事务已提交的数据,可能会出现幻读与不可重复读
- 读未提交 可以读取到其他事务未提交的数据,会产生脏读,幻读,不可重复读
- 可重复读(默认)可能出现幻读
- 串行化 事务串行化执行
如何解决循环依赖?
三级缓存:singletonObjects、earlySingletonObjects、singletonFactories这三个Map:
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
讲一下SpringAop从代码角度?
SpringBean的生命周期?
Dubbo
服务A要引用服务B怎么进行配置?
- 注册中心注册服务
- xml配置dubbo:reference
- 注解配置@Reference
讲一下dubbo协议,协议对比?
dubbo远程调用RPC原理?
SpringBoot
讲一下Springboot源码?
自动装配的原理?
自动装配原理通过BeanFactoryPostProcessor进行实现加载。
具体步骤:
- 首先@SpringApplication标注的类,使用SpringApplication.run()进行推断是否存在main方法。
- 再往下进入refresh方法,首先进行一些参数的设置,环境、监听器等。load()进行主启动类的加载到BeanFactory,
- 然后进行refreshContext()实现Spring的redresh方法(1.准备基本属性,2获取beanFactory 3.进行beanfactorypostProccsor。)执行完之后进行invoke BeanFactoryPostProcessor,此时调用ConfigurationPostClass进行加载@Confiigurattion,解析所有@configuration修饰的类。
- 解析所有@PropertiesSource注解
- 解析所有@Import (在@EnableAuttoConfiguration里面)资源,解析@import指定的类
- 进一步解析,此时将进行识别到@EnableAuttoConfiguration类,进行autoconfigure包中的spring.factories文件中配置的读取加载,此时通过autoconfig包内的spring-factory配置进行查找所有的自动装配的类
SpringClound
SpringClound都有哪些组件?
- Ribbon
- Hystrisx
- Feign
- Eruke
分布式
分布式事务解决方案有哪些?
- XA 分段提交
- TCC try-committ-canlcle
- 本地消息表
- 本地消息表消息化
分布式锁的实现方式?
- redis
- zookeeper
CAP理论与BASE理论
- CAP理论
- C Consisitenccy(一致性)
- A Available(可用性)
- P Partition tolerance (分区容错)
负载均衡
负载均衡的常见算法
- 随机
- 轮询
- 源地址hash
- 加权轮询
- 加权随机