1-3年面试题汇总一

1-3年面试题汇总一

Java基础

为什么Java中不支持多重继承?

这个问题可以通过“多重继承钻石问题”,
A foo()
/ \
/ \
foo() B C foo()
\ /
\ /
D foo()
D同时继承了B和C的所有方法,如果B和C同时继承了A中的一个方法,那么D会如何继承这个方法呢。

你能用Java覆盖静态方法吗?如果我在子类中创建相同的方法是编译时错误?

不能被覆盖也不会报错,看似是重写静态方法,实际上是方法的隐藏,因为运行时是不会解析方法的调用。
Java重写是基于运行时的动态绑定,静态方法是基于编译时的静态绑定。

Java基本类型

8种
Byte,int,char
Short,long,float,double,boolean

Java引用类型

4种
强引用、软引用、弱引用、虚引用。

一个 SpringBoot 项目能处理多少请求?

200个
Tomcat 默认核心线程数是 200。

说说:JVM,JDK,JRE

JVM 并不是只有一种!只要满足 JVM 规范,每个公司、组织或者个人都可以开发自己的专属 JVM。
JDK(Java Development Kit),它是功能齐全的 Java SDK,是提供给开发者使用的,能够创建和编译 Java 程序。
JRE(Java Runtime Environment) 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,主要包括 Java 虚拟机(JVM)、Java 基础类库(Class Library)。

为什么Java可以跨平台?

JVM可以理解的代码叫做字节码,是Java程序编译后的产物。

为什么说 Java 语言“编译与解释并存”?

因为由Java 编写的程序需要先经过编译步骤,生成字节码(.class 文件),这种字节码必须由 Java 解释器来解释执行。

编译语言,解释语言的区分

编译语言:将源码一次性编译成机器语言,编译慢,运行快,例如C语言。
解释语言:将源码一句一句解释成机器语言,解释快,运行慢,例如python。

位移运算更高效,支持哪些类型?

Int,long。
Short,byte,char位移的时候会先转换成int再位移。

静态方法为什么不能调用非静态成员?

静态方法属于类,类加载的时候创建。
非静态成员变量属于实例对象,对象实例化后才存在。

hashCode() 有什么用?

确定对象在hash表中的索引位置。

Exception 和 Error 有什么区别?

EXception:程序可以处理的异常,可以通过catch捕获。
Error:程序不可以处理的异常,Jvm会选择终止线程。

Finally中的代码一定会执行吗?

不一定,在执行finally之前出现error导致jvm终止的话,将不会执行finally中的代码。

说说反射机制

反射机制是指:在运行期间,能够获取任意一个类的属性和方法。
反射机制应用场景:动态代理,注解。

反射的优缺点

优点:使代码更灵活。
缺点:运行时能够分析操作类,增加了安全风险。

获取class对象的四种方式

1,类名.class
2,对象名.getClass()
3,Class.forname()
4,类加载器.loadClass()

说说序列化/反序列化

序列化:将数据结构或对象转换成二进制字节流的过程。
反序列化:将序列化后的字节流转换成数据结构或对象的过程

JDK自带序列化工具----serialVersionUID 有什么作用?

版本控制,反序列化后的serialVersionUID 发生变化会报错。
serialVersionUID 不指定的话,系统会自动指定。

JDK自带序列化工具----serialVersionUID 不是被 static 变量修饰了吗?为什么还会被“序列化”?

实际上serialVersionUID 并没有被序列化

JDK自带序列化工具—如果有些字段不想进行序列化怎么办?

用transient关键字修饰。

JDK自带序列化工具的缺点

1,不支持跨语言。
2,性能比较低,序列化后的字节数组体积大。
3,存在安全问题,用户可以操作反序列化的数据。

说说常用的其他反序列化工具

1,Kryo:Kryo 是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度和较小的字节码体积。

说说值传递引用传递

1,Java只有值传递。
2,值传递:方法接收的是实参值的拷贝,会创建副本。
3,引用传递:方法接收的是实参所引用对象的地址,不会创建副本。

什么是代理模式

通过代理对象代替对真实对象的访问。

代理模式的意义

在不改变目标对象的情况下,提供额外的功能操作,扩展目标对象功能。

代理模式有哪两种实现方式

动态代理,静态代理
动态代理:直接代理实现类,在运行时动态生成类字节码,并加载到jvm。
静态代理:每个方法的增强需要手动完成。

动态代理有JDK,CGLIB

1,JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。 另外, CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。
2,就二者的效率来说,大部分情况都是 JDK 动态代理更优秀,随着 JDK 版本的升级,这个优势更加明显。

Arraylist 与 LinkedList 区别?

1,Arraylist 底层是数组, LinkedList底层是双向链表。
2,Arraylist 增删慢查询快, LinkedList增删快查询慢。
3,LinkedList 存储单个元素消耗的空间比Arraylist多。
另:Arraylist 和LinkedList 都是线程不安全的集合。

说出Java中线程安全的集合

Vector,在ArrayList基础上,多了同步机制来保证线程安全。
这也导致vector的工作效率低下,因而很少使用。

说说Arraylist自动扩容

Arraylist 会自动扩容
创建一个空Arraylist 的时候空间为0,当添加第一个元素的时候空间扩充为10.
当添加到低11个元素的时候,空间扩充为原来的1.5倍左右(偶数)

LinkedList查询的逻辑

用索引值和集合的size/2比较,如果索引值大从尾开始遍历,反之从头遍历。

