面试题总结

        

  1. 什么是关系型数据库

关系数据库关系型数据库是依据关系模型来创建的数据库,关系型数据是表格式的,因此存储在数据表的行和列中

关系型数据库的特点:安全(因为存储在磁盘中),关系型数据库包括 Oracle、MySQL等;

非关系型数据库非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。非关系型数 据通常存储在数据集中,就像文档、键值对或者图结构。

关系型数据库的特点:效率高(因为存储在内存中)、但不安全(断电丢失数据,但其中redis可以同步数据到磁盘中),现在很多非关系型数据库都开始支持转存到磁盘中。

非关系型模型有存储的数据是一列列的。关系型数据库以一行作为一个记录,

列模型数据库以一列为一个记录。(这种模型,数据即索引,IO很快,主要是一些分布式数据库)

键值对模型:存储的数据是一个个“键值对

文档类模型:以一个个文档来存储数据,有点类似“键值对”。

NoSQL 数据库有 Redis、MongBD

2.事务特性

1.事务:事务是一系列操作组成的业务单元,该业务单元内的操作是不可分割的,即:要么所有操作都做,要么所有操作都不做。@Transactional事务注解。

2. 事务具有4个特性,ACID(原子性、一致性、隔离性和持久性)
3. 原子性:事务是不可分割的最小业务单元,事务内的操作要么全部都做,要么全部都不做。
4. 一致性:事务执行时,是从一个一致状态变成另一个一致状态。
5. 隔离性:一个事务的执行,不受其他事务(进程)的干扰。
6. 持久性:事务一旦提交,对数据库的改变是持久的。

  1. 隔离级别

提交Oracle默认事务隔离执行两次同意的查询却有不同的结果,也叫不可重复读。

读未提交:事务可以读取未提交的数据,也称作脏读。

可重复读:是MySQL默认事务隔离级别。能确保同一事务多次读取同一数据的结果是一致的。可以解决脏读的问题,但理论上无法解决幻读的问题。

串行化事务只能一个一个执行,避免了脏读不可重复读幻读强制事务串行执行,会在读取的每一行数据上加锁,这样虽然能避免幻读的问题,但也可能导致大量的超时和锁争用的问题。

读脏:一事务对数据进行了增删改,但未提交,有可能回滚,另一事务却读取了未提交的数据

不可重复读:一事务对数据进行了更新或删除操作,另一事务两次查询的数据不一致

幻像读:一事务对数据进行了新增操作,另一事务两次查询的数据不一致。

索引

索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查找速度,

提高数据库的性能。

  1. 索引优点:

(1) 创建唯一性索引,保证数据库表中每一行数据的唯一性

(2) 大大加快数据的检索速度,这也是创建索引的最主要的原因

(3) 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

(4) 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

索引的分类

(1) 普通索引:最基本的索引,它没有任何限制。

(2) 唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

(3) 主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值。

如何避免索引失效

1、不要在索引上使用运算

2、字符串不加引号

3、尽量使用覆盖索引, 避免 select *, 这样能提高查询效率

优化索引

1、对查询频次较高, 且数据量比较大的表, 建立索引.

2、使用唯一索引, 区分度越高, 使用索引的效率越高.

3、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有 索引,将导致引擎放弃使用索引而进行全表扫描.

数据库锁

1.行锁和表锁

行锁:访问数据库的时候,锁定整个行数据,防止并发错误。

表锁:访问数据库的时候,锁定整个表数据,防止并发错误。

10.悲观锁和乐观锁、同步锁、死锁

1、悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,

2、乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁,乐观锁是一种并发类型的锁,不过在并发非常高的情况下,会导致大量的请求冲突,所以在高并发的场景下,乐观锁的性能却反而不如悲观锁。

3、同步锁:当多个线程同时访问同一个数据时,很容易出现问题。在同一时间内只允许一个线程访问共享数据。Java 中可以使用 synchronized 关键字来取得一个对象的同步锁。

4、死锁:就是多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。

静态变量和实例变量的区别?

(1)实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。

(2)静态变量不属于某个实例对象,而是属于类,所以也称为类变量。

(3)实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

abstract class和interface有什么区别?

