文章目录
- Spring和SpringMVC
- Spring
- 1.怎么理解Spring中的IOC容器?(强调创建对象)
- 2.怎么理解Spring中的依赖注入(DI)?(强调Bean与Bean之间依赖关系)
- 3.怎么理解Spring中的AOP?
- 4..Spring通知类型有哪些?
- 5.@Value注解的作用是什么?
- 6.Spring 中 bean 的作用域有几种类型
- 7.@Component 和 @Bean 有什么区别?
- 8.Spring 依赖注入方式有哪些?
- 9.在 Spring 中如何操作数据库?
- 10、 Spring 中的 Bean 是线程安全的吗?
- 11 、 Spring 有哪些优点?
- 12、 Spring、SpringMVC、SpringBoot、SpringCloud 的区别是什么
- 13.Spring 中使用的设计模式有哪些
- 14.解释SpringJDBC,SpringORM,SpringWeb模块作用
- 15.简述一下 Spring MVC 的执行流程?
- 16.如何实现跨域访问?
- 17.访问以下接口不传递任何参数的情况下,执行的结果是?
- 18、 Spring MVC 的常用注解有哪些?
- 19、 拦截器的使用场景有哪些?
- 20、 什么是RestFUL的风格?
- 21、 Spring容器和SpirngMVC容器有什么关系 ?
- 22、 Spring MVC 中如何在后端代码中实现页面跳转?
- 23、 SpirngMVC对异常的处理方式有哪些?
- 24、 autowired 和resource区别是什么?
- 25、 请说明一下springmvc和spring-boot区别是什么?
- 26、 SpringBoot有几种启动方式,打包方式?
- 27、 Spring Initializr 是创建 Spring Boot Projects 的唯一方法吗?
- 28、 Springboot读取配置文件的方式
- 29、Spring boot的如何整合第三方技术(比如ES,MQ)
- 30、SpringBoot自动配置的原理
- SpringCloud
- RabitMQ
- ZooKeeper
- 36、 ZooKeeper 是什么?
- 37、 Zookeeper 怎么保证主从节点的状态同步?
- 38、 四种类型的数据节点 Znode
- 34、 说一下 Zookeeper 的通知机制?
- 35、 Zookeeper 的典型应用场景
- 36、 说几个 zookeeper 常用的命令。
- 37、 集群最少要几台机器,集群规则是怎样的?
- 38、 zk 节点宕机如何处理?
- 39、 Zookeeper 下 Server 工作状态
- 40、 Zookeeper 和 Dubbo 的关系?
- 41、 当zookeeper挂了之后,生产者和消费者之间还能通信吗?
- 42、 当监控中心monitor挂了之后,生产者和消费者之间还能通信吗?
- 43、 zookeeper实际是如何存储生产者和消费者信息(Dubbo)?
- Eureka
- 分布式事务
- Spring事务
- Mybatis
- 1、Mybatis-plus-boot-start-启动的原理
- 2、 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
- 3、 请说说MyBatis的工作原理
- 4、 为什么需要预编译
- 5、 Mybatis是否支持延迟加载?
- 6、 #{}和${}的区别
- 7、 MyBatis中模糊查询like语句该怎么写
- 8、 在mapper中如何传递多个参数
- 9、 Mybatis如何执行批量操作
- 10、 如何获取生成的主键
- 11、当实体类中的属性名和表中的字段名不一样 ,怎么办
- 12、 什么是MyBatis的接口绑定?有哪些实现方式?
- 53、 使用MyBatis的mapper接口调用时有哪些要求?
- 54、 Xml映射文件都会写一个Dao接口与之对应,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗
- 55、 Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
- 56、 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
- 57、 Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
- 58、 Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
- 59、 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
- 60、 Mybatis分页插件的原理是什么?
- 61、 Mybatis的一级、二级缓存
- Tomcat
- 数据库
- Redis
- 1、 什么是Redis
- 2、 Redis有哪些优缺点
- 3、 为什么要用 Redis /为什么要用缓存
- 4、 Redis的应用场景
- 5、 什么是Redis持久化?有哪些方式
- 6、 Redis的过期键的删除策略
- 7、 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
- 8、 Redis的内存淘汰策略有哪些
- 9、 Redis增量复制,全量复制?
- 10、 Redis的内存用完了会发生什么?
- 11、 Redis如何做内存优化?
- 12、 Redis事务相关命令有哪些? (该成功的成功,该失败的失败)
- 13、 Redis事务的三个阶段?
- 14、 如何解决 Redis 的并发竞争 Key 问题
- 15、 说说Redis的主从复制,读写分离,哨兵机制 ,集群
- 16、 如何保证缓存与数据库双写时的数据一致性?
- 17、 说说Redis哈希槽的概念?
- 18、 Redis集群最大节点个数是多少 ?
- 19、 缓存穿透
- 20、 缓存击穿
- 21、 缓存雪崩
- 22、 缓存倾斜
- 23、 缓存预热
- 16、 如何保证缓存与数据库双写时的数据一致性?
- 17、 说说Redis哈希槽的概念?
- 18、 Redis集群最大节点个数是多少 ?
- 19、 缓存穿透
- 20、 缓存击穿
- 21、 缓存雪崩
- 22、 缓存倾斜
- 23、 缓存预热
Spring和SpringMVC
Spring
Spring是一种轻量级框架,它是很多模块的集合,能够提高开发人员的开发效率。
Spring是一个生产工厂,专门负责生产Bean的,spring配置文件名字:applicationContext.xml
<beans>
<bean id="" class="">
</beans>
1.怎么理解Spring中的IOC容器?(强调创建对象)
IOC读作“控制反转”,是一种设计思想,作用是将手动创建对象的控制权交给Spring容器来管理。在没有Spring之前,我们需要在程序中手动创建对象,而有了SpringIOC后,我们可以用RestController,Service,Bean,Repository等注解来告诉Spring容器它需要创建哪些对象,再通过DI依赖注入将它们注入到需要使用的地方。
2.怎么理解Spring中的依赖注入(DI)?(强调Bean与Bean之间依赖关系)
通过@Autowired,@Resources注解依赖注入由Spring容器创建好的对象。
3.怎么理解Spring中的AOP?
AOP称为面向切面编程,思想是在不改变的代码的情况下,动态的在某个方法之前或者之后干点事情。AOP的实现在于代理模式,Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理,JDK动态代理通过实现InvocationHandler接口调用invoke()方法反射来调用目标类中的代码,CGLIB通过生成目标类的一个子类对象来实现的。通常用于权限认证,日志,事务和全局异常处理。
4…Spring通知类型有哪些?
前置通知:目标方法执行前执行
后置通知:目标方法执行后执行
环绕通知:也是在目标方法执行前执行,但可以控制是否调用目标方法执行(与前置的区别)
抛出异常后通知:在目标方法抛出异常后执行
最终:在目标方法执行后,无论是否抛出异常都会执行(与后置的区别)
5.@Value注解的作用是什么?
作用是给变量赋值。
三种用法:@Value(“8080”),@Value( p o r t ) , @ V a l u e ( {port}),@Value( port),@Value({port:8080}) 设置默认值,读不到就用后面设置的默认值
6.Spring 中 bean 的作用域有几种类型
bean的类型通常有两种:
单例:整个容器只有一个实例
原生:每次获取都会创建一个实例
添加作用域的两种方法:
<bean scope="">
@Scope(scopeName="")
7.@Component 和 @Bean 有什么区别?
@Component、@Service和@Repository注解表明类会作为一个组件类,并告知Spring为这个类创建Bean。
@Bean注解告诉Spring方法会返回一个对象,这个对象要注册为Bean。
相同点:目的都是为了将bean注册到Spring容器中。
不同点:@Component加到类上,@Bean是加在方法上,方法的名称作为id,方法的返回值作为值
8.Spring 依赖注入方式有哪些?
1.构造器注入
2.set方法注入
3.注解注入
9.在 Spring 中如何操作数据库?
1.JdbcTemplate
2.SpringdataJPA
10、 Spring 中的 Bean 是线程安全的吗?
首先,什么是线程安全?
在多个线程共享同一个资源的情况下,如果都能始终表现正确的话就是线程安全的,否则就是不安全的。
那么怎么保证线程安全?
用锁来保证多线程下资源的线程安全。
如果Bean是单例类型的,那么 Spring 中的 Bean就不是线程安全的,因为多个线程共享同一个单例实例Bean。
如果是原生类型的,那么 Spring 中的 Bean就是线程安全的。
11 、 Spring 有哪些优点?
轻量级,IOC,AOP,事务管理,容器和MVC框架
12、 Spring、SpringMVC、SpringBoot、SpringCloud 的区别是什么
Spring:提供基础服务,IOC,AOP,事务
SpringMVC:Spring提供对Web的一个支持(封装了Servlet的框架)
SpringBoot:SpringBoot是快速搭建Spring应用的一种方式,拥有起步依赖和自动装配的特性,大大简化了开发,融入了约定大于配置的思想
SpringCloud:基于SpringBoot的微服务解决方案
13.Spring 中使用的设计模式有哪些
你了解设计模式吗?设计模式有什么用?
了解,设计模式针对特定问题提供了很多最佳实践方案。
你知道的设计模式有哪些?
设计模式共有23种,分为三类
创建型:工厂模式,单例模式,建造者模式。
结构型:代理模式,适配器模式,装饰者模式。
行为型:模板模式,观察者模式,责任链模式。
你项目中用过设计模式吗?你熟悉的框架中用了哪些设计模式?
Spring:
1.单例模式(Spring下默认的bean均为单例)
2.工厂模式(Spring使用工厂模式通过FactoryBean创建Bean对象)
3.代理模式(Spring AOP就是基于动态代理实现的)
4.适配器模式(Spring AOP中通知使用了适配器模式)
5.模板模式(JDBCTemplate,RedisTemplate等使用了模板模式)
6.观察者模式(ApplicationListenner监听,当一个对象状态改变时,其他依赖它的对象也要及时更新)
7.包装器模式(Wrapper,动态的给一个对象添加一些额外的职责,例如连接多个数据库需要用到包装器模式动态切换数据源)
MVC:
责任链模式(拦截器执行和请求的处理)
14.解释SpringJDBC,SpringORM,SpringWeb模块作用
SpringJDBC提供了对JDBC的支持,并且封装了操作更加简易的JDBCTemplate模板。
SpringORM提供对象关系映射API,包括JPA,IBatis等
SpringWeb提供了对Web的支持,对Servlet的封装。
15.简述一下 Spring MVC 的执行流程?
1.DisPatchServlet:首先所有的请求都要经过前端控制器进行分发。
2.HandlerMapping:然后分发到HandlerMapping,从中遍历出请求对象中对应接口的HandlerMapping对象。
3.HandlerExecutionChain:包含拦截器和要请求的Controller。
4.HandlerAdapter:用来调用Controller方法。
5.执行拦截器前置方法。
6.调用HandlerAdapter对象执行Controller方法,并返回ModelAndView对象,这里面包含了视图名称。
7.执行拦截器后置方法。
8.ViewResolve:视图解析器,根据ModelAndView对象获取视图名称,根据视图名称获取视图解析对象,渲染视图。
9.执行拦截器视图解析完成后方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PfaHtvCn-1672021133695)(D:/DOWNLOAD/TXT/SpringMVC.png)]
16.如何实现跨域访问?
满足同源策略:
同协议:http:
同主机:localhost:
同端口:8080:
后端统一在网关中解决跨域问题。
使用SpringBoot的一个CrosFilter,原理是给响应头设置了一个跨域属性。
17.访问以下接口不传递任何参数的情况下,执行的结果是?
@RequestMapping(value="/list")
@ResponseBody
public String list(int id){
return "id="+id;
}
报错,因为不传递参数的情况下,id默认取的是null,但是null不能用int来接受,所以会报异常。
18、 Spring MVC 的常用注解有哪些?
@Controller(定义了一个控制器类,包扫描)
@RestController(@Controller+@ResponseBody)
@RequestMapping(处理请求地址映射)
@ResponseBody(返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用)
@RequestBody(读取request请求的body部分的数据, 解析后, 把相应的数据绑定到请求处理方法的参数上.)
@RequestParam(将请求参数区数据映射到参数上)
@Pathvariable(取出uri模板中的变量作为参数,如/user/{id})
@Autowire(按照类型(byType)装配依赖对象),Resources(ByName自动注入)
@CookieValue(用来获取Cookie中的值)
@SessionAttributes(将值放到session作用域中)
19、 拦截器的使用场景有哪些?
日志,事务,权限验证,登录拦截,全局异常等
20、 什么是RestFUL的风格?
Rest是一种新的架构模式。
资源的定位:URL
资源的操作:METHOD
PUT:添加
POST:修改
GET:查询
DELETE:删除
21、 Spring容器和SpirngMVC容器有什么关系 ?
Spring容器是父容器,SpringMVC是子容器,子容器可以访问父容器,而父容器不能访问子容器。
Spring管理的Bean有:Service,Dao,数据源,事务,整合第三方框架,代理。
SpringMVC管理的Bean有:Controller,视图解析器,拦截器,JSON转换器,静态资源转换。
22、 Spring MVC 中如何在后端代码中实现页面跳转?
1.直接返回视图名,视图解析器会自动添加前缀和后缀。
2.转发,return “forward:ok.jsp”。
3.重定向,return “redirect:ok.jsp”。
23、 SpirngMVC对异常的处理方式有哪些?
1.全局异常
2.@Controlleradvice,@RestControlleradvice
3.@ExceptionHandler
24、 autowired 和resource区别是什么?
1.相同点
都可以完成自己注入。
如果存在多个实例,默认注入的是bean的名字变量的名称。
2.不同点
autowired默认按照类型注入的,resource默认按照名称注入。
存在多个Bean的情况下,指定注入哪个Bean由@Resource通过name属性指定。
存在多个Bean的情况下,指定注入哪个Bean需要Qualifier指定。
存在多个Bean的情况下,可以用@Primary指定优先级。
25、 请说明一下springmvc和spring-boot区别是什么?
SpringMVC:Spring对Web的一个支持,封装了Servlet。
SpringBoot:快速开发Spring应用的一种方式,拥有起步依赖和自动装配的特性,融入了约定大于配置的思想。(总的来说,就是推荐使用默认配置,如果有特殊需求,可自定义配置)
26、 SpringBoot有几种启动方式,打包方式?
1.运行main()方法。
2.打开命令管理器,java -jar 运行jar包文件。
3.打开tomcat目录文件,将war包放入webapp目录中,运行即可。
4.通过maven插件方式启动
27、 Spring Initializr 是创建 Spring Boot Projects 的唯一方法吗?
不是
1、使用idea创建
2、通过地址:https://start.spring.io/
28、 Springboot读取配置文件的方式
application.yml(需严格按照指定规范语法)
application.properties(按键值对的方式)
bootstrap.yml(优于application.yml先加载)
29、Spring boot的如何整合第三方技术(比如ES,MQ)
添加依赖
导入配置文件
在Spring启动类上开启第三方技术
30、SpringBoot自动配置的原理
SpringBoot启动的时候加载主配置类,开启自动配置功能@Enableconfiguration。
@Enableconfiguration作用:
利用@Import(AutoConfigurationImportSelector)给容器导入组件。
调用SpringFactoriesLoader.loadFactoryNames(),SPI机制(扫描项目ClassPath路径下的META-INF/spring.factories文件,自动加载文件里所定义的类)。
在spring.factories配置了很多Bean,这些Bean就是SpringBoot需要初始化的。
依赖:
spring-boot-starter-***:Spring官方提供的。
***-spring-boot-starter:第三方提供的。
SpringCloud
RabitMQ
为什么使用MQ?MQ的优点
解耦,异步,削峰
解耦(降低模块与模块之间的耦合):当A系统的接口被多个系统调用,A系统需要考虑调用接口的系统有没有挂了,需不需要重发等问题,但是如果有了MQ消息队列,A系统只需要把消息发送给MQ,如果有系统要调用直接消费MQ消息即可,如果没有就取消消费,这样A系统就不需要考虑到底要给谁发消息,也不需要考虑发送是否成功,发送超时等问题。
异步(提高效率):发送消息异步处理,从而提高效率。
MQ怎么解决消息的重复问题
重复消费场景:消费者正常消费后正准备发送应答ACK,但此时出现了网络闪断,channel断开连接,消息被再次放入队列中,导致重复消费。
幂等性(例如删除操作,执行一次和执行多次的操作是一样的,所以不需要考虑重复消费的问题)
使用redis,在消息被消费前,将其采用key为id_0的形式保存在redis中,0代表正在消费,1代表已消费。
RabbitMQ中有哪组件?
RabitMQServer、Vhost、Channel、Exchange、Routing、Queue、Provider、Consumer、Binding
RabbitMQ的工作模式
Hello-Word(一个生产者,一个默认的交换机,一个队列,一个消费者)
Work(一个生产者,一个默认的交换机,一个队列,两个消费者)
交换机采用轮询发送消息,给第一个发一条,另一个发下一条
publish(一个生产者,一个交换机,两个队列,两个消费者)
Routing(一个生产者,一个交换机,两个队列,两个消费者)
Topic(一个生产者,一个交换机,两个队列,两个消费者)
MQ消息如何分发?
根据交换机的路由键进行分发到MQ中。
如何确保消息正确地发送至 RabbitMQ?
开启Confirm确认机制,当消息由提供者送到交换机时,调用回调函数确认已送达到交换机。
开启Return返回机制,确认消息被送达到对应的队列中。
如何确保消息接收方消费了消息?
手动ACK
如何保证RabbitMQ消息的可靠传输?
在生产者发送消息的时候,使用confirm确认机制确保消息到达exchange,采用return返回机制来确保消息抵达queue,最后使用redis避免重复消费消息。
什么是死信队列?
死信队列的作用就是避免消息的丢失。一般来说,consumer从队列中取出消息进行消费,但由于某些原因导致队列中的某些消息无法被消费,这种消息如果没有后续的处理,如果配置了死信队列就会丢进死信队列中,如果没有配置死信队列则被丢弃。
死信队列的来源
消息被拒绝,也就是Reject/Nack,并且requeue=false;
ttl时间过期;
队列中满了,无法继续添加数据到MQ中。
如何配置死信队列?
@Bean
public Queue businessQueue(){
Map<String, Object> args = new HashMap<>();
//这里声明当前队列绑定的死信交换机
args.put("x-dead-letter-exchange", "deadLetterExchange");
//这里声明当前队列的死信路由key
args.put("x-dead-letter-routing-key", "dle.err");
return new Queue("businessQueue",true,false,false,args);
}
什么是延时队列
延时队列存储的就是延时消息,延时消息就是当消息发送后,不让消费者第一时间立即消费,而是等待一段时间后,消费者才拿到消息消费。
延时队列的设置
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-message-ttl", 6000);// 但是毫秒
channel.queueDeclare(queueName, durable, exclusive, autoDelete, args);
消费者消息确认机制
自动ACK:MQ只需要确认消息发送成功,不需要等待应答直接丢弃消息。(如果出现断电或者网络异常就会出现消息丢失的问题)
手动ACK:如果消费者端出现了异常,那么大量消息就会堆积在Unacked消息中,导致消息阻塞。
NACK:通知MQ把消息放回队列头部。(如果消费者有问题,就算放回头部,消费者再次消费,还是出错又被放回队列,陷入死循环中)
消费者消息拒绝
basicReject/basicNack
消费者消费模式
MQ的消费模式分为两种,一种是MQ把消息推给消费者,另外一种是消费者从MQ队列中拉去消息。
推模式采用BasicConsume,拉模式采用BasicGet
大量堆积消息如何处理
出现的原因:网络异常,消费者出现异常,没有ACK。
采用多线程发送到更多的MQ中,提高吞吐量
MQ是如何解决消息有序性的
在发送消息的时候就要确定消息的有序性。
在消费者消费消息的时候判断一下他的上一个是否被消费了。
如果上一个消费了,可以被消费,消费完后需要将消费记录放到Redis中存储,如果上一个消息还未被消费,直接返回Nack。
MQ是如何实现限流的?
设置MQ队列的最大长度。
ZooKeeper
36、 ZooKeeper 是什么?
zookeeper是一个分布式治理框架。
两个核心:
1.监听通知机制(服务注册与发现)
2.文件系统(树形结构)
作用:
服务的注册和发现,分布式锁等。
37、 Zookeeper 怎么保证主从节点的状态同步?
Zookeeper有三个角色
leader(领导者),follower(追随者),observer(观察者)
写命令由leader完成,leader在广播给所有follower,所有的follower返回一个是否写入的状态,如果由半数follower写入完成,leader就发送提交事务的广播。
38、 四种类型的数据节点 Znode
四种Znode
- 永久无序节点:永久的保存在你的Zookeeper
- 永久有序节点:永久的保存在你的Zookeeper.他会给节点添加一个有序的序号, /xx -> /xx0000001
- 临时无序节点:当存储的客户端和Zookeeper服务断开连接时,这个临时节点会自动删除
- 临时有序节点:当存储的客户端和Zookeeper服务断开连接时,这个临时节点会自动删除,他会给节点添加一个有序的序号
34、 说一下 Zookeeper 的通知机制?
35、 Zookeeper 的典型应用场景
36、 说几个 zookeeper 常用的命令。
37、 集群最少要几台机器,集群规则是怎样的?
38、 zk 节点宕机如何处理?
39、 Zookeeper 下 Server 工作状态
40、 Zookeeper 和 Dubbo 的关系?
41、 当zookeeper挂了之后,生产者和消费者之间还能通信吗?
42、 当监控中心monitor挂了之后,生产者和消费者之间还能通信吗?
43、 zookeeper实际是如何存储生产者和消费者信息(Dubbo)?
Eureka
44、 谈谈采用注册中心和直连的区别?
62、 服务注册和发现是什么意思?Spring Cloud 如何实现?
Eureka提供对服务的服务注册和服务发现的功能,服务注册是让所有的微服务将自己注册到注册中心里,服务发现是让所有的服务到注册中心去查找,方便结合feign远程调用,
63、 SpringCloud有哪组件,都解决了什么问题
1.eureka注册中心,通过服务注册和服务发现来完成对微服务的自动化管理机制。
2.config配置中心,统一且方便管理服务的配置文件。
3.openFeign,提供服务之间的远程调用和负载均衡以及服务熔断。
4.gateway网关,负责网络路由,断言,过滤。
路由(由 ID、目标 URI、一系列的断言和过滤器组成,如果断言为 true 则匹配该路由)
断言(匹配规则)
过滤(在请求被路由之前或之后对请求进行修改)
5.Sleuth,链路追踪
64、Feign和Ribbon的区别
Ribbon是通过RestTemplate来实现的。
Feign是通过RequestTemplate来实现的。
在openFeign中,用Ribbon作负载均衡,Feign用作远程调用。
分布式事务
52、 什么是CAP原则
53、 BASE理论的核心思想
Spring事务
1、Spring 有几种实现事务的方式?
1.编程式事务,我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
2.声明式事务,@Transactional
2、什么是Spring事务?事务有哪几个特性?
数据库操作的最小工作单元
事务特性(4种):
原子性 (atomicity):强调事务的不可再分.
一致性 (consistency):事务执行的前后状态保持一致.
隔离性 (isolation):事务和事务之间的隔离级别
持久性(durability) :事务一旦提交,对数据的修改是永久性的
3、 Spring 的 JdbcTemplate 对象和 JDBC 有什么区别?
JDBC(Java DateBase Connectivity)又称为java数据库连接,是一个执行SQL语句的Java Api。
JDBCTemplate是对JDBC的封装,大大简化了数据库的操作。
4、 Spring 事务隔离级别有哪些?
读未提交:脏读,不可重复读,幻读有可能发生。
读已提交:不可重复读,幻读有可能发生。
可重复读:幻读有可能发生。
串行化:花费较高但是比较可靠的事务隔离级别,避免出现上述的读问题。
由于隔离级别不同产生的问题:
脏读:读到了另一个事务没有提交的数据
不可重复读:在同一个事务中多次读取的数据不一致,读到了另一个事务已经提交的数据
幻读:一个事务在做批量修改,另一个事务在做添加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Baydawp0-1672021133696)(SpringMVC.assets/image-20210810210807492.png)]
Mybatis
1、Mybatis-plus-boot-start-启动的原理
Spring容器启动,通过SPI机制扫描配置文件,扫描到MybatisPlusAutoConfiguration,初始化SqlSessionFactory
2、 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象时,可以根据对象关系模型直接获取,所以它时全自动的。而Mybatis在查询对象的时候,需要手动编写sql来完成,所以Mybatis时半自动的。
3、 请说说MyBatis的工作原理
1.给Mapper创建一个代理(MapperProxy,JDK动态代理)。
2.在MabatisMapperMethod类中判断SQL的类型(GET,POST,PUT,DELETE),确认类型后调用相应的SqlSession的方法。
3.SqlSession调用的方法,实际上是通过调用SqlSessionProxy去调用。
4.在SqlSession代理调用的方法中,获取到MappedStatement对象(对调用Mapper方法的一个封装)。
5.再通过调用Executor开始执行,并传递MappedStatement对象。
6.得到StatementHandler对象(包含了Sql语句)。
7.使用PreparedStatement执行Sql语句。
4、 为什么需要预编译
1.安全,可以防止sql注入问题。
2.性能,一次编译,多次运行。
5、 Mybatis是否支持延迟加载?
支持
举例:员工和部门表,如果只是获取员工信息,那么只需要查询员工,不需要查询部门。当需要查询部门数据的时候在查询。
6、 #{}和${}的区别
.#{}底层采用的是PreparedStatement,会进行预编译,可以防止Sql注入,传入的数据会进行处理,将参数转为占位符“?”传入。
${}只是简单的替代变量,进行字符串拼接,一般用于动态表查询。
7、 MyBatis中模糊查询like语句该怎么写
1.CONCAT(‘%’,#{question},‘%’);
2.‘%${question}%’
3.NAME like ‘%’|| #{name} || ‘%’
4.bind
8、 在mapper中如何传递多个参数
1.索引,#{0}代表接收的是 dao 层中的第一个参数,#{param1}代表接收的是 dao 层中的第一个参数,where user_name = #{0}或者#{param}。
2.注解设置别名,@param(“username”) string username,where username = #{username}。
3.传递Map,#{}里面的名称对应map中的key
4.传递对象,#{}对应类中的成员属性
9、 Mybatis如何执行批量操作
insert into user(username,sex,bithday,address) values
<foreach collection="list/array" item="user" separator=",">
(#{user.username},#{user.sex},#{user.bithday},#{user.address})
</foreach>
delete from user where id in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
10、 如何获取生成的主键
1.XML配置文件
<insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
insert into person(name,psw) values(#{name},#{psw})
</insert>
调用Mapper中的方法int insert(Person person),注意在调用这个方法时,返回的int值并不是主键,而是插入的记录数。主键id会被赋值到输入的person对象里,自动赋值给person对象的id属性。
2.用Map
11、当实体类中的属性名和表中的字段名不一样 ,怎么办
用resultMap自定义映射关系
起别名
12、 什么是MyBatis的接口绑定?有哪些实现方式?
53、 使用MyBatis的mapper接口调用时有哪些要求?
54、 Xml映射文件都会写一个Dao接口与之对应,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗
55、 Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
56、 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
57、 Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
58、 Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
没有定义必须先后的顺序,首先,XML文件是从上到下解析的,如果解析到了A标签,发现A引用了B标签,但是B标签未解析到,那么此时会给这个A标签标上一个未解析的状态,再往下继续解析,待解析所有标签解析完毕,Mybatis会重新解析那些未解析的标签。
59、 Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
60、 Mybatis分页插件的原理是什么?
61、 Mybatis的一级、二级缓存
一级缓存是sqlSession级别的缓存,数据不共享,一旦关闭sqlSession,缓存就会被清空,如果是查询数据,如果有返回数据,没有就从数据库查并放入缓存,但是增删改操作会清空缓存,目的是避免脏读。
二级缓存是sqlSessionFactory级别的缓存,数据共享,二级缓存生命周期更大,首先创造sqlSessionFactory,再创建sqlSession
Tomcat
44、 Tomcat是什么?
45、 Tomcat的缺省端口是多少,怎么修改
46、 Tomcat有几种部署方式?
47、 tomcat容器是如何创建servlet类实例?用到了什么原理?
48、 tomcat 有哪几种Connector 运行模式(优化)
数据库
QPS/TPS(Mysql的两个重要性能指标,如果值过高了需要尽快处理)
采用show status like ‘queries’
QPS(query per second):
每秒查询量,先查询一次Q1,10秒后再查询一次Q2,QPS=(Q2-Q1)/10;
TPS(transaction per second)
采用show status like ‘com_commit’和’com_rollback’
查询事务提交次数com_commit和事务回滚次数com_rollback,TPS=(com_commit+com_rollback)/ sencond;
63、 数据库三大范式是什么
64、 什么是索引?
65、 创建索引的原则
66、 使用索引查询一定能提高查询的性能吗?为什么
67、 百万级别或以上的数据如何删除
68、 什么是数据库事务
69、 varchar与char的区别
70、 varchar(50)中50的涵义
71、 UNION与UNION ALL的区别?
72、 大表数据查询,怎么优化
73、 数据库的乐观锁和悲观锁是什么?怎么实现的?
74、 什么是子查询
Redis
1、 什么是Redis
关系型数据库(邮航优劣,)
Redis是一个高性能的key-value非关系型数据库。
支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以重新加载使用。
除了支持key-value类型的数据外,还支持set,list,zset,hash等数据结构的存储。
支持数据的备份,即master-slave模式的数据备份。
2、 Redis有哪些优缺点
优势:
性能高,Redis读写的速度非常快。
丰富的数据类型,支持String,List,Hash,Set等数据类型。
事务。
持久化。
支持主从模式备份,读写分离。
缺点:
一旦Redis宕机后,没有任何容错机制。
3、 为什么要用 Redis /为什么要用缓存
高性能,高并发,减少和数据库的交互。
4、 Redis的应用场景
服务注册和发现
缓存服务器。
自增自减
5、 什么是Redis持久化?有哪些方式
RDB(Redis DataBase):
用快照的方式,保存内存结构(二进制文件)
优点:加载速度快。
缺点:数据安全性低。
AOF(Append-only-file):
把写的命令全部保存到文件。
优点:数据安全。
缺点:AOF文件大,且数据恢复速度慢。
6、 Redis的过期键的删除策略
惰性删除:每次获取键的时候,检查键是否过期,如果键过期就删除键,没过期就返回键。
定期删除:每隔一段时间就对redis数据库进行检查,删除里面的过期键,但删除多少过期键和检查多少个数据库由算法决定。
定时删除:太消耗资源不推荐。
7、 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
1.当第一次从MySql获取数据的时候,将其存在redis中并设置过期时间,以后每次查询redis中的数据时判断是否还在redis中,如果存在就给他延长过期时间,以此来保证redis中的数据都是热点数据。
2.使用淘汰策略。
8、 Redis的内存淘汰策略有哪些
LRU(Least Recently Used):最近最少使用。
LFU(Least Frequently Used):最近最少频繁使用。
TTL(Time To Live):生存时间最少。
RANDOM:随机淘汰。
抽取样本进行淘汰。
9、 Redis增量复制,全量复制?
1.全量复制:
用于节点初始化的情况下,将主节点的所有数据发送给从节点,当数据量特别大的时候,会对主节点和网络造成很大的一个开销。
2.增量复制
10、 Redis的内存用完了会发生什么?
要么会发生报错,要么会调用淘汰策略清除一些key来保证redis的正常运行。
11、 Redis如何做内存优化?
1.给每个key都设置生存时间。
2.争对业务场景给出对应的淘汰策略。
3.正确使用Redis数据结构。
12、 Redis事务相关命令有哪些? (该成功的成功,该失败的失败)
multi:开启事务。
exec:执行事务块内的所有命令。
discard:取消事务。
watch:监听key在事务执行之前是否改变,若已修改则事务内的事务取消执行。
unwatch:取消对key的监听。
13、 Redis事务的三个阶段?
1.multi:开启事务。
2.添加命令到事务块中。
3.exec/discard:执行事务块中的命令/取消执行事务块中的命令。
14、 如何解决 Redis 的并发竞争 Key 问题
setnx
15、 说说Redis的主从复制,读写分离,哨兵机制 ,集群
集群解决单点故障(有状态和无状态)
不管调哪台服务器返回的结果是一样的(无)
需要服务器共享数据的(redis,eureka,zookeeper)
主从架构:一主多从,作用只是数据备份方案。
读写分离:主只提供写的操作,从只提供读的操作。2.提高Redis读的速度
哨兵机制:对Redis节点的监视和选举,哨兵数量至少为3个,只要有一半哨兵投票通过,那么选举出来的就为主节点。
redis集群没有主从一说,去中心化,使用hash槽让key每次访问的都是同一个redis服务器。
16、 如何保证缓存与数据库双写时的数据一致性?
先删除缓存,然后更新数据库,如果这时候有请求发送过来,他会访问到空的缓存,然后去数据库中拿数据,如果此时数据库未更新成功,那么此时缓存中的数据还是旧数据,导致数据库和缓存中数据不一致,那么就需要延迟一段时间后再删除一次缓存。(双删延迟)
17、 说说Redis哈希槽的概念?
首先,Redis集群中总共有16384个hahs槽,执行写命令的时候会将key按照一种算法得到一个结果,然后将这个结果对hash槽个数进行取余,然后将key放到这个位置的hash槽中。(Nigix负载均衡中ip_hash用到了hash槽,类似hashmap底层)
18、 Redis集群最大节点个数是多少 ?
16384
19、 缓存穿透
1.出现的原因:
redis中没有,mysql中也没有(比如查询的id为1)
2.如何解决:
设置一个默认值(如果在数据库中也没有查询到数据,就在缓存中存放一个默认值)
对id进行过滤,过滤掉一些不合法的id(比如负数)
20、 缓存击穿
1.出现的原因:
数据库中有,但redis中没有(热点数据突然过期)
并发查询数据库
2.如何解决:
分布式锁
设值热点数据不过期
21、 缓存雪崩
1.出现的原因:
大量数据在同一时间过期
2.如何解决:
设置数据的过期时间随机分布在30-60秒内,不让数据同时过期。
22、 缓存倾斜
1.出现的原因:
高并发请求访问一个redis服务
2.如何解决:
搭建redis集群和主从架构
23、 缓存预热
1.出现的原因:
发生在项目上线之前,热数据需要提前存放在redis中
2.如何解决:
数据量不大可以人工手动导入
定时热刷新
读的速度
哨兵机制:对Redis节点的监视和选举,哨兵数量至少为3个,只要有一半哨兵投票通过,那么选举出来的就为主节点。
redis集群没有主从一说,去中心化,使用hash槽让key每次访问的都是同一个redis服务器。
16、 如何保证缓存与数据库双写时的数据一致性?
先删除缓存,然后更新数据库,如果这时候有请求发送过来,他会访问到空的缓存,然后去数据库中拿数据,如果此时数据库未更新成功,那么此时缓存中的数据还是旧数据,导致数据库和缓存中数据不一致,那么就需要延迟一段时间后再删除一次缓存。(双删延迟)
17、 说说Redis哈希槽的概念?
首先,Redis集群中总共有16384个hahs槽,执行写命令的时候会将key按照一种算法得到一个结果,然后将这个结果对hash槽个数进行取余,然后将key放到这个位置的hash槽中。(Nigix负载均衡中ip_hash用到了hash槽,类似hashmap底层)
18、 Redis集群最大节点个数是多少 ?
16384
19、 缓存穿透
1.出现的原因:
redis中没有,mysql中也没有(比如查询的id为1)
2.如何解决:
设置一个默认值(如果在数据库中也没有查询到数据,就在缓存中存放一个默认值)
对id进行过滤,过滤掉一些不合法的id(比如负数)
20、 缓存击穿
1.出现的原因:
数据库中有,但redis中没有(热点数据突然过期)
并发查询数据库
2.如何解决:
分布式锁
设值热点数据不过期
21、 缓存雪崩
1.出现的原因:
大量数据在同一时间过期
2.如何解决:
设置数据的过期时间随机分布在30-60秒内,不让数据同时过期。
22、 缓存倾斜
1.出现的原因:
高并发请求访问一个redis服务
2.如何解决:
搭建redis集群和主从架构
23、 缓存预热
1.出现的原因:
发生在项目上线之前,热数据需要提前存放在redis中
2.如何解决:
数据量不大可以人工手动导入
定时热刷新