框架面试题

文章目录

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.如何解决:

​ 数据量不大可以人工手动导入

​ 定时热刷新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值