1、含有abstract修饰符的class即为抽象类,abstract类不能创建的实例对象。

2、abstract class类中定义抽象方法必须在具体子类中实现。

3、如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。

4、接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

接口是否可以继承接口?抽象类是否可以实现接口? 抽象类是否可以继承具体类?

1、接口可以继承接口,可以继承多个接口

2、抽象类可以实现接口,可以实现多个接口

3、抽象类可以继承具体类,但只能继承一个类

GC是什么?GC的作用

1、GC是垃圾收集的意思

2、如果要请求垃圾收集,可以调用下面的方法之一:System.gc()或Runtime.getRuntime().gc(),这些方法会通知GC尽快进行内存垃圾回收。在对象使用以后要及时释放其引用,有利于垃圾回收,可以有效的防止内存泄露。

队列和栈是什么,列出它们的区别?

1、队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。

2、栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。

3、队列先进先出(FIFO),栈先进后出(FILO)。

  1. String与StringBuffer的区别,StringBuffer和StringBuilder的区别是什么?

1、String是不可变的,StringBuffer是可变的;StringBuffer是线程安全的,StringBuilder是非线程安全的。

2、由于字符串链接会自动创建StringBuilder对象,为了避免复杂字符串拼接时候大量创建StringBuilder对象,可以利用StringBuilder优化字符串链接操作。

3、StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。

创建线程有几种不同的方式?

1、继承Thread思软得类,并且创建对象。

2、实现Runnable接口,将Runnable接口的具体对象作为参数创建Thread思软得对象。

当一个线程进入一个对象的一个synchronized(同步)方法后,其它线程是否可进入此对象的其它方法?

可以进入其他非synchronized的方法,synchronized的方法不可以的!

1、Java中的每个对象都有一个锁(lock)或者叫做监视器(monitor)

2、当一个线程访问对象的synchronized(同步)方法时,将在对象上锁,方法不能并发执行。

3、此时其他任何线程都得阻塞等待到当前线程方法执行结束后,才能有机会执行方法。

4、也就是说线程排到一个接着一个执行 synchronized(同步)的方法。

什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?

1、对象序列化,将对象中的数据编码为字节序列的过程。

2、反序列化;将对象的编码字节重新反向解码为对象的过程。

3、JAVA提供了API实现了对象的序列化和反序列化的功能

List、Map、Set三个接口,存取元素时,各有什么特点?

1、List特点:元素有顺序,元素可重复

2、Set特点:元素无顺序(无下标),元素不可重复

3、Map特点:元素按键值对存储,无顺序

说出ArrayList,LinkedList的储存性能和特性?

1、ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,优点是索引读取快,从最后插入和删除元素速度快,但是头部插入和删除慢。

2、LinkedList使用双向循环链表方式存储数据,所以头尾插入或读取插入的速度快,而中部插入和读取慢.

HashSet 和 HashMap 区别?

1、HashMap :实现Map接口;使用hash算法,里面的数据是无序的;并且存储的是键值对;

2、HashSet :实现了Set接口;内部封装了HashMap,故也是无序的;HashSet本质就是HashMap,数据存储到HashSet的Key部分,Value部分被屏蔽不使用了。

HashMap 和 Hashtable 的区别

1、Hashtable 是陈旧API,HashMap 是Java 1.2 引进的Map 接口的一个实现

2、Hashtable中的方法都属于同步操作(线程安全),Hashtable不允许保存null数据,否则会出现异常。

3、值:HashMap 可以插入一个null的key-value

HashMap的结构

  1. 在JDK8之前HshMap是采用数组+链表进行存储的,
  2. 在JDK8之后HahMap是采用数组+链表+红黑树进行存储的
  3. 数组的特点:查询效率高,插入,删除效率低。

4、链表的特点:查询效率低,插入删除效率高。

5、在HashMap使用数组+链表+红黑树进行存储,查询和插入、删除的效率都很高。

6、HahMap的默认数组为长度16与加载因子为0.75,元素个数超过16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,

元素大小扩展为12*2=24,

8、HashMap采用哈希表来存储数据,在链表长度大于 8 的时候,链表就会变成红黑树,小于6时从红黑树转为链表

