面试准备
文章目录
- 面试准备
- 一、mysql知识
- 二、mybatis框架
- 三、spring框架
- 四、spring boot框架
- 五、spring cloud Alibaba面试
- 1.怎么理解微服务?
- 2.什么是Nacos?
- 3.Nacos服务是如何判定服务实例的状态?
- 4.Spring Cloud Alibaba的常用组件有哪些?
- 5.Nacos中的负责均衡底层是如何实现的?
- 6.Nacos配置中心一般都会配置什么内容?
- 7.微服务应用中我们的客户端如何获取Nacos配置中心的信息?
- 8.微服务应用中客户端如何感知Nacos配置中心数据变化?
- 9.Ribbon 是什么?Ribbon 可以解决什么问题?
- 10.Feign是什么?为什么使用feign?
- 11.Feign 调用过程分析(底层分析了解)
- 12.@EnableFeignCleints 注解的作用是什么?@FeignClient注解的作用是什么?
- 13.Ribbon负载均衡策略有哪些?
- 14.什么是网关(gateway)?
- 15.为什么使用网关?
- 六、Redis的使用
- 1.说说你对Redis的了解?
- 2.说说Redis中持久化以及方式?
- 3.如何理解Redis中RDB方式的持久化?
- 4.Redis中的RDB的持久化方式有什么优缺点?
- 5.如何理解Redis中AOF方式的持久化?
- 6.Redis中的AOF的持久化方式有什么优缺点?
- 7.如何理解Redis缓存穿透,怎么解决?
- 8.如何理解Redis缓存击穿,怎么解决?
- 9.如何理解Redis缓存雪崩?
- 10.说说Redis中的事务操作?
- 11.Redis事务三特性?
- 12.说说Redis的主从复制架构设计,有什么用?
- 13.Redis的主从复制思路的设计原理
- 14.说说Redis中哨兵(Sentinel)?
- 15.说说Redis中集群架构的设计,Redis Cluster集群数据如何分片,如何读取key数据?
- 16.Redis分布式锁怎么理解?
- 七、前端vue知识
- 八、Nginx知识
一、mysql知识
1.MYSQL索引的作用?
答:
-
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
-
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
-
可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
-
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
-
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
2.如何做 mysql 的性能优化?
1)查询时,为搜索字段创建索引。
2)避免使用 select *,列出需要查询的字段。
3)垂直分割分表。
4)选择正确的存储引擎。
3.怎么优化数据库的查询?
答:
- 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
- 应尽量避免在 where 子句中使用 != 或 <> 操作符。
- 应尽量避免在 where 子句中对字段进行 null 值判断。
- 应尽量避免在 where 子句中使用 or 来连接条件。
- 下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’ 若要提高效率,可以考
虑全文检索。 - in 和 not in 也要慎用,否则会导致全表扫描,很多时候用 exists 代替 in 是一个好的选择。
- 应尽量避免在 where 子句中对字段进行表达式操作。
- 应尽量避免在where子句中对字段进行函数操作。
4.在数据库中条件查询速度很慢的时候,如何优化?
- 建索引
- 减少表之间的关联
- 优化sql,尽量让sql利用索引定位数据,不要让sql做全表查询
- 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据
- 利用分页查询减少返回的数据量
二、mybatis框架
1.mybatis 中 #{}和 ${}的区别是什么?
答:
- #{}本质是预编译处理(占位符赋值),${}是字符串替换;
- Mybatis在处理#{}时,会将sql中的#{}替换为?号(占位符),调用PreparedStatement的set方法来赋值;
- Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值;
- 使用#{}可以有效的防止SQL注入,提高系统安全性。
- ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号
2.mybatis 和 hibernate 的区别有哪些?
答:
(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语
句。
(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用
hibernate开发可以节省很多代码,提高效率。
三、spring框架
1.什么是Spring IOC容器(控制反转,依赖注入)
答:控制反转指将对象的控制权转移给Spring框架,由 Spring 来负责管理控制对象的生命周期(比如创建、销毁)和对象间的依赖关系。
最直观的表达就是,以前创建对象的主动权和时机都是由自己把控的,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
依赖注入(DI)指应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖对象。
2.什么是面向切面编程
答:用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理
四、spring boot框架
1.springboot框架的优点?
答:1.springboot简化Spring,使用properties和yml来替代xml文件。
2.容易上手,可以快速的搭建一个后端项目,以及集成一些现在主流的框架。
3.不用繁琐的配置,开箱即用。
4.内嵌入Tomcat、Jetty 和Undertow 服务器(无须部署WAR文件)。
2.spring boot 自动装配的原理是怎么样的?
答:自动去把第三方组件的bean装载到IOC容器里面,不需要开发人员写bean相关的配置,在启动类上加上@SpringBootApplication注解就可以实现自动装配了,@SpringBootApplication注解是一个复合注解,真正实现自动装配的注解是@EnableAutoConfiguration注解,自动装配的实现主要依靠三个核心的关键技术:1.引入starter,启动依赖组件的时候,这个组件里必须要包含一个@Configuration配置类,配置类里面我们需要通过@Bean这个注解去声名需要装配到IOC容器里面的bean对象 2.这个配置类是放在第三方的jar包里面然后通过springboot中约定优于配置这样的理念,去把配置类的全路径放在 META-INF/spring.factories,这样的话springboot就可以知道第三方jar包配置类的位置,SpringFactoriesLoader来完成的。3.springboot拿到第三方jar包里面声明的配置类以后,再通过spring提供的importSelector这样的接口来实现对这些配置类 的动态加载。
自动去把第三方组件的bean装载到IOC容器里面,不需要开发人员写bean相关的配置,在启动类上加上@SpringBootApplication注解就可以实现自动装配了,@SpringBootApplication注解是一个复合注解,真正实现自动装配的注解是@EnableAutoConfiguration注解,SpringBoot通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,再通过spring提供的importSelector这样的接口来实现对这些配置类的动态加载。
3.如何理解springboot配置加载顺序?
- 1.properties文件
- 2.yaml文件
- 3.系统环境变量
- 4.命令行参数
4.什么是spring Profiles(怎么切换正式环境和开发环境)?
- 1.在项目的开发中,有些配置文件在开发、测试或者生产等不同环境中可能是不同的,例如数据库连
接、redis的配置等等。那我们如何在不同环境中自动实现配置的切换呢?Spring给我们提供了
profiles机制给我们提供的就是来回切换配置文件的功能
# 环境设置:dev、test、prod
spring.profiles.active=dev
-
- Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序
在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean 可以加载。
假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文
件来完成。Spring Boot 使得使用配置文件非常简单。
- Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。因此,当应用程序
5.Spring Boot 中读取配置文件有以下 5 种方法?
- 使用 @Value注解读取配置文件(常用)。
@SpringBootApplication
public class DemoApplication implements InitializingBean {
@Value("${profile.name}")
private String name;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("My Profile Name:" + name);
}
}
- 使用 @ConfigurationProperties 读取配置文件。
- 使用 Environment 读取配置文件。
- 使用 @PropertySource 读取配置文件。
- 使用原生方式读取配置文件。
6.SpringBoot 怎么处理异常?
答:①使用 @ControllerAdvice 和 @ExceptionHandler 注解处理全局异常。
②自定义异常类型。一般我们处理的都是 RuntimeException ,所以如果你需要自定义异常类型的话直接继承这个类就可以了。
7.springboot常用注解?
答:
- @SpringBootApplication:是springboot项目的启动注解。
- @Controller就是表示控制层的,@Repository就是表示数据层的,@Service表示服务层的,@Componment就是表示这三个哪一个都行,反正意思都一样。
- @ResponseBody将controller的方法返回通常用来返回JSON数据格式或XML格式。
- @RequestBody主要用来接收前端传递给后端的json字符串中的数据,一般都用POST方式进行提交。
- @RequestMapping用于建立请求URL和处理请求方法之间的对应关系。
- @GetMapping、@PostMapping、@DeleteMapping、@PutMapping,用于简化开发,注意:@RequestMapping如果没有指定请求方式,将接收Get、Post、delete、put等所有的请求方式。
- @Autowired 注释进行自动注入
五、spring cloud Alibaba面试
1.怎么理解微服务?
答:将单个应用程序拆分成多个独立的小服务,这些服务可以独立开发、部署和运行。
2.什么是Nacos?
答:
- Nacos 是一个用来快速实现动态服务发现、服务配置、服务元数据及流量管理的平台。
- Nacos 其实就是一个 Spring Boot 应用,一般用它来作为微服务中的 服务注册中心 和 配置中心。
3.Nacos服务是如何判定服务实例的状态?
通过发送心跳包,5秒发送一次,如果15秒没有回应,则说明服务出现了问题,如果30秒后没有回
应,则说明服务已经停止。
4.Spring Cloud Alibaba的常用组件有哪些?
nacos、openFeign、ribbon、gateway、sentinel等
5.Nacos中的负责均衡底层是如何实现的?
答:通过Ribbon实现,Ribbon中定义了一些负载均衡算法,然后基于这些算法从服务实例中获取一个实例为消费方法提供服务。
6.Nacos配置中心一般都会配置什么内容?
答:可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则
7.微服务应用中我们的客户端如何获取Nacos配置中心的信息?
答:我们的服务一般首先会从内存读取配置信息,同时我们的微服务还可以定时向nacos配置中心发请求拉取(pull)更新的配置信息。
8.微服务应用中客户端如何感知Nacos配置中心数据变化?
答:1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息,所谓的长轮询就是没有配置更新时,会在nacos服务端的队列进行等待(就长等待).
9.Ribbon 是什么?Ribbon 可以解决什么问题?
答:Ribbon是Netflix公司提供的负载均衡客户端,一般应用于服务的消费方法。
Ribbon可以基于负载均衡策略进行服务调用, 所有策略都会实现IRule接口。
10.Feign是什么?为什么使用feign?
答:feign是一种声明式Web服务客户端,通过Feign可以简化服务之间的调用实现。
feign可以更加友好的实现服务调用,简化服务消费方对服务提供方方法的调用。
11.Feign 调用过程分析(底层分析了解)
1)通过 @EnableFeignCleints 注解告诉springcloud,启动 Feign Starter 组件。
2) Feign Starter 会在项目启动过程中注册全局配置,扫描包下所由@FeignClient注解描述的接口,然后由系统底层创建接口实现类(JDK代理类),并构建类的对象,然后交给spring管理(注册 IOC 容器)。
3) Feign接口被调用时,底层代理对象会将接口中的请求信息通过编码器创建 Request对象,基于此对象进行远程过程调用。
4) Feign客户端请求对象会经Ribbon进行负载均衡,挑选出一个健康的 Server 实例(instance)。
5) Feign客户端会携带 Request 调用远端服务并返回一个响应。
6) Feign客户端对象对Response信息进行解析然后返回客户端。
12.@EnableFeignCleints 注解的作用是什么?@FeignClient注解的作用是什么?
@EnableFeignCleints注解描述配置类,例如配置类,注解描述启动类时,会在启动类启动时,扫描
使用@FeignClient注解描述的接口,使用动态代理的方式(JDK代理)为接口创建其实现类对象,然后交给spring管理。
@FeignClient注解告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
13.Ribbon负载均衡策略有哪些?
答:1)轮询策略(RoundRobinRule)
2)权重策略
3)随机策略
4)最小连接数策略
5)重试策略
6)可用性敏感策略
7)区域敏感策略
14.什么是网关(gateway)?
答:服务访问(流量)的一个入口,类似生活中的“海关“。
15.为什么使用网关?
答:服务安全,统一服务入口管理,负载均衡,限流,鉴权。
六、Redis的使用
1.说说你对Redis的了解?
答:Redis(Remote Dictionary Server)是一个基于C语言编写的内存数据库(非关系型数据库),基于Key/Value结构存储数据,读写速度很快,一般会用来做缓存、消息队列,分布式锁,同时还支持事务 、持久化、集群等。
2.说说Redis中持久化以及方式?
答:Redis持久化指将内存中的数据同步到硬盘文件中,当Redis重启后再将硬盘文件内容重新加载到内存,以实现数据恢复的目的。持久化的方式有RDB和AOF方式。
3.如何理解Redis中RDB方式的持久化?
答:1)RDB持久化方式是Redis数据库默认的持久化机制。Redis会单独创建一个子进程(fork)来进行持久化,会先将数据写入一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
2)RDB的方式是通过快照的方式来实现持久化的,也就是说会根据快照的触发条件,把
内存里面的数据快照写入到磁盘,就像拍照一样,将这一瞬间的所有东西都保存下来。
3)这种方式可以按照一定的时间周期策略把内存中的数据以快照(二进制数据)的形式保存到磁盘文件中,即快照存储。对应产生的数据文件为dump.rdb。
4.Redis中的RDB的持久化方式有什么优缺点?
答:优点:
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高更适合使用
- 节省磁盘空间(RDB 文件是经过压缩的二进制文件,占用空间很小)
- 恢复速度快
缺点; - RDB方式在服务器故障时容易造成数据的丢失。
- 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
- RDB持久化过程中的fork操作,可能会导致内存占用加倍,fork 子进程底层采用的是 copy-on-write 的方式(写时复制,修改前先复制),在 Redis 执行 RDB 持久化期间,如果 client 写入数据很频繁,那么将增加 Redis 占用的内存,最坏情况下,内存的占用将达到原先的2倍。
5.如何理解Redis中AOF方式的持久化?
答:以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件。
6.Redis中的AOF的持久化方式有什么优缺点?
答:优点:
- 备份机制更稳健,丢失数据概率更低。
- 可读的日志文本,通过操作AOF稳健,可以处理误操作。
缺点: - 比起RDB占用更多的磁盘空间(记录数据和操作)。
- 恢复备份速度要慢。
- 每次读写都同步的话,有一定的性能压力。
7.如何理解Redis缓存穿透,怎么解决?
答:当访问一个缓存和数据库数据源不存在的key时 ,请求会直接打到数据库上,并且查不到数据,没法写缓存,所以下一次同样会打到数据库上。这时缓存就好像被“穿透”了一样,起不到任何作用。当有大量的请求查询不存在的key时,就会对后端系统造成很大的压力,甚至数据库挂掉,这就叫做缓存穿透。
解决方案:
- 对空值进行缓存。可以将空值写进缓存,但是设置较短的过期时间
- 设置黑(白)名单。用户鉴权、数据合法性校验
- 采用布隆过滤器。使用布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库。
8.如何理解Redis缓存击穿,怎么解决?
答:某一个热点 key,在缓存过期的一瞬间,同时有大量的请求进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。
解决方案:
- (1)预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的时长
- (2)实时调整:现场监控哪些数据热门,实时调整key的过期时长
- (3) 应用互斥锁。在并发的多个请求中,保证只有一个请求线程能拿到锁,并执行数据库查询操作,其他的线程拿不到锁就阻塞等着,等到第一个线程将数据写入缓存后,直接走缓存。
9.如何理解Redis缓存雪崩?
答:缓存雪崩是当缓存服务器重启或者大量缓存集中在某一个时间段失效,造成瞬时数据库请求量大,压力骤增,导致系统崩溃。缓存雪崩其实有点像“升级版的缓存击穿”,但是区别在于:缓存击穿是一个热点 key,缓存雪崩是一组热点 key。
解决方案:
- (1)构建多级缓存架构:nginx缓存 + redis缓存 +其他缓存(ehcache等)
- (2)设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期会触发通知另外的线程在后台去更新实际key的缓存。
- (3)将缓存失效时间分散开:比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
- (4)加互斥锁。缓存失效后,通过加锁或者队列来控制写缓存的线程数量。比如对某个key只允许一个线程操作缓存,其他线程等待。
10.说说Redis中的事务操作?
答:Redis的一个事务从开始到结束通常会经历以下3个阶段:
1)事务开始
2)命令入队
3)事务执行
11.Redis事务三特性?
答:
- 单独的隔离操作 (事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断)
- 没有隔离级别的概念 (队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行)
- 不保证原子性 (事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚 )
12.说说Redis的主从复制架构设计,有什么用?
答:Redis主从复制是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为 主节点(master),后者称为 从节点(slave)。且数据的复制是 单向 的,只能由主节点到从节点,这样就可以实现读写分离,主服务器用来写数据,从服务器用来读数据。
作用:
- (1)数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
- (2)负载均衡,分担服务器的压力,可以大大提高redis服务器能承受的并发量。
13.Redis的主从复制思路的设计原理
答:1)从机(Slave)启动成功连接到主机(master)后会发送一个sync命令
2)主机(Master)接到命令后,生成存储数据的.rdb数据文件, 在后台进程执行完毕之后,主机)(master)将传送整个数据文件到从机(slave),以完成一次完全同步。
14.说说Redis中哨兵(Sentinel)?
答:哨兵(Sentinel)的作用是能够后台监控Redis主机服务器是否故障,如果故障了根据投票数自动将从库转换为主库。
15.说说Redis中集群架构的设计,Redis Cluster集群数据如何分片,如何读取key数据?
答:Redis 集群实现了对Redis的水平扩容。
Redis Cluster 采用的是虚拟槽分区,一个集群共有 16384 个哈希槽,Redis Cluster会自动把这些槽平均分布在集群实例上,例如:集群中有 N 个实例,那么每个实例上的槽个数为 16384/N个。
Redis Cluster 取值会对 key 进行 hash 得到一个整数值,然后用这个整数值对 16384 进行取模来得到具体槽位。
16.Redis分布式锁怎么理解?
七、前端vue知识
1.Vue.js 是什么?
答:Vue.js 是一套构建用户界面的渐进式框架, 只关注视图层, 采用自底向上增量开发的设计,Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
2.Vue的生命周期?
答:Vue 实例从创建到销毁的过程,就是Vue的生命周期。
3.谈谈你对MVVM的理解?
答:
- MVVM 是 Model-View-ViewModel 的缩写。
- Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。
- View 代表UI 组件,它负责将数据模型转化成UI 展现出来。
- ViewModel 监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和
Model的对象,连接Model和View。 - 在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model
和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的
变化也会立即反应到View 上。 - ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步
工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要
关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
八、Nginx知识
1.请简述什么是NGINX,有什么作用
答:Nginx 是一个 Web 服务器和反向代理服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
作用:
1.反向代理服务器(用户无需了解真实服务器地址,保护了服务器信息)
2.实现负载均衡
3.虚拟主机
2.简述什么是正向代理/反向代理?
答:正向代理:
- 代理服务器位于用户与服务器之间
- 用户了解访问的服务器到底是谁.
- 只有用户可以使用正向代理 (客户端代理)
- 正向代理保护了用户的信息.
反向代理: - 代理服务器位于 用户和服务器之间
- 用户以为代理服务器就是目标服务器.
- 用户无需了解真实服务器地址.
- 反向代理服务器保护了 服务器端的信息 (服务器端代理)
3.Nginx负载均衡策略有哪几种?
- 轮询策略
- 权重策略
- IPHASH策略(hash计算不能保证均匀分布,所以会出现负载不均的情况)