集合遍历的方式有哪些

For循环,foreach,iterator迭代器。

说说HashMap

HashMap底层是哈希表(链表散列),jdk1.8之后链表长度大于阈值的时候会转成红黑树,以此来减少查询时间。
HashMap在高并发的场景下面,会出现循环链表的现象。
ConcurrentHashMap可以有效解决这个问题。
ConcurrentHashMap实现线程安全的关键是segment数组,默认情况下segment数组长度是16,代表着最多支持16个线程同时写。

说说线程

线程不同于进程,同类的线程可以共享进程的堆,方法区,但是他们拥有独立的程序计数器,虚拟机栈,本地方法栈。

线程创建有几种方法

3种
继承Thread类。
实现Runnable接口。
实现Callable接口通过FutureTask包装器来创建Thread线程。

高并发场景如何保证线程安全

加锁
Java中加锁的方式有:synchronized, lock锁
synchronized可以修饰:方法,静态方法,对象,类

线程为什么有独立的虚拟机栈,本地方法栈

这样可以保证各线程的局部变量,不会被其他线程影响。

线程状态有哪些

New(初始状态),runnable(等待运行状态),blocked(阻塞状态),waiting(等待状态),time_waiting(超时等待状态),terminated(终止状态),running(运行状态)。

线程死锁的四个必要条件

请求保持条件,互斥条件,不剥夺条件,循环等待条件。

解决线程死锁的方法有哪些

破坏请求保持条件:一次性申请所有资源。
破坏不剥夺条件:当线程申请不到的资源时,主动释放掉自身已占有的资源。
破坏循环等待条件:规定线程按顺序申请资源,按反序释放资源。

常用线程池有哪些

FixedThreadPool:可重用固定线程数的线程池。
SingleThreadExecutor:只有一个线程的线程池。
CachedThreadPool:根据需要,创建新线程的线程池。
ScheduledThreadPool:在给定的延迟后运行任务或者定期执行任务。

说说sleep方法和wait方法的区别

1,sleep方法属于Thread类,wait方法属于Object类。
2,sleep方法未释放锁,wait方法释放了锁。
3,sleep方法和wait方法都是暂停当前线程。
4,sleep方法暂停的线程会自动苏醒,wait方法暂停的线程需要调用notify方法手动唤醒。

终止线程的方式

Stop方法,interrapt方法

启动线程用什么方法

Start方法启动线程。
因为直接调用Run方法,会把run方法当作普通方法运行。
而start方法会首先创建一个线程使其进入就绪状态,一旦获取到时间片后就开始运行。

说说Volitile关键字

Volitile能实现变量的可见性,但无法保证数据的原子性。

集合在高并发情境下的选用

HashMap的线程安全版本:ConcurrentHashMap
List的线程安全版本:CopyOnWriteArrayList

高并发场景下性能较好的任务队列

非阻塞任务队列ConcurrentLinkedQueue
阻塞任务队列,ArrayBlockQueue,LinkedBlockQueue(单向链表,可以定义大小也可以不定义,不定义默认大小为:Integer.MAX_VALUE)

说说AQS抽象队列同步器

AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是基于 CLH 锁 (Craig, Landin, and Hagersten locks) 实现的。

ThreadLocal是什么
线程的变量副本,每个线程隔离。
ThreadLocal为线程提供了一个公用存储空间用来存放各自的私有数据,私有数据不会被其他线程访问修改。

Java的原子类

Atomic

重载和重写的区别

重载是同一类中的同名方法根据传入的参数不同,做出不同的处理方式。
重写是当子类继承父类且子类方法与父类方法同名时,子类重新覆盖父类的该方法。

为什么浮点型运算会出现精度丢失的情况

由于计算机是2进制的,所以有些小数用2进制表示的时候,其长度计算机无法全部表示出来,所以只能截取掉一部分,最终就导致精度丢失的情况。

如何解决精度丢失问题

使用BigDecimal类运算。

构造方法能够重写吗

不能,但是可以重载。

说说深拷贝,浅拷贝

深拷贝,会拷贝对象内部的对象。
浅拷贝不会,浅拷贝会公用同一个内部对象。

说说String,StringBuff,StringBuild

安全性:String线程安全,StringBuff线程安全,StringBuild线程不安全
性能:String<StringBuff<StringBuild

String为什么是不可变的

类被Final修饰

字符串拼接使用+和使用StringBuild的区别

String通过+进行拼接,底层是通过StringBuild实现的拼接,而且过程中会创建多个StringBuild对象。
StringBuild实现字符串拼接不会出现这个问题。

String的equals和Object的equals有何区别

String的equals是对Object的equals的重写,是比较字符串的值。
Object的equals比较的是两个对象的内存地址。

说说Java IO字节流,字符流

字节流有InputStream,OutputStream。
字符流有reader,writer。
Java虚拟机最小的传输单位是字节。
字符流存在原因:使用字节流且不知道编码类型的情况下,很容易出现乱码的情况。

Java的Stream流是什么

Stream流是一种顺序的元素集合,它支持类似于SQL语句的操作,如过滤、映射、排序等。通过使用Stream流,我们可以以声明式的方式对数据进行处理,而不需要关心具体的实现细节。

Java的Stream流特点

Stream流不存储数据,而是通过管道传输数据。
Stream流可以操作任何数据源,如集合、数组、I/O通道等。
Stream流可以进行串行操作和并行操作