9、HashMap方法put时使用Hash算法进行计算,如果出现一样的Hash值,就是Hash碰撞

10、hash碰撞的解决方式是开放寻址法拉链法

(Java)#{}与${}的区别

1、#{ }:一个#{ }被解析为一个参数占位符;

2、${}: 表示拼接SQL串,而${}仅仅为一个纯碎的 string 替换,在动态SQL 解析阶段将会进行变量替换。

JDK JRE JVM 的区别

Jdk:java 开发工具包、JRE运行环境、JVM虚拟机

什么是单例模式?有几种?

1、单例模式:是一种思想,是一种常用的软件设计模式一个类只有一个对象实例。

2、饿汉式单例:类加载的时候,创建对象。 因此类加载速度慢, 线程相对安全。
3、懒汉式单例:类加载的时候,不会创建对象,调用时才会创建对象。因此类加载速度快,线程相对不安全,一般要配合同步锁使用。

Java 的异常

1、运行异常:是属于 JVM 层次的严重错误,这是不可捕捉到的,无法采取任何恢复的操作,顶 多只能显示错误信息

2、非运行时异常:空指针引用异常、算术运算异常、下标越界异常等异常

反射

1、在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制

2、反射使用步骤(获取 Class 对象、调用对象方法)

什么是Ajax?

是一种用来改善用户体验的技术,其实质是利用浏览器内置的一种特殊对象(即ajax对象)异步地向服务器发送请求,服务器返回部分数据,浏览器利用这些数据修改当前页面,整个过程页面无刷新,不打断用户的请求。

请谈一下Ajax的优点?

1、通过异步模式,提升了用户体验

2、优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用

3、Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。

4、Ajax可以实现动态不刷新(局部刷新)

Ajax的核心对象是什么?

Ajax的核心对象是XMLHttpRequest对象

cookie和session有什么区别

1、数据存放位置不同:cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、安全程度不同:cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

3、性能使用程度不同:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。

4、数据存储大小不同:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,而session则存储与服务端,浏览器对其没有限制。

JavaSE、JavaEE、JavaME三者的区别

  Java SE 是做电脑上运行的软件。

Java EE 是企业及开发,最多的应该是web开发-

Java ME 是做手机软件的。

Nginx 是什么?

Nginx 是一个高性能的 HTTP 和反向代理服务器,及电子邮件代理服务器,同时也是一个非常高效的反向代理、负载平衡。

Nginx 的作用?

1.反向代理,将多台服务器代理成一台服务器。

2.负载均衡,将多个请求均匀的分配到多台服务器上,减轻每台服务器的压力,提高 服务的吞吐量。

3.动静分离,nginx 可以用作静态文件的缓存服务器,提高访问速度

Nginx 的优势?

(1) 可以高并发连接(5 万并发,实际也能支持 2~4 万并发)。

(2) 内存消耗少。

(3) 成本低廉。

(4) 配置文件非常简单。

(5) 支持 Rewrite 重写。102

(6) 内置的健康检查功能。

(7) 节省带宽。

(8) 稳定性高。

(9) 支持热部署。

什么是反向代理?

反向代理是指以代理服务器来接受 internet 上的连接请求,然后将请求,发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

反向代理总结就一句话:代理端代理的是服务端.

什么是正向代理?

一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

正向代理总结就一句话:代理端代理的是客户端。 

什么是负载均衡?

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中,负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力。

为什么 Nginx 性能这么高?

得益于它的事件处理机制:异步非阻塞事件处理机制:运用了 epoll 模型,提供了一个队列,排队解决。

  1. TCP的三次握手?

为什么要三次握手:三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是 双方确认自己与对方的发送与接收是正常的。

SYN:同步序列编号,是TCP/IP建立连接时使用的握手信号。

1、第一次握手:客户端给服务器发送一个SYN。客户端发送网络包,服务端收到了。服务器得出结论:客户端的发送能力,服务端的接收能力正常。

2、第二次握手:服务端收到SYN报文之后,会应答一个SYN+ACK报文。服务端发包,客户端收到了。客户端得出结论:服务端的接收和发送能力,客户端的接收和发送能力正常。但是此时服务端不能确认客户端的接收能力是否正常。

3、第三次握手:客户端收到SYN+ACK报文之后,回应一个ACK报文。客户端发包,服务端收到了。服务器得出结论:客户端的接收和发送能力,自己的接收发送能力都正常。

什么是SpringBoot?

SpringBoot是一个快速开发的框架,能过快速整合第三方框架,他是的基本原来是Maven依赖关系,Maven的集成,完全采用注解化,简化XML配置,内嵌HTTP服务器(Tomcate,jetty),默认嵌入Tomcate,最终以Java应用程序进行执行。

  1. Spring Boot有哪些优点?

SpringBoot 对Spring 的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期

  1. 快速创建独立运行的spring项目与主流框架集成

2、SpringBoot核心快速整合第三方框架

3、SpringBoot原理:Maven依赖关系,Maven的继承,完全采用注解化,

SpringBoot 支持哪些日志框架

Java Utils logging 、Log4j2 、Lockback

SpringBoot 常用注解

1、@SpringBootApplication启动类注解,SpringBoot 的核心设计思想.

2、@RestController

3、@RequestMapping(明确请求的路径)

4、@PathVariable(路径变量注解,用{}来定义 url 部分的变量名)

5、@Component (和 spring 的注解功能一样, 注入到 IOC 容器中)

  1. 什么是spring

spring框架是轻量级的开源JavaEE框架spring有两个核心部分:IOC和AOP

IOC(控制反转):是指创建对象的控制权的转移到Spring 容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。最直观的表达就是,IOC 让对象的创建不用去 new 了,可以由 spring 根据我们提供的配置文件自动生产,我们需要对象的时候,直接从 Spring 容器中获取即可

AOP:一般称为面向切面编程(是通过预编译方式或者是运行期期间动态代理实现功能扩展而不用修改源代码。通过AOP技术,实现一种通用的逻辑解耦,解决一些系统层面的问题,如日志,事务,权限等,从而实现高可用的可重用性和可维护性。

AOP使用场景

Debugging调试

logging, tracing, profiling and monitoring日志记录,跟踪,优化,校准

Synchronization同步

Transactions事务管理

AOP名词

横切关注点:我们要在业务逻辑上增加的共有功能,如日志、安全、缓存、事务

切面Aspect:横切关注点 模块化的实例类

通知Advice: 切面的方法

目标Target: 要实现的功能,接口或者抽象类,如:租房

代理Proxy: 代理角色,如中介

切入点CutPoint:切面的方法执行的“地点” 连接点JoinPoint:与切入点匹配的执行点

Spring 框架中都用到了哪些设计模式?

1. 工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例

2. 单例模式:Bean 默认为单例模式

3. 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术

4. 模板方法 :用来解决代码重复的问题

Spring框架的优点都有什么?

1、简化编程:Spring对JavaEE中的一些比较繁琐的API做了简化和封装,使用封装之后的API不仅代码更简洁,而且质量更高。

2、解耦:对象之间的依赖关系由容器来统一管理、降低了对象之间的耦合度、方便代码的维护,同时也实现了资源的统一调度和管理。

3、支持面向切面编程AOP:可以方便对程序添加通用的服务,比如事务、权限管理等。

4、集成其它框架:不发明重复的轮子,集成其它一些优秀框架、使开发者用统一的并且更加简洁的方式来使用这些框架。

5、轻量:可以依赖项目的实际要求,有选择的使用Spring框架的全部或者一部分。

列出IOC的3种主要注入方式?

构造方法注入setter属性注入接口注入。

简述Spring中常用注解?

1. @Component(任何层) @Controller @Service @Repository(dao): 用于实例化对象

2. @PostConstruct @PreDestroy : 用于设置 Spring 创建对象在对象创建之后和销毁之前要执行的方法

3. @Value: 简单属性的依赖注入

4. @Autowired: 对象属性的依赖注入

5. @Transactional 此注解可以标在类上,也可以表在方法上,表示当前类中的方法具有事务管理功能。

6. @Qualifier: 要和@Autowired 联合使用,代表在按照类型匹配的基础上,再按照名称匹配。

7. @Resource 按照属性名称依赖注入

8. @ComponentScan: 组件扫描

9. @Bean: 表在方法上,用于将方法的返回值对象放入容器

10. @PropertySource: 用于引入其它的 properties 配置文件

11. @Import: 在一个配置类中导入其它配置类的内容

简述什么是MVC?

MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

1.Model(模型)是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。

2.View(视图)是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。

3.Controller(控制器)是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC执行流程

1. 用户发送请求到前端控制器(DispatcherServlet)

2. 前 端 控 制 器( DispatcherServlet )收到请求调用处理器映射器HandlerMapping),去查找处理器(Handler)