Java的Stream流使用方式

创建流:可以从集合、数组、I/O通道等数据源中创建Stream流。
中间操作:对流进行一系列的转换和操作,如过滤、映射、排序等。
终端操作:从流中获取结果,如聚合、收集、遍历等。

计算机网络

从输入URL到页面显示发生了什么?

1,DNS解析
2,建立TCP连接
3,发送http请求
4,服务器处理请求,返回http报文
5,浏览器解析渲染页面
6,连接结束

说几个常见网络协议

1,HTTP协议:超文本传输协议
2,Telnet协议:远程登录协议
3,Ssh协议:安全的网络传输协议
4,Rtp协议:实时传输协议
5,Pop3/imap协议:邮件接收协议

HTTP和HTTPS的区别

1,端口号:HTTP 默认是 80,HTTPS 默认是 443。
2,URL 前缀:HTTP 的 URL 前缀是 http://,HTTPS 的 URL 前缀是 https://。
3,安全性和资源消耗:HTTP 安全性没有 HTTPS 高,但是 HTTPS 比 HTTP 耗费更多服务器资源。
4,SEO(搜索引擎优化):搜索引擎通常会更青睐使用 HTTPS 协议的网站

DNS的作用是什么

DNS(Domain Name System)域名管理系统,是当用户使用浏览器访问网址之后,使用的第一个重要协议。DNS 要解决的是域名和 IP 地址的映射问题。

TCP协议和UDP协议是基础协议,其他协议运行于这两个协议之上

TCP协议和UDP协议的区别

1,数据传输之前,TCP需要建立连接,UDP不需要。
2,TCP能保证传输准确性,UDP不能。
3,TCP有状态,UDP无状态。
4,TCP传输效率上比UDP低很多。
5,TCP传输格式上面向字节流,UDP面向报文。
6,TCP 只支持点对点通信,UDP 支持一对一、一对多、多对一、多对多。

TCP协议和UDP协议的应用场景

TCP协议:用于对数据传输准确性要求较高的场景。如:文件传输,邮件接收,远程登陆等。
UDP协议:用于即时通信。如:语音,视频,直播等。

详细说说TCP的三次握手

第一次握手:客户端发送带有SYN标志的数据包给服务端,客户端进入SYN_SEND状态。
第二次握手:服务端发送带有SYN和ACK标志的数据包给客户端,服务端进入SYN_RECV状态。
第三次握手:客户端发送带有ACK标志的数据包给服务端,客户端和服务端都进入ESTABLISHED状态。

TCP/IP四层模型是哪四层

应用层,传输层,网络层,网络接口层。
应用层:提供信息交互服务,定义信息交互格式。
传输层:提供通用的数据传输服务。
网络层:为分组交互网上的不同主机,提供信息通信服务。
网络接口层:提供数据(数据报组成的帧)组装和传输服务。

一台计算机最多建立多少连接

65535
因为tcp协议的端口号是16位。

数据库

主键和外键的区别

主键:不能为空,不可重复,一个表只能有一个主键。
外键:可以为空,可重复,一个表可以有多个外键。

说说数据库3种范式

第一范式:属性不可分。
第二范式:在第一范式的基础上,消除了非主属性对码的函数依赖。
第二范式:在第二范式的基础上,消除了非主属性对码的传递函数依赖。

什么是存储过程

存储过程时SQL的集合,中间加了一些控制语句。
在业务场景比较复杂的时候存储过程非常实用。

Drop,truncate,delete的区别

Drop:删除表。
Truncate:清空表。
Delete:删除表的指定行。

数据库设计步骤

  1. 需求分析 : 分析⽤户的需求,包括数据、功能和性能需求。
  2. 概念结构设计 : 主要采⽤ E-R 模型进⾏设计,包括画 E-R 图。
  3. 逻辑结构设计 : 通过将 E-R 图转换成表,实现从 E-R 模型到关系模型的转换。
  4. 物理结构设计 : 主要是为所设计的数据库选择合适的存储结构和存取路径。
  5. 数据库实施 : 包括编程、测试和试运⾏
  6. 数据库的运⾏和维护 : 系统的运⾏与数据库的⽇常维护。

MySQL的组成部分

连接器,缓存查询器,分析器,优化器,执行器,存储引擎。

SQL和NOSQL的区别

1,数据存储模型:SQL结构化存储,NOSQL非结构化存储。
2,数据查询语句:SQL结构化查询语句,NOSQL非结构化查询语句。

NOSQL的数据库有那些类型

1,文档。
2,键值对。
3,图。
4,宽列。

MySQL常用字符集编码

utf-8,utf-8mb4,其中utf-8mb4能够表示emoji符号和复杂的汉字。

MySQL的字段类型

1,数字:整型(tinyint、smallint、mediumint、int 和 bigint)、浮点型(float 和 double)、定点型(decimal)。
2,字符串:char、varchar、tinytext、text、mediumtext、longtext、tinyblob、blob、mediumblob 和 longblob 等,最常用的是 char 和 varchar 。
3,日期时间:year、time、date、datetime 和 timestamp 等。

decimal 和 float/double 的区别是什么?

decimal 是定点数,float/double 是浮点数。
decimal 可以存储精确的小数值,float/double 只能存储近似的小数值。

Null和空字符串的区别

1,空字符串不占用空间,null占用空间。
2,Null是不确定值,空字符串是确定的值。

MySQL的存储引擎是基于表还是数据库?

基于表。