3. 处理器映射器(HandlerMapping)找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。

4. 前端控制器(DispatcherServlet)调用处理器映射器(HandlerMapping)

5. 处理器适配器(HandlerAdapter)去调用自定义的处理器类(Controller,也叫后端控制器)。

6.自定义的处理器类(Controller,也叫后端控制器)将得到的参数进行处理并返回结 果给处理器映射器(HandlerMapping)

7. 处 理 器 适 配 器 ( HandlerAdapter )将得到的结果返回给前端控制器(DispatcherServlet)

8. DispatcherServlet(前端控制器 ) 将 ModelAndView 传给视图解析器(ViewReslover)

9. 视图解析器(ViewReslover)将得到的参数从逻辑视图转换为物理视图并返回给前端控制器(DispatcherServlet)

10. 前端控制器(DispatcherServlet)调用物理视图进行渲染并返回

11. 前端控制器(DispatcherServlet)将渲染后的结果返回

SpringMVC 的常用注解

1.@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。

2.@RequestBody:注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。

3.@ResponseBody:注解实现将 conreoller 方法返回对象转化为 json 对象响应给客 户。

4.@PathVariable 用户从 url 路径上获取指定参数,标注在参数前 @PathVariabel("要获取的参数名")

SpringMVC如何解决线程安全性问题?

SpringMVC中的Controller默认是单例的,因此有可能有多个请求访问同一个Controller实例,从而有可能产生线程安全问题。 因此尽量避免在Controller中使用实例变量 使用ThreadLocal变量。

SpringMVC的优点

1、可以支持各种视图技术,而不仅仅局限于JSP;

2、与Spring框架集成(如IoC容器、AOP等);

3、清晰的角色分配:前端控制器, 请求到处理器映射, 处理器适配器, 视图解析器

4、 支持各种请求资源的映射策略。

Spring MVC的主要组件

1、前端控制器(作用:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。)