MyISAM和InnoDB两个存储引擎的区别
1,MyISAM仅支持表级锁,InnoDB支持行级锁。
2,MyISAM不支持事务,InnoDB支持事务。
3,MyISAM不支持外键,InnoDB支持外键。
一般情况用InnoDB,性能较好。

什么是事务

事务本质上是一组操作,要么全都执行,要么都不执行。

事务的4大特性

原子性,持久性,一致性,隔离性。
原子性:事务是最小的执行单位。
一致性:事务执行前后,数据一致。
持久性:事务一旦提交,数据无法改变。
隔离性:一个用户的事务,不会被其他用户的事务影响。
事务只有满足的原子性,持久性,隔离性,才能实现一致性。

MySQL如何使用事务

start transaction;
.........
commit;

事务在高并发场景下会带来哪些问题

脏读,幻读,不可重复读。

事务隔离级别

READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
SERIALIZABLE(可串行化):最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
注:MySQL的默认隔离级别是:可重复读。
注:可串行化隔离级别下,不会出现脏读,幻读,不可重复读。

索引的优点(作用)

1,提升数据库查询速度。
2,保证每一行数据的唯一性。

常见的索引有哪些

1,主键索引:唯一,不为null。
2,唯一索引:唯一。
3,普通索引
4,全文索引:对文本的内容进行分词,进行搜索。目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。一般不会使用,效率较低,通常使用搜索引擎如 ElasticSearch 代替。
5,联合索引:使用表中多个字段创建的索引。
6,覆盖索引:不常见,需要查询的字段正好是索引的字段。

主键索引和唯一索引的区别

主键索引不能为null,唯一索引可以为null。

MySQL的常见日志

二进制日志(bin log):用于MySQL数据库的数据备份。
事务日志(redo log):用于MySQL崩溃恢复。
回滚日志(undo log):用于支持恢复机制。

MySQL的表级锁和行级锁

表级锁:针对非索引字段加的锁,对当前操作的整张表加锁,锁粒度最大,加锁快消耗少,但是并发度低。
行级锁:针对索引字段加的锁,对当前操作的行记录加锁,锁粒度最小,加锁慢消耗多,但是并发度高。
注:当开发中遇到update,delete,后面的where条件中索引字段失效的时候,MySQL会给表中所有字段加锁。

MySQL的共享锁和排他锁

共享锁:事务在读取记录的时候获取共享锁,允许多个事务同时获取。
排他锁:事务在修改记录的时候获取排他锁,不允许多个事务同时获取。

MySQL的性能优化

1,存储大型文件的时候,只存储大型文件的地址。
2,对查询进行优化,尽量避免全表扫描。
对where,order by涉及的列建立索引。
避免对索引字段进行null判断,否则会放弃使用索引。
避免对索引字段使用!=,<>运算符,否则会放弃使用索引。
避免对索引字段使用in,not in判断,否则会放弃使用索引。

MySQL的性能优化法则

1,返回更少的数据量。
2,减少数据访问。
3,减少交互次数。
4,创建并正确使用索引。
5,优化SQL执行计划。

MySQL如何分析SQL的性能

我们可以使用 EXPLAIN 命令来分析 SQL 的 执行计划 。执行计划是指一条 SQL 语句在经过 MySQL 查询优化器的优化会后,具体的执行方式。

MySQL的读写分离

什么是读写分离

读写分离主要是为了将“对数据库的读写操作”分散到不同的数据库节点上。

如何实现读写分离

一般采用“一主多从”的架构,主节点负责写,从节点进行读。
主节点和从节点之间保持数据同步。

在项目中如何让实现读写分离

1,第三方组件的方式:ShardingSphere。
2,代理方式:在数据和应用之间添加一个代理,代理负责分离读写请求,然后将请求路由到指定的服务器。

读写分离带来的问题以及如何解决

问题:主从同步延迟问题。
解决方法
1,强制将请求路由到主库。
2,延迟读取。

MySQL的分库分表

分库分表的意义

缓解数据库的存储压力。

什么时候需要分库分表

1,单表的数据量到达千万级。
2,系统并发量太大。

什么是分库

分库分为:垂直分库,水平分库。
垂直分库:每个业务表放到一个数据库。
水平分库:一个业务表放到多个数据库。

什么是分表

分表分为:垂直分表,水平分表
垂直分表 是对数据表列的拆分,把一张列(字段)比较多的表拆分为多张表。
水平分表 是对数据表行的拆分,把一张行(记录)比较多的表拆分为多张表,

分库分表会带来哪些问题

1,事务问题:同一个操作涉及多个不同的数据库的时候,数据库事务将无法满足需求。
2,分布式id,遍布在不同服务器上的数据库,通过主键自增无法满足id唯一。

第三方组件实现分库分表

ShardingSphere 绝对可以说是当前分库分表的首选!ShardingSphere 的功能完善,除了支持读写分离和分库分表,还提供分布式事务、数据库治理等功能。

Redis

Redis为什么这么快?

1,redis数据存储在内存。
2,Redis内置了优化后的数据结构。
3,Redis基于Reactor模型设计了一套高效的事件处理模型

Redis和Memcatched的区别

1,Rdie支持更丰富的数据结构k/v,list,set,zset,hash。Memcached仅支持k/v数据结构。
2,Redis支持数据持久化可以将数据存储到磁盘,Memcatched只能存储到内存。
3,Redis使用的模型是单线程多路IO复用,Memcatched使用的模型是多线程非阻塞IO复用。

Redis除了做缓存还能做什么

1,分布式锁:用redis做分布式锁,我们都是基于redission实现分布式锁。
2,限流:通常情况下我们通过redis和lua脚本来实现限流。
3,消息队列:作为消息队列的时候效率很低,不推荐使用。

Redis为什么不使用多线程

单线程编程容易并且更容易维护;
Redis 的性能瓶颈不在 CPU ,主要在内存和⽹络;
多线程就会存在死锁、线程上下⽂切换等问题,甚⾄会影响性能。

如何使用redis实现简单分布式锁

# 添加锁
setnx key value;

# 释放锁
del key;

# 设置过期时间
EX 过期时间(单位:秒)

Redisson实现redis分布式锁

Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟

分布式锁的实现方式

1,基于MySQL实现。
2,基于zookeeper实现。
3,基于redis实现。

Redis的数据类型

String,hash,list,set,zset

Redis的数据类型string和hash对比

1,string存储的是整个对象,hash将对象的字段单独存储。
如果系统需要频繁修改/查询个别字段,hash结构更好。
2,hash存储数据占用的空间比string多出一倍。
如果系统对资源消耗敏感,string结构更好。

Redis有几种数据存储方式分别是什么?

3种,分别是:RDB快照,AOF持久化, RDB和AOF的混合持久化。

Redis默认存储方式

RDB快照

什么是RDB快照

redis可以通过创建快照,来获取存储在内存中某个时间节点数据的副本。
RDB快照会将数据存储在内存。

RDB创建快照会阻塞主线程吗

Redis提供了2个命令创建RDB快照。
Save:同步操作执行,会阻塞redis主线程。
Bgsave(默认命令):会fock出一个子线程执行,不会阻塞主线程。

什么是AOF持久化

Redis开启AOF之后,每次执行更改redis数据的命令,首先redis会将命令写入aof缓冲区,然后再写到aof文件,最后根据持久化方式的配置将将缓冲区的数据同步到本地磁盘。

如何开启AOF持久化

将参数appendonly配置为yes。

AOF持久化方式有几种分别是哪些?

3种
1,Appendfsync always:主线程调用write之后,立即刷盘(调用fsync函数同步AOF文件)。
2,Appendfsync everysec:主线程调用write之后,每隔1秒刷盘一次。
3,Appendfsync no:主线程调用write之后,让操作系统决定何时刷盘。

RDB和AOF的对比

RDB的优势:
1,RDB存储的是二进制,体积比较小。AOF存储的是命令,体积比较大。
2,RDB恢复数据直接解析还原数据,恢复速度很快。AOF需要逐步执行每条命令,恢复速度很慢。
AOF的优势:
1,AOF的安全性高于RDB。
2,AOF存储的命令是易于理解的格式,可以直接操作AOF命令解决一些问题。

Redis如何遍历海量数据

使用scan命令,scan虽然复杂度也是O(n),但是它通过游标分步进行,不会阻塞线程。
Scan用法:SCAN cursor [MATCH pattern] [COUNT count]
实例:scan 0 match user_token* count 5
0是游标,user_token*是模糊匹配,5是查询5条记录

SpringBoot

常用的springboot注解

SpringBootApplication
EnableScheduling
EnableTransactionManagement

RestController
GetMapping
PostMapping
RequestBody
RequestParam
PathVariable

Repository
Service
Autowired
Commpent
Bean

Scheduled
Transactional

Scheduled注解的参数有哪些有什么用

cron,类型是String的正则表达式,用来定义定时规则。

SpringBootApplication用的什么设计模式

Spring

列举一些重要的Spring模块?

spring-bean:提供对bean的创建,配置,管理的支持。
spring-core:提供核心工具类
spring-aop:提供面向切面变成的实现。
spring-jdbc:Java数据库连接。
spring-jms:Java消息服务
spring-web:创建web应用程序。
spring-test:程序测试

谈谈对ioc的理解

将对象的控制权交给spring管理。

什么是spring bean

Ioc容器中被管理的对象。

将一个类声明为bean的注解有哪些?

@Compent
@Repository
@Controller
@Service

@Compent注解和@Bean的区别

1,@Compent作用于类,@Bean作用于方法。
2,有些情况下只能用@Bean,例如引入第三方库中的类,装配到spring容器里。

两种依赖注入方式

@Autowired
@Resource

@Autowired和@Resource的区别

1,@Autowired属于spring,@Resource属于Java。
2,@Autowired先根据类型查找,如果存在多个bean,再根据名称查找。
@Resource先通过名称查找,如果名称查不到,再根据类型查找。
3,@Autowired支持属性注入,构造方法注入,Setter注入。
@Resource支持属性注入,Setter注入。

Bean的作用域有哪些

1,singleton:ioc中只有唯一的bean实例。
2,Prototype:每次获取,都会创建一个新的bean实例。
3,Request:每次http请求,都会创建一个新的bean。
4,Session:每一次来自新session的http请求,都会创建一个新的bean。
5,Application/globe-session:每个web应用在启动时,都会创建一个新的bean。
6,Websocket:每一次websocket会话,都会创建一个新的bean。

Bean的生命周期