2、处理器映射器(作用:根据请求的URL来查找Handler

3、处理器适配器HandlerAdapter

4、处理器Handler(需要程序员开发)

5、视图解析器(作用:进行视图的解析,根据视图逻辑名解析成真正的视图(view))

6、视图View(需要程序员开发jsp)View是一个接口, 它的实现类支持不同的视图类型(jsp,freemarker,pdf等等)

JDBC 跟 Mybatis的区别?
1. Mybatis是一种支持SQL的持久层框架,底层仍然是jdbc。
2. Mybatis相对于直接使用JDBC, 代码大大简化,比如能够直接将ResultSet中的数据转换成所需要的Java bean对象等。
3. MyBatis对SQL统一放到配置文件中进行管理,不用将SQL语句分散在各个java类中,方便代码的维护。
4. JDBC代码相对繁琐但访问速度更快,比如使用JDBC批处理等方式效率比Mybatis要高。

在 Mybatis 中你知道的动态 SQL 的标签有哪些?作用分别是什么?

1. <if>if 是为了判断传入的值是否符合某种规则,比如是否不为空.

2. <where> where 标签可以用来做动态拼接查询条件,当和 if 标签配合的时候,不用显示的声明类型 where 1 = 1 这种无用的条件

3. <foreach> foreach 标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到 sql 语句中.

4. <include> include 可以把大量的重复代码整理起来,当使用的时候直接 include即可,减少重复代码的编写;

5. <set>适用于更新中,当匹配某个条件后,才会对该字段进行更新操作

mybatis 缓存机制的理解?

Mybatis 有两级缓存,一级缓存是 SqlSession 级别的,默认开启,无法关闭;二级缓 存是 Mapper 级别的,二级缓存默认是没有开启的,但是手动开启;

MyBatis应用中#与$有什么异同点

      相同点:都是通过get来获取值的

      不同点:$传进去的字符串不带引号 #号带引号

MyBatis应用动态SQL解决了什么问题

答:有时候,固定的sql语句不能够满足我们的应用需求。这个时候需要在 标准的基础上建立动态的查询语句。

Mybatis提供了多种注解,可以提供动态查询语言。比如说在开发的时候,遇到这样的场景,界面提供了多种查询,但是都是非必填写,在选择查询条件时可以选中任意几种组合作为查询条件,如果在使 用jdbc的时候,需要判断参数为空,自己组装sql,但是mybatis提供动态sql机制,依靠标签。

MyBatis优点

优点

易于上手和掌握,

Sql写在xml里面,便于统一管理和优化

减少Sql与程序代码的耦合

提供xml标签,支持动态Sql编写

缺点

Sql工作量大,尤其是字段多,关联表多时,更是如此

Sql依赖于数据库,导致数据库移植性差

由于xml里面标签id必须唯一,导致DAO中方法不支持方法重载。所以dao层必须是接口

JDBC连接数据库

1、注册驱动

2、获取连接

3、创建一个Statement对象

4、执行sql语句

5、处理结果集

6、释放资源

  1. 什么是微服务?

SpringCloud 是一系列框架的集合,集成 SpringBoot,提供很多优秀服务:服务发现和注册,统一配置中心, 负载均衡,网关, 熔断器等的一个微服务治理框架

  微服务是一种分布式架构,分布式架构就是把服务做拆分,微服务就是把模块拆分,把我们整个项目拆解分成许多独立的子项目,每个子项目之间独立开发和部署,子项目也有自己独立的功能,这些独立的子项目就形成了微服务,不同的子项目就进而形成一个服务集群。

  举例说明:一个商城系统很多模块组成,例如订单模块、用户功能、商品服务、支付模块等,这些模块如果采用单体架构,代码之间的耦合度会非常高,也不便于后期的维护,当一个模块出现问题时整个项目也会受到影响。如果采用微服务,每个模块独立开发,由这些子模块构成整个商城系统,有利于提升我们的开发效率,也便于后期的维护。

总结:Spring Cloud 提供了构建分布式系统所需的“全家桶”。

单体架构:

优点:架构简单、部署成本低。

缺点:耦合度高。

微服务架构:

优点:耦合度低、便于后期维护扩展。

缺点:部署成本高、需要实线远程调用。

微服务中各组件的作用

注册中心:记录微服务中每个服务的ip、端口、能干什么事等信息。(我们调用微服务中的某个服务时,可能服务A需要调用服务B,服务B需要调用服务C,注册中心负责记录服务之间的调用关系,我们调用服务时找注册中心就可以了)。

配置中心:统一管理每个服务的配置信息,如果需要变更某个服务的配置信息,只需找到配置中心即可。

网关服务:形如小区保安,能对用户身份做校验,另一方面可以把用户的请求路由到具体的服务中去。

SpringCloud 的优势?

1、因为 SpringCloud 源于 Spring,所以它的质量,稳定性,持续性都是可以保证的。

2、SpringCloud 天热支持 SpringBoot 框架,就可以提高开发效率,能够实现需求。

3、SpringCloud 更新很快,后期支持很给力。

4、SpringCloud 可以用来开发微服务。

SpringCloud 有哪些核心组件?

1、Eureka:服务注册于发现。

2、Feign:基于动态代理机制,根据注解和选择的机器,拼接请求 url 地址,发起请求。

3、 Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。

4、 Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。

5、Zuul:网关管理,由 Zuul 网关转发请求给对应的服务。

SpringBoot 和 SpringCloud 的关系

1、SpringBoot 是为了解决 Spring 配置文件冗余问题, 简化开发的框架. n

2、SpringCloud 是为了解决微服务之间的协调和配置问题, 还有服务之间的通信, 熔断, 负载均衡远程调度任务框架. n 3、SpringCloud 需要依赖 SpringBoot 搭建微服务, SpringBoot 使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,SpringCloud很大的一部分是基于 SpringBoot 来实现。

4、SpringBoot 不需要依赖 SpringCloud 就可以独立开发. SpringBoot 也可以集成Dubbo 进行开发.

SpringCloud 核心组件原理

1、Eureka

提供服务注册和发现, 是注册中心. 有两个组件: Eureka 服务端和 Eureka 客户端

Eureka 服务端: 作为服务的注册中心, 用来提供服务注册, 支持集群部署. l

Eureka 客户端: 是一个 java 客户端, 将服务注册到服务端, 同事将服务端的信息缓存到本地, 客户端和服务端定时交互.

2、Ribbon

lRibbon 是 Netflix 发布的云中服务开源项目. 给客户端提供负载均衡, 也就是说Ribbon 是作用在消费者方的.

l简单来说, 它是一个客户端负载均衡器, 它会自动通过某种算法去分配你要连接的机器.

lSpringCloud 认为 Ribbon 这种功能很好, 就对它进行了封装, 从而完成负载均衡. Ribbon 默认负责均衡策略是轮询策略.

3、Hystrix 熔断器

l 有时候可能是网络问题, 一些其它问题, 导致代码无法正常运行, 这是服务就挂了, 崩溃了. 熔断器就是为了解决无法正常访问服务的时, 提供的一种解决方案. 解决因为一个服务崩溃而引起的一系列问题, 使问题只局限于这个服务中,不会影响其 他服务

4、Feign: 远程调用组件

l 后台系统中, 微服务和微服务之间的调用可以通过 Feign 组件来完成.,Feign 组件集成了 Ribbon 负载均衡策略(默认开启的, 使用轮询机制), Hystrix 熔断器 (默认关闭的, 需要通过配置文件进行设置开启)被调用的微服务需要提供一个接口, 加上@@FeignClient("url")注解,调用方需要在启动类上加上@EnableFeignClients, 开启 Feign 组件功能.

5、Gateway: 路由/网关

l 对于项目后台的微服务系统, 每一个微服务都不会直接暴露给用户来调用的, 但是如果用户知道了某一个服务的 ip:端口号:url:访问参数, 就能直接访问你. 如果再是恶意访问, 恶意攻击, 就会击垮后台微服务系统.因此, 需要一个看大门的大 boss, 来保护我们的 后台系统. Gateway 支持过滤器功能,对请求或响应进行拦截,完成一些通用操作。

7、 什么是Spring Cloud Alibaba?

SpringCloud Alibaba是对Spring Cloud的标准实现,以微服务为核心的整体解决方案。

8、Spring Cloud Alibaba的组件

Nacos注册中心、Dubbo服务注册与发现、Seata分布式事务、Sentinel限流降级、Gateway网关。

9 、什么是Nacos?

Nacos一个易于构建云原生应用的动态**`服务发现(Nacos Discovery)、服务配置(Nacos Config)和服务管理平台。

Nacos是集注册中心+配置中心+服务管理的平台。

Dubbo是什么?

Dubbo是Spring Cloud Alibaba提供的一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,可以实现服务发现、负载均衡等服务治理诉求。

Dubbo中负载均衡?

在实际项目中,服务基本上都是集群的,负载均衡就是能够尽可能的让请求在相对空闲的服务器上运行。

Seata分布式事务

是Spring Cloud Alibaba提供一款开源的分布式事务解决方案。Seata将为用户提供了AT、TCC、SAGA和XA事务模式。

1、TC- 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。

2、TM- 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务。

3、RM- 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TC为单独部署的Server服务器,TM和RM为嵌入到应用中的Client客户端。

Sentinel限流降级

是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

使用Sentinel的原因?

为了保证服务器运行的稳定性,在请求数到达设计最高值时,将过剩的请求限流,保证在设计的请求数内的请求能够稳定完成处理。

什么是网关?

网关:就是指系统(微服务项目)对外界开放的统一入口。所有外界的请求都需要经过网关才能访问到我们的服务(程序),提供统一入口之后,方便对所有请求进行统一的检查和管理。

Spring Cloud Gateway功能特征

1、 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建。

2、动态路由:能够匹配任何请求属性。

3、 支持路径重写。

4、集成 Spring Cloud 服务发现功能(Nacos、Eruka)。

5、可集成流控降级功能(Sentinel、Hystrix)。

6、可以对路由指定易于编写的 Predicate(断言)和 Filter(过滤器)。

什么是消息队列,什么是RabbitMQ?

消息队列:是一种异步的服务间通信方式,是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性架构。主流的消息队列有RabbitMQ、Kafka、RocketMQ。

   消息:传输数据。

   队列:一种先进先出的数据结构。

   消息队列是一个存放消息的容器。

   消息队列可以理解为:把要传输的数据放在队列中。

   把数据放到消息队列中的叫做生产者;从消息队列里边获取数据的叫做消费者。

RabbitMQ:是一种消息队列技术,最大的特点就是消息名不需要确保提供方存在,实现了服务之间的高度解耦。

Kafka的特性

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒

可扩展性:kafka集群支持热扩展

持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失

容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)

高并发:支持数千个客户端同时读写

Kafka场景应用

日志收集:一个公司可以用Kafka可以收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer,例如hadoop、Hbase、Solr等。

消息系统:解耦和生产者和消费者、缓存消息等。

Redis 是什么?

Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能非关系型(NoSQL)的(key-value)键值对数据库。可以用作数据库、缓存、消息中间件等。

Redis 的存储结构有哪些?

String,字符串,是 redis 的最基本的类型,一个 key 对应一个 value。是二进 制安全的,最大能存储 512MB。

Hash,散列,是一个键值(key=>value)对集合。string 类型的 field 和 value 的 映射表,特别适合用于存储对象。每个 hash 可以存储 232 -1 键值对(40 多亿)

List,列表,是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列边或者尾部(右边)。最多可存储 232 - 1 元素(4294967295, 每个列表可存储 40 亿)

Set,集合,是 string 类型的无序集合,最大的成员数为 232 -1(4294967295, 每个集合可存储 40 多亿个成员)。

Redis 的优点?

1 因为是纯内存操作,Redis 的性能非常出色,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value 数据库。Redis 支持事务 、持久化

2、单线程操作,避免了频繁的上下文切换。

3、采用了非阻塞 I/O 多路复用机制。I/O 多路复用就是只有单个线程,通过跟踪每个 I/O 流的状态,来管理多个 I/O 流

为什么要用 Redis

高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

高并发: 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。        

Redis缓存的并发竞争问题

并发竞争,指的是同时有多个子系统去 set 同一个 key 值。

解决方案:最简单的方式就是准备一个分布式锁,大家去抢锁,抢到锁就做 set 操作即可

缓存雪崩问题

缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

解决方案:

1、给缓存的失效时间,加上一个随机值,避免集体失效。

2、使用互斥锁,但是该方案吞吐量明显下降了。

3、搭建 redis 集群。

缓存击穿问题缓存穿透

即黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而数据库连接异常。

解决方案:

1、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

2、采用异步更新策略,无论 key 是否取到值,都直接返回,value 值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。

Redis 集群

主从复制主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点,后者称为从节点), 数据的复制是单向的!只能由主节点复制到从节点(主节点以写为主、从节点以读为主)—— 读写分离。

主从复制作用
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余的方式。
故障恢复:当主节点故障时,从节点可以暂时替代主节点提供服务,是一种服务冗余的方式
负载均衡:在主从复制的基础上,配合读写分离,由主节点进行写操作,从节点进行读操作,分担服务器的负载;尤其是在多读少写的场景下,通过多个从节点分担负载,提高并发量。
高可用(集群)基石:主从复制还是哨兵和集群能够实施的基础。

为什么使用集群
单台服务器难以负载大量的请求单台服务器故障率高,系统崩坏概率大单台服务器内存容量有限。

哨兵模式

当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。为此,Redis2.8 中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。哨兵的作用就是监控 Redis 系统的运行状况,它的功能包括以下两个。

1、监控主服务器和从服务器是否正常运行。

2、主服务器出现故障时自动将从服务器转换为主服务器。

优点 哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。主从可以自动切换,系统更健壮,可用性更高。

缺点 Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值