1,Bean 容器找到配置文件中 Spring Bean 的定义。
2,Bean 容器利用 Java Reflection API 创建一个 Bean 的实例。
3,如果涉及到一些属性值 利用 set()方法设置一些属性值。
4,如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入 Bean 的名字。
5,如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。
6,如果 Bean 实现了 BeanFactoryAware 接口,调用 setBeanFactory()方法,传入 BeanFactory对象的实例。
7,与上面的类似,如果实现了其他 *.Aware接口,就调用相应的方法。
8,如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
9,如果 Bean 实现了InitializingBean接口,执行afterPropertiesSet()方法。
10,如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
11,如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
12,当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
13,当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。

谈谈对AOP的理解

aop是指面向界面编程。
aop能够降低代码模块之间耦合,提升代码的可扩展性,可维护性。
spring aop是基于动态代理实现,如果代理的对象实现了某个接口就会使用JDK Proxy,如果代理的对象没有实现接口Cglib会生成一个代理对象的子类。

aop使用过程中涉及到的术语

1,目标:被通知的对象。
2,代理:通知目标对象之后的代理对象。
3,连接点:目标对象所属类中所有方法。
4,切入点:被增强的连接点。
5,通知:增强的逻辑/代码。
6,切面:接入点+通知。
7,织入:将通知应用到目标对象,进而生成代理对象的过程动作。

Spring aop和AspectJ aop的区别

1,Spring aop基于代理实现,AspectJ aop基于字节码实现。
2,Spring aop运行时增强,AspectJ aop编译时增强。
3,Spring aop使用更简单,但是功能不够强大,性能不够好;AspectJ aop使用较复杂,但是功能强大,性能较好。

AspectJ的通知类型有哪些

前置通知,后置通知,环绕通知,返回通知,异常通知。

AspectJ aop如何控制通知的顺序

通过注解@Order( int number )

Spring框架用到哪些设计模式

1,工厂模式:使用工厂模式,通过beanfactory,applicationcontext创建bean。
2,动态代理模式:使用动态代理模式实现spring aop。
3,单例模式:spring中的bean默认就是单例。
4,模板方法模式:spring中jdbctemplate等就是使用的模板方法模式。
5,适配器模式:spring mvc中就用到了适配器模式。

Spring有几种管理事务的方式,有哪些?

1,编程式事务:在代码中通过TransactionTemplate,TransactionManager手动管理事务。
2,声明式事务:基于注解@Transactional自动管理事务。

@Transactional注解的使用

1,作用于类:该类的所有public方法都具有事务属性。
2,作用于方法:该方法具有事务属性。
具有事务属性的方法,一旦抛出异常就会回滚。

spring事务如何使用

使用@Transaction注解,作用在类上/public方法上。

Spring事务失效的场景

1,数据库不支持事务:例如使用MySQL数据库时存储引擎选用myisam。
2,事务方法未被spring管理:事务方法所在的类没有被加入spring ioc容器。
3,事务方法没有被public修饰。
4,事务方法被同一个类下的方法调用。
5,项目未配置事务管理器。

Spring MVC

Spring mvc核心组件有哪些

1,DispatcherServlet:核心的中央处理器,负责接收请求,发送响应给客户端。
2,HandlerMapping:处理器映射器,根据uri匹配handler。
3,HandlerAdapter:处理器适配器,根据HandlerMapping适配执行handler。
4,Handler:处理器,处理实际请求。
5,ViewResoler:视图解析器,解析handler返回的视图,传递给dispatchservlet响应到客户端。

Spring Data JAP

如何指定实体类中不被持久化的字段

通过注解@Transient

Mybatis

$和#的区别

1,#传入的时候会自动加上引号,$传入的时候会直接传入。
2,#可以有效的防止sql注入问题。

有哪些动态sql

1,
2,
3,
4,
5,

一级缓存和二级缓存

一级缓存是sqlsession级别的缓存。
二级缓存是mapper级别的缓存,多个sqlsession可共用二级缓存,缓存范围更大。

系统设置–权限认证

RBAC模型了解吗
RBAC即角色权限控制
在RBAC模型中,一个用户可以有多个角色,每个角色可以分配多个权限。
这样使得角色和权限相关联,用户想获得某些权限可以通过分配角色实现,极大的简化了权限的控制

Cookie是什么,有什么用

cookie是网站为了用来辨别用户身份,而存储在用户本地终端的数据。
Cookie存放在客户端,存储用户信息。

Cookie和session有什么区别

Cookie的数据存储在客户端,session的数据存储在服务端。

Session-cookie方案实现身份验证

1,用户向服务器发送用户名、密码、验证码用于登陆系统。
2,服务器验证通过后,服务器为用户创建一个 Session,并将 Session 信息存储起来。
3,服务器向用户返回一个 SessionID,写入用户的 Cookie。
4,当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。
5,服务器可以将存储在 Cookie 上的 SessionID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回用户当前的状态。

Session-cookie方案劣势

无法规避CSRF(跨域请求伪造)攻击,token可以。

JWT是什么

目前比较流行的跨域认证解决方案,是一种基于token的认证授权机制。

JWT的组成

JWTz本质上是一个字符串,各部分通过“.”分割。
组成部分如下:
1,Header:定义签名算法,token类型。
2,Payload:存放实际要传输的数据。
3,Signature:签名。

JWT为什么不会有CSRF风险

因为token不会存储在cookie,而是存储在localstorage里面。

什么是单点登录SSO

用户登陆多个子系统中的一个,可以有权访问与其相关的其他系统。

如何实现单点登录

1,用户登陆之后生成autotoken,并存储到客户端(建议存储在redis,可以解决跨域登陆问题)。
2,用户后续浏览需要登陆的页面时,将autotoken交给sso服务校验。

系统设置–定时任务

单机情况下的定时任务技术选择
Timer,ScheduledExecutorService ,spring task(@Schedule)。
spring task能够使用cron表达式,Timer,ScheduledExecutorService不能使用。

分布式下的定时任务

Quartz,Elastic-Job,XXL-Job,Power-Job。

Quartz的优缺点

优点:可以与 Spring集成,并且支持动态添加任务和集群。
缺点:分布式支持不友好,没有内置 UI 管理控制台。

系统设置–消息推送

消息推送有哪些方案?

短轮询,长轮询,websocket,iframe流,SSE,MQTT

短轮询是什么?

客户端向服务端发送请求时,服务端立即做出响应。

长轮询是什么?

客户端向服务端发送请求时,服务端先确认数据有无更新,再做出响应。

websocket是什么?

让客户端和服务端建立tcp连接,进行通信。

iframe流是什么?

客户端服务端之间建立长连接,服务端持续向客户端传输数据。

SSE是什么?

仅支持服务端到客户端单向消息推送。

MQTT是什么?

基于发布/订阅的轻量级通讯框架。

分布式

分布式id的目的?

为不同的数据节点,分配全局唯一的主键。

分布式id的解决方案

1,数据库的id自增:在数据库层面设置主键自增。
2,数据库的号段模式:将id先放到内存,后面一次性请求数据库。
3,Redis键自增:将id存储到redis的set结构集合里面。
4,算法:s’nowflake(雪花算法),UUID算法。
5,框架:UidGenerator(百度的开源框架),leaf(美团的开源框架)。

分布式id应用场景

1,订单系统:一码多付,订单号,优惠卷/兑换卷。
2,Tracing(跟踪):日志跟踪。
3,短网址:原来很长的网址通过短网址服务即可生成相应的短网址,避免折行或超出字符限制。

分布式锁应该具备的条件

1,互斥:任意时刻,锁只能被一个线程持有。
2,可重入:一个节点获取锁之后,还可以再次获取锁。
3,非阻塞:线程获取不到锁时,不会无限等待下去。
4,高可用:一个锁出现问题,自动切换到其他锁。
5,高性能:获取,释放锁应该快速完成。

实现分布式锁的方式有哪些

基于:MySQL,zookeeper,redis。

Redis如何实现分布式锁

设置锁:SETNX
删除锁:DEL

Redis如何实现分布式锁,为什么要设置过期时间,怎么设置

例:SET lockKey uniqueValue EX 3 NX
设置过期时间,可以有效防止锁无法释放的问题。

分布式事务的4种解决方案有哪些

1,两阶段提交
2,补偿事务(TCC)
3,本地消息表
4,MQ事务消息

什么是分布式事务

不同分布式系统节点的事务参与者,保证操作要么全部成功要么全部失败。

事务的4大特性有哪些

原子性,持久性,一致性,隔离性。

Dubbo

Dubbo的核心角色有哪些

注册中心,监控中心,服务提供者,服务消费者。

注册中心的作用

负责服务地址的注册与发现,相当于目录服务。
服务的提供者,消费者,只在服务启动的时候与注册中心交互。

服务的提供者宕机之后注册中心做什么?

立即推送事件通知消费者。

监控中心的作用

统计服务的调用次数,调用时间。

如果注册中心监控中心都宕机服务会挂掉吗

不会
服务消费者在本地缓存了服务提供者列表,即使注册中心监控中心都宕机,服务消费者也可以通过直练服务提供者来保证服务正常使用。

Dubbo的负载均衡策略有哪些

1,RandomLoadBalance:根据权重随机选择,是dubbo的默认负载均衡策略。
2,LeastActiveLoadBalance:最小活跃数负载均衡,活跃数越小会优先分配请求。
3,ConsistentHashLoadBalance:一致性哈希负载均衡,根据参数来选择服务提供者(相同参数的请求会被分配到同一个服务提供者)。
4,RoundRobinLoadBalance:加权轮询负载均衡,在轮询的基础上,让更多的请求落到权重更大的服务提供者上面。

Dubbo默认的序列化协议是什么?

Hessian2

Dubbo官方推荐的序列化协议是什么?

Kryo

什么是RPC

远程过程调用

为什么要使用RPC

两个服务器上的服务提供的方法由于不在同一个内存,所以无法直接调用。需要我们进行网络编程,但是手动网络编程需要考虑底层传输方式,序列化方式等,工作量很大。
通过RPC我们可以实现像调用本地方法一样调用远程方法而且不用考虑使用何种传输方式。

说说RPC框架有哪些

Dubbo,motan,grpc,thrift

Zookeeper

Zookeeper是什么

开源的分布式协调服务

Zookeeper的4个特性

1,顺序一致性:
2,原子性:
3,单一系统映像:
4,可靠性:

Zookeeper的应用场景

命名服务:
数据发布订阅:
分布式锁:

输送或常用集群模式–主备模式

在这种模式下,主服务器提供写服务,从服务器通过异步复制的方式,从主服务器复制最新的数据提供读服务。

说说Zookeeper集群模式

Zookeeper的集群中有三个角色:leader,follower,observer。
Leader:提供读,写服务。
Follower,observer:只提供读服务。
Observer不参与leader的选举。

说说zookeeper集群为什么最好奇数台

因为奇数和偶数,集群允许宕掉的机器数是(n-1)/2,n代表的是机器数。
也就是说假如机器数是3/4台时,允许宕机的机器数都是1。

什么是集群 的脑裂

部署在不同机房的集群由于网络故障,导致各个机房内的集群自主的选举出leader。
脑裂会造成集群的一致性问题。

Zookeeper如何解决的集群脑裂问题

过半机制,是zookeeper的解决办法。
过半机制:在一个集群要选举新leader的时候,如果当前新集群机器数小于或等于原来集群机器数的时候,不进行新leader的选举。

Zookeeper保证数据一致性的算法是什么?

ZAB协议,paxos算法
其中核心算法是ZAB协议:是一种特别为 Zookeeper 设计的崩溃可恢复的原子消息广播算法。

Zookeeper底层提供的两个功能是什么?

管理:存储,读取客户端提交的数据。
监听:为客户端提供,数据节点监听服务。

Zookeeper的znode(数据节点)中数据存储在哪?

内存。

负载均衡

为什么要使用负载均衡

负载均衡可以将用户的请求分发到不同的处理器上,以此提高系统整体的并发能力和可靠性。

负载均衡有哪几种

服务端负载均衡:主要应用在系统外部请求和网关层之间。
客户端负载均衡:主要应用于系统内部的不同的服务之间,可以通过现有的负载均衡组件来实现。

负载均衡常见的算法

1,随机算法:如果没有配置权重的话,所有的服务器被访问到的概率都是相同的。如果配置权重的话,权重越高的服务器被访问的概率就越大。
2,轮询算法:如果没有配置权重的话,每个请求按时间顺序逐一分配到不同的服务器处理。如果配置权重的话,权重越高的服务器被访问的次数就越多。
3,一致性hash算法:相同参数的请求总是发到同一台服务器处理。
4,最小连接算法:遍历服务器节点列表,并选取其中活动连接数(当前正在处理的请求数)最小的一台服务器来响应当前请求。

消息队列

什么是消息队列

存放消息的队列/容器。

消息队列的意义

1,降低系统耦合。
2,通过异步处理,提高系统性能。
3,削峰/限流:消息队列将系统短时间高并发产生的消息存储起来,随后后端服务根据自生能力慢慢消费

主流的消息队列有哪些

Kafka:基于发布订阅的消息队列,数据会存储到本地磁盘有效的避免了消息丢失的风险。
RabbitMQ:一款具有易用性,扩展性,可靠性,高可用性特点的消息队列。
RocketMQ:阿里开源的一款云原生“消息、事件、流”实时数据处理平台。
ActiveMQ:性能比较差,而且版本迭代很慢。

使用消息队列的缺点

1,系统的复杂度提高。
2,系统可用性下降。
3,一致性问题。

RPC和消息队列对比

1,用途不同:
RPC用于:两个服务器的远程通信。
消息队列用来:降低系统耦合,实现任务异步,有效的进行流量削峰。
2,处理请求的时效性
RPC发出的调用一般会被立即处理。
存在消息队列中的消息并不一定被立即处理。
3,通信方式不同:
RPC是双向直接网络通信。
消息队列是单向引入中间载体的网络通信。

什么是JMS

JMS(JAVA Message Service,java 消息服务)是 Java 的消息服务,JMS 的客户端之间可以通过 JMS 服务进行异步的消息传输。

什么是AMQP

高级消息队列协议(二进制应用层协议),是应用层协议的一个开放标准,为面向消息的中间件设计,兼容 JMS。

说说Kafka的多副本机制,和它的意义

Kafka为分区(partition)引入了多副本(replica)机制。
在这些副本中有一个leader和多个follower。
我们发送消息会先到leader之后,其他的follwer才会从leader中复制。
如果副本出现故障,系统会从follwer中选出新的leader,保证数据的安全。
Follwer中和leader同步程度达不到的话,将不会参与leader的选举。

Zookeeper在kafka中的作用

1,注册topic
2,注册broker
3,负载均衡:Kafka 通过给特定 Topic 指定多个 Partition,各个 Partition 可以分布在不同的 Broker 上。

Kafka如何保证消息不丢失

通过判断发送消息的返回值。
代码效用如下:
kafkaTemplate.send(topic, o).get();

Kafka如何保证消息的顺序性

1,一个topic只对应一个partition。
2,(更推荐)发消息的时候指定key,partition。

如何解决消息堆积问题

1,检查消费者是否大面积报错。
2,增加消费者,提升消息的消费能力。

如何解决消息的重复消费

幂等
对同一个消息执行多次,结果都不变。

Kafka为什么那么快

1,零拷贝:直接在内核空间进行数据传输。
2,仅追加消息结构:将数据以顺序追加的方式写入到文件。
3,消息批处理:kafka的发送端,接收端都引入了缓冲区,将消息打包成一个批次,批量发送/接收。

高可用

提升系统高可用的方法有哪些

1,使用集群:避免单点故障。
2,限流:避免瞬时流量高峰冲垮系统。
3,超时重试机制:提升系统响应速度。(注意避免重试次数一般不超过3次)
4,熔断机制:系统自动收集所依赖服务的资源使用情况,当被依赖的服务恶化的时候,系统自动切换服务。
5,异步调用
6,缓存

工具

Git

合并分支命令
git merge
如何解决代码冲突问题
git mergetool
拉取代码命令
git pull
提交代码命令
git add	// 暂存
git commit	// 提交
git push	// 推送到远程仓库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值