2021Java面试题汇总全剧终?含答案及十八套面试题免费下载
Posted 白大锅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021Java面试题汇总全剧终?含答案及十八套面试题免费下载相关的知识,希望对你有一定的参考价值。
目录
- 前言
- 一、Java面试之MyBatis
- 什么是MyBatis?
- 讲下MyBatis的缓存
- Mybatis是如何进行分页的?分页插件的原理是什么?
- 简述Mybatis的插件运行原理,以及如何编写一个插件?
- Mybatis动态sql是做什么的?都有熟些动态sql?能简述一下动态sql 的执行原理不?
- #{}和${}区别是?
- 为什么说Mybatis是半百动ORM映射工具?它与全自动的区别在熟里?
- Mybatis是否支持延迟加裁?如果支持,它的实现原理是什么?
- MyBatis的好处是什么?
- 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
- 什么是MyBatis的接口绑定,有什么好处?
- 接口绑定有几种实现方式,分别是怎么实现的?
- 什么情况下用注解绑定,什么情况下用xml绑定?
- MyBatis实现一对'一有几种方式?具体怎么操作的?
- MyBatis里面的动态Sql是怎么设定的?用什么语法?
- Mybatis是如何将SQI执行结果封装为目标对象并返回的?都有哪 些映射形式?
- Xml映射文件中,除了常见的select insert updae delete标签之 外,还有哪些标签?
- Mybatis中如何指定使用型一种Executor执行器?
- Mybatis执行批量插入,能返回数据库土键列表吗?
- Mybatis是否可以映射Enum枚举类?
- 如何获家自动生成的(主)键值?
- 在mapper中如何传递多个参数?
- resultType resultMap的区别?
- 二、Java面试之Dubbo
- 三、Java面试之微服务
- 四、Java面试之Linux
- 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
- 怎么查看当前进程?怎么执行退出?怎么查看当前路径?
- 怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户 id?查看指定帮助用什么命令?
- Ls 命令执行什么功能?可以带哪些参数,有什么区别?
- 建立软链接(快捷方式),以及硬链接的命令?
- 目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
- 查看文件内容有哪些命令可以使用?
- 随意写文件命令?怎么向屏幕输出带空格的字符串,比如 ” hello world ” ?
- 终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
- 移动文件用哪个命令?改名用哪个命令?
- 使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?
- 五、Java面试之Nginx
- 六、Java面试题之总结 ?
前言
学而不思则罔 思而不学则殆 大家好 众所周知 IT行业发展史日新月异 我们程序员也是 不是在面试 就是在面试的路上 今天博主为大家爆肝总结了常见的一些面试题 希望对大家有所帮助
直接奉上博主十年珍藏的面试题库 永久有效 免费下载
链接:面试题50套
提取码:oy80
一、Java面试之MyBatis
什么是MyBatis?
MyBatis是一个可以自定义SQL存储过程和高级映射的持
久层框斐。
讲下MyBatis的缓存
MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面, 默认就有,二级缓存放在它的命名空间星,默认是不打开的,使用二级缓存属性 类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映 射文件中配置
Mybatis是如何进行分页的?分页插件的原理是什么?
1.Mybatis使用RowBounds对象进行分页,也可以直接编写SQL实现分 页,也可以使用Mybatis的分页插件。
2.分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的 拦截方法内拦截待执行的SQL,然后重写SQL
举例:select * from student,拦截.SQI 后重写为:
select t. * from (select * from student) t limit 0, 10
简述Mybatis的插件运行原理,以及如何编写一个插件?
1.Mybatis 仅可以编写针对ParameterHandler.ResultSetHandler. StatementHandler. Executor这4科接口的插件,Mybatis通过动态代理, 为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这4种接 口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的 invoke。方法,当然,只会拦截那些你指定需要拦截的方法。
2.实现Mybatis的Interceptor接口并复写intercept0方法,然后在给插 件编写注解,指定要拦截熟一个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。
Mybatis动态sql是做什么的?都有熟些动态sql?能简述一下动态sql 的执行原理不?
1)Mybatis动态SQL可以让我们在Xml映射文件内,以标签的形式编写动态 SQL,完成逻辑判断和动态拼接SQL的功能。
2) Mybatis提供了 9种动态SQI标签:
trim | where | set | foreach | if | choose | when | other | wise |bind
#{}和${}区别是?
1.#{}是预编译处理,而${}是字符串替换
2.Mybatis在处理#{}时, 会将sql中#{}替换为?好,调用PrepareStatement的set方法来赋值
3.Mybatis在处理
时
,
就
是
把
{}时,就是把
时,就是把{}替换成变量的值。
4.使用#{}可以有效的防止SQL注入,提高系统安全性。
为什么说Mybatis是半百动ORM映射工具?它与全自动的区别在熟里?
Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者 关联集合对象对,可以根据对象关系模型直接获家,所以它是全自动的。而 Mybatis在查询关联对象或关联集合对象时,需要手动编写SQL来完成,所 以,称之为半百动ORM映射工具。
Mybatis是否支持延迟加裁?如果支持,它的实现原理是什么?
1.Mybatis仅支持association关联对象和collection关联集合对象的延 迟加戴,association指的就是一对’ 一,collection指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载lazjrLoadingEnabled=true |false。
2.它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a. getB(). getNameO ,拦截器invoke。方法发现 a. getB()*null值,那么就会单独发送事先保存好的查询关联B对象的 SQI,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了, 接着完成a.getBO.getYameO方法的调用。这就是延迟加裁的基本原理。
MyBatis的好处是什么?
1)MyBatis把SQI语句从Java源程序中独立出来,放在单独的XML文件中 编写,给程序的维护带来了很大便利。
2) MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了 Java数据库编程的重复工作。
3)因为MyBatis需要程序员官己去编写sql语句,程序员可以结合数据库自 身的特点灵活控制sql语句,因此能够实现比Hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。
简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
Mybatis将所有Xml配置信息都封装到All-In-One重量级对•象
Configuration内部。在Xml映射文件中,标签■会被解析为 ParameterMap对象,其每个子元素会被解析为ParameterMapping对象。 标签会被解析为ResultMap对象,其每个子元素会被解析为 ResultMapping 对象。每一个> 标签 均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。
什么是MyBatis的接口绑定,有什么好处?
接口映射就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL 语句绑定,我们直接调用接口方法就可以,这样比起原来了 SqlSession提供的 方法我们可以有更加灵活的选择和设置.
接口绑定有几种实现方式,分别是怎么实现的?
接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面 加上@Select@Update等注解星面包含SQI语句来绑定,另外一拜就是逋过 xml里面写SQL来绑定,在这拜情况下,要指定xml映射文件里面的 namespace必须为接口的全路径名.
什么情况下用注解绑定,什么情况下用xml绑定?
当Sql语句比较简单时候,用注解绑定;当SQL语句比较复杂时候,用xml 绑定,一般用xml绑定的比较多
MyBatis实现一对’一有几种方式?具体怎么操作的?
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在 resultMap星面配置association节点配置一对一的类就可以完成;嵌套查询 是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据, 也是通过association配置,但另外一个表的查询通过select属性配置。
MyBatis里面的动态Sql是怎么设定的?用什么语法?
MyBatis里面的动态Sql 一般是逋过if节点来实现,通过OGNL语法来实 现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节 点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以 and或or开始,那么会自动把这个and或者or型掉。
Mybatis是如何将SQI执行结果封装为目标对象并返回的?都有哪 些映射形式?
1.使用< resultMap>标签,逐一定义列名和对象属性名之间的映射关系。
2.使用SQI列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis 会忽略列名大小写,智能找到与之对■应对象属性名,你甚至可以写成T_NAME AS NaMe, Mybatis 一样可以正常工作。有了列名与属性名的映射关系后,Mybatis逋过反射创建对象,同时使用反射 给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值 的。
Xml映射文件中,除了常见的select insert updae delete标签之 外,还有哪些标签?
还有很多其他的标签,< resultMap><parameterMap>
<SQ1>< selectKey> ,加上动态SQI的9个标签,
trim where set foreach if choose when otherwise bind 等,其中<SQL>为 sql片段标签,通过< include>标筌引入sql片段,< selectKey>为不支持目 官的主键生成策略标签。
Mybatis中如何指定使用型一种Executor执行器?
在Mybatis配置文件中,可以指定默认的ExecutorType执行器类型,也 可以手动给DefaultScjlSessionFactory的创建SqlSession的方法传递 ExecutorType 类型参数
Mybatis执行批量插入,能返回数据库土键列表吗?
能,JDBC都能,Mybatis当然也能
Mybatis是否可以映射Enum枚举类?
Mybatis可以映射枚举类,不单可以映射枚举类,Mybatis可以映射任何 对象到表的一列上。映射方式为自定义一TypeHandler,实现TypeHandler 的 setParameter()和getResult()接口方法。TypeHandler 有两个作用,一是 完成从javalype至jdbcType的转换,二是完成jdbcType至javaType的 转换,体现为setParameter()和getResult()两个方法,分别代表设置SQL问
号占位将参数和获取列查询结果。
如何获家自动生成的(主)键值?
配置文件设置usegeneratedkejrs为true
在mapper中如何传递多个参数?
1)直接在方法中传递参数,xml文件用#{0} #{1}来获取
2)使用@param注解:这样可以直接在xml文件中通过#{name}来获取
resultType resultMap的区别?
1.类的名字和数据库相同时,可以直接设置resultType参数
为Pojo类
2.若不同,需要设置resultMap将结果名字和Pojo名字进行转换
二、Java面试之Dubbo
Dubbo是什么?
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调 用方案,以及SOA服务治理方案。
简单的说,Dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用 的,只有在分布式的时候,才有Dubbo这样的分布式服务框架的需求,并且本 质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别W纳 Service模式中的WSdl,以服务者与消费者的方式在Dubbo上注册)。
Dubbo核心部分包含哪些东西?
1.远程通讯:
提供对多种基于长连接的NIO。框架抽象封装,包括多种线程模型,序列化,以 及“请求-响应,模式的信息交换方式。
2.集群容错:
提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失 败容错,地址路由,动态配置等集群支持。
3.自动发现
基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明, 使服务提供方可以平滑增加或减少机器。
Dubbo能做什么?
1.透明化的远程瘫调用
就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制
可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3.服务自动注册与发现
不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址, 并且能够平滑添加或删除服务提供者。
Dubbo采用全spring配置方式,透明化接入应用,对应用没有任何API侵入, 只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展 进行加载。
Dubbo框架设计分为哪十层?
1.服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供 方和服务消费方的业务设计对应的接口和实现。
2.配置层(Config):对外配置接口,以ServiceConfig和
RefererceConfig为中心,可以直接new配置类,也可以通过spring解 析配置生成配置类。
3.服务代理层(Proxy):服务接口透明代理,生成服务的客户端Skeleton和服务器端Ske/eto八,以ServiceProxy为中心,扩展接口为 ProxyFactory
4.服务注册层(Registry):封装服务地址的注册与发现,以服务URL 为中心,扩展接口为 RegistryFactory、Registry 和RegistryService。 可能没有服务注册中心,此时服务提供方直接暴露服务。
5.集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中 心,以Invoker 为中心,扩展接口为 Cluster、Directory、Router 、LoadBanlance,将多个服务提供方组合为一个服务提供方,实现对服务消 费方来透明,只需要与一个服务提供方进行交互。
6.监控层(Monitor):RPC调用次数和调用时间监控,以Statistics 为中心,扩展接口为 MoitorFactory、Monitor、MonitorService
7.远程调用层(Protocol):封将RPC调用,以Invocation和Result 为中心,扩展接口为 Protocol、 Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责(Invoker的生命周期 管理。Invoker是实体域,它是Dubbo。的核心模型,其它模型都向它靠扰, 或转换成它,它代表一个可执行体,可向它发起Meke调用,它有可能是 一个本地的实现,也可能是一个远程的实现,也可能一个集群实现。
8.信息交换层(Exchange):封装请求响应模式,同步转异步,以Request 和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer
9.网络传输层(Transport):抽象mina和netty为统一接口,以Message 为中心,扩展接口为Channel、Transporter、Client、Server和Codec
10.数据序列化层(Serialize) :可复用的一些工具,扩展接口为Serialization 、ObjectInput、ObjectOutput和ThreadPool
和淘宝HSF相比,Dubbo的特点是什么?
1.Dubbo比HSF的部署方式更轻量
HSF要求使用指定的JBoss等容器,还需要在JBoss等容器中加入包扩展, 对用户运行环境的侵入性大,如果你要运行在Weblogic或Websphere等其它 容器上,需要自行扩展容器以兼容HSF的ClassLoader加载,而Dubbo没有任何要求,可运行在任何Java环境中。
2 .Dubbo比HSF的扩展性更好,很方便二次开发
一个框架不可能覆盖所有需求,Dubbo始终保持平等对待第三方理念,即所有 功能,都可以在不修改Dubbo原生代码的情况下,在外围扩展,包括Dubbo自己内置的功能,也和第三方一样,是通过扩展的方式实现的,而HSF如果你 要加功能或替换某部分实现是很困难的,比如支付宝和淘宝用的就是不同的
HSF分支,因为加功能时改了核心代码,不得不拷一个分支单独发展,HSF现 阶段就算开源出来,也很难复用,除非对架构重写。
3.Dubbo比HSF功能更多
除了ClassLoader隔离 Dubbo基本上是HSF的超集 Dubbo也支持更多协议 更多注册中心的集成 以适应更多的网站架构
Dubbo使用哪些场景?
1.RPC分布式服务
2.配置管理
3.服务依赖
4.服务扩容
三、Java面试之微服务
微服务有哪些优势?
1.降低复杂度(将耦合在一起的复杂业务拆分为单个服务)
2.可独立部署(降低测试工作了以及服务发布的风险)
3.容错(某一主键发生故障 故障会被隔离再单个服务中)
4.扩展
微服务核心部件有哪些
微服务总体架构?
Service Provider:暴露服务提供方
Service Consumer:调用远程服务的服务消费方
Eureka Server:服务注册中心和服务发现中心
Dubbo与SpringCloud性能对比?
使用一个Pojo对象包含10个属性 请求10万次 Dubbo和SpringCloud在不同的线程数量下每次请求耗时(ms)如下:
结论:客户端和服务端配置均采用阿里云ECS服务器 4核8G配置 Dubbo采用默认dubbo协议 dubbo支持各种通信协议 而且消费方使用长链接方式交互 通讯速度略胜SpringCloud 如果对于系统的相应时间有严格要求 长链接更合适
四、Java面试之Linux
绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
绝对路径:如/etc/init.d
当前目录和上层目录:./ …/
主目录:~/
切换目录:cd
怎么查看当前进程?怎么执行退出?怎么查看当前路径?
查看当前进程:ps
执行退出:exit
查看当前路径:pwd
怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户 id?查看指定帮助用什么命令?
清屏:clear
退出当前命令:ctrl+c 彻底退出
执行睡眠 :ctrl+z 挂起当前进程fg 恢复后台
查看当前用户 id: ” id “ :查看显示目前登陆账户的 uid 和 gid 及所属分组及用户名
查看指定帮助:如 man adduser 这个很全 而且有例子;adduser --help 这个告诉你一些常用参数;info adduesr;
Ls 命令执行什么功能?可以带哪些参数,有什么区别?
ls 执行的功能:列出指定目录中的目录,以及文件
哪些参数以及区别:a 所有文件l 详细信息,包括大小字节数,可读可写可执行的权限等
建立软链接(快捷方式),以及硬链接的命令?
软链接:ln -s slink source
硬链接:ln link source
目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
创建目录:mkdir
创建文件:典型的如 touch,vi 也可以创建文件,其实只要向一个不存在的文件输出,都会创建
文件
复制文件:cp 7. 文件权限修改用什么命令?格式是怎么样的?
文件权限修改:chmod
格式如下:
$ chmod u+x file 给 file 的属主增加执行权限
$ chmod 751 file 给 file 的属主分配读、写、执行(7)的权限,给 file 的所在组分配读、执行(5)
的权限,给其他用户分配执行(1)的权限
$ chmod u=rwx,g=rx,o=x file 上例的另一种形式
$ chmod =r file 为所有用户分配读权限
$ chmod 444 file 同上例
$ chmod a-wx,a+r file 同上例
$ chmod -R u+r directory 递归地给 directory 目录下所有文件和子目录的属主分配读的权限
查看文件内容有哪些命令可以使用?
vi 文件名 #编辑方式查看,可修改
cat 文件名 #显示全部文件内容
more 文件名 #分页显示文件内容
less 文件名 #与 more 相似,更好的是可以往前翻页
tail 文件名 #仅查看尾部,还可以指定行数
head 文件名 #仅查看头部,还可以指定行数
随意写文件命令?怎么向屏幕输出带空格的字符串,比如 ” hello world ” ?
写文件命令:vi
向屏幕输出带空格的字符串:echo hello world
终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
终 端 /dev/tty
黑洞文件 /dev/null
移动文件用哪个命令?改名用哪个命令?
mv mv
使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?
使用命令repquota 能够显示出一个文件系统的配额信息
五、Java面试之nginx
什么是Nginx缓存?
基于proxy store实现 当启动缓存时 nginx会将相应数据保存在磁盘缓存中 只要缓存尚未过期 就用缓存中的数据响应客户端的请求
如何启动缓存?
Nginx启用缓存需要在最顶层的http节点下配置proxy_cache_path命令。我们先看看proxy_cache_path命令的语法结构:
proxy_cache_path /data/cache keys_zone=niyueling:10m;
可以看到proxy_cache_path命令一共包含两个参数,第一个参数指定缓存保存的本地路径,第二个参数定义缓存数据的共享内存区域的名称和内存区大小。Nginx启动后,缓存加载程序只进行加载一次,加载时会将缓存的元数据加载到共享内存区域,但是如果一次加载整个缓存全部内容可能会使Nginx刚启动的前几分钟性能消耗严重,大幅度降低Nginx的性能。所以可以
proxy_cache_path命令中配置缓存迭代加载。缓存迭代加载一共可以设置三个参数:
1.loader_threshold - 迭代的持续时间,以毫秒为单位(默认为200)
2.loader_files - 在一次迭代期间加载的最大项目数(默认为100)
3.loader_sleeps - 迭代之间的延迟(以毫秒为单位)(默认为50)
Nginx是用来干嘛的?
Nginx是一个高性能的HTTP和反向代理服务器,这个基本是用来前端服务器集群后做负载均衡和动静分离用的
Nginx优势?
1.Nginx由于使用了epoll和kqueue网路I/O模型,在实际生产环境能够支撑3万左右并发连接。
2.Nginx内存消耗低。
3.Nginx跨平台,而且配置相对来说难度较低。
4.Nginx内置健康检查功能,如果负载均衡其中一个服务器宕机了,则接受到的请求会发送给其他服务器去处理。
5.支持Gzip压缩,可以添加浏览器本地缓存的Header头。
6.Nginx支持热部署,可以在不间断服务的情况下平滑进行配置的更改。
7.Nginx异步接收用户请求,减轻了Web服务器的压力。
Nginx如何实现高并发?
异步非阻塞。实际上Nginx就是异步非阻塞,使用了epoll模型并对底层代码进行大幅度优化。之前其实有讲过Nginx是采用1个master进程,多个worker进程的模式,每次接收到一个请求,master会将请求按照一定策略分发给一个worker进程去进行处理请求。worker进程数一般设置为和CPU核心数一致,异步非阻塞模式就会使得worker线程在等待请求callback的空闲时间可以接收处理新的请求,当接收到旧请求的callback时再回去继续处理该请求,这样就完成了少数几个worker进程却实现了高并发的问题。
Nginx为何不使用多线程?
众所周知,没创建一个新的线程,都需要为其分配cpu和内存。当然,创建进程也是一样,但是由于线程过多会导致内存消耗过多。所以Nginx采用单线程异步处理用户请求,这样不需要不断地为新的线程分配cpu和内存,减轻服务器内存消耗,所以使得Nginx性能方面更为高效。
Nginx如何处理请求?
Nginx启动后,首先进行配置文件的解析,解析成功会得到虚拟服务器的ip和端口号,在主进程master进程中创建socket,对addrreuse选项进行设置,并将socket绑定到对应的ip地址和端口并进行监听。然后创建子进程worker进程,当客户端和Nginx进行三次握手,则可以创建成功与Nginx的连接。当有新的请求进入时,空闲的worker进程会竞争,当某一个worker进程竞争成功,则会得到这个已经成功建立连接的socket,然后创建ngx_connection_t结构体,接下来设置读写事件处理函数并添加读写事件用来与客户端进行数据交换。当请求结束Nginx或者客户端主动关闭连接,此时一个请求处理完毕。
为什么要做动静分离?
在日常开发中,前端请求静态文件比如图片资源是不需要经过后端服务器的,但是调用API这些类型的就需要后端进行处理请求,所以为了提高对资源文件的响应速度,我们应该使用动静分离的策略去做架构。我们可以将静态文件放到Nginx中,将动态资源的请求转发到后端服务器去进行进一步的处理。
Nginx负载均衡的几种常用方式?
1.轮询方式:默认情况下Nginx使用轮询的方式实现负载均衡,每个新的请求按照时间顺序逐一分配到不同的后端服务器去进行处理,如果后端服务器宕机,则Nginx的健康检查功能会将这个后端服务器剔除。但是轮询方式是显而易见的:可靠性低而且负载分配不平衡,所以轮询方式更适用于图片服务器或者静态资源服务器。
2.weight:可以对不同的后端服务器设置不同的权重比例,这样可以改变不同后端服务器处理请求的比例。可以给性能更优的后端服务器配置更高的权重。
3.ip_hash:这种方式会根据请求的ip地址的hash结果分配后端服务器来处理请求,这样每个用户发起的请求固定只会由同一个后端服务器处理,这样可以解决session问题。
4.fail:这种方式有点类似于轮询方式,主要是根据后端服务器的响应时间来分配请求,响应时间短的后端服务器优先分配请求。
5.url_hash:这种方式是按照请求url的hash结果来将不同请求分配到不同服务器,使用这种方式每个url的请求都会由同一个后端服务器进行处理,后端服务器为缓存时效率会更高。
Nginx常用优化配置?
1.调整worker_processes指定Nginx需要创建的worker进程数量,刚才有提到worker进程数一般设置为和CPU核心数一致。
2.调整worker_connections设置Nginx最多可以同时服务的客户端数。结合worker_processes配置可以获得每秒可以服务的最大客户端数。
3.启动gzip压缩,可以对文件大小进行压缩,减少了客户端http的传输带宽,可以大幅度提高页面的加载速度。
4.启用缓存,如果请求静态资源,启用缓存是可以大幅度提升性能的。
Nginx中正向代理与反向代理的区别?
1.在正向代理中,隐藏了请求来源的客户端信息;
2.在反向代理中,隐藏了请求具体处理的服务端信息;
六、Java面试题之总结 ?
jdk1.7到jdk1.8 Map发生了什么变化(底层)?
1.8之后hashMap的数据结构发生了变化,从之前的单纯的数组+链表结构变成数组+链表+红黑树。也就是说在JVM存储hashMap的K-V时仅仅通过key来决定每一个entry的存储槽位(Node[]中的index)。并且Value以链表的形式挂在到对应槽位上(1.8以后如果value长度大于8则转为红黑树)。
但是hashmap1.7跟1.8 中都没有任何同步操作,容易出现并发问题,甚至出现死循环导致系统不可用。解决方案是jdk的ConcurrentHashMap,位于java.util.concurrent下,专门解决并发问题。
ConcurrentHashMap
思路与hashMap差不多,但是支持并发操作,要复杂很多
并行跟并发有什么区别?
并发:指应用交替执行不同的任务,多线程原理
并行:指应用同时执行不用的任务
区别:一个是交替执行,一个是同时执行。
什么是中间件?
中间件是处于操作系统和应用程序之间软件,使用时旺旺是一组中间件集成在一起,构成一个平台(开发平台+运行平台),在这组中间件中必须要有一个通信中间件,即中间件=平台+通信。该定义也限定了只有勇于分布式系统中才能称为中间件
主要分类:远程过程调用、面向消息的中间件、对象请求代理、事物处理监控。
如果叫你自己设计一个中间件,你会如何设计?
我会从以下几点方面考虑开发:
1)远程过程调用
2)面向消息:利用搞笑的消息传递机制进行平台无关的数据交流,并给予数据通信来进行分布式系统的集成,有一下三个特点:
i)通讯程序可以在不同的时间运行
ii)通讯晨旭之家可以一对一、一对多、多对一甚至是上述多种方式的混合
iii)程序将消息放入消息队列会从小吸毒列中取出消息来进行通讯
3)对象请求代理:提供不同形式的通讯服务包括同步、排队、订阅发布、广播等。可构筑各种框架如:事物处理监控器、分布数据访问、对象事务管理器OTM等。
4)事物处理监控有一下功能:
a)进程管理,包括启动server进程、分配任务、监控其执行并对负载进行平衡
b)事务管理,保证在其监控下的事务处理的原子性、一致性、独立性和持久性
c)通讯管理,为client和server之间提供多种通讯机制,包括请求响应、会话、排队、订阅发布和广播等
ThreadLock用过没有,说说它的作用?
ThreadLock为本地线程,为每一个线程提供一个局部变量,也就是说只有当前线层可以访问,是线程安全的。原理:为每一个线程分配一个对象来工作,并不是由ThreadLock来完成的,而是需要在应用层面保证的,ThreadLock只是起到了一个容器的作用。原理为ThreadLock的set()跟get()方法。
实现原理:
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
Hashcode()和equals()和==区别?
(1)hashcode()方法跟equals()在java中都是判断两个对象是否相等
(2)两个对象相同,则hashcode至一定要相同,即对象相同 ---->成员变量相同 ---->hashcode值一定相同
(3)两个对象的hashcode值相同,对象不一定相等。总结:equals相等则hashcode一定相等,hashcode相等,equals不一定相等。
==比较的是两个引用在内存中指向的是不是同一对象(即同一内存空间)
mysql优化会不会,mycat分库,垂直分库,水平分库?
(1)为查询缓存优化你的查询
(2)EXPLAIN select查询:explain 的查询结果会告诉你索引主键是如何被利用的
(3)只需要一行数据时使用limit1
(4)为搜索字段添加索引
(5)在关联表的时候使用相当类型的例,并将其索引
(6)千万不要ORDER BY RAND()
(7)避免select*
(8)永远为每张表设置一个ID
(9)使用ENUM而不是VARCHAR
(10)从PROCEDURE ANALYS()提取建议
(11)尽可能的使用NOT NULL
(12)Java中使用Prepared Statements
(13)无缓冲的查询
(14)把IP地址存成UNSIGNED INT
(15)固定表的长度
(16)垂直分库:“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
(17)水平分库:“水平分割”是一种把数据库中的表按行变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
(18)越小的列会越快
(19)选择正确的存储引擎
(20)使用一个对象关系映射器
(21)小心永久链接
(22)拆分大的DELETE活INSERT语句
分布式事务解决方案?
(1)什么是分布式事务?
a.什么情况下需要用到分布式事务?
a)当本地数据库断电、机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠TCP、存储数据丢失、其他异常等需要用到分布式事务。
b)例如:当本地事务数据库断电的这种秦光,如何保证数据一致性?数据库由连个文件组成的,一个数据库文件和一个日志文件,数据库任何写入操作都要先写日志,在操作前会吧日志文件写入磁盘,那么断电的时候及时才做没有完成,在重启数据库的时候,数据库会根据当前数据情况进行undo回滚活redo前滚,保证了数据的强一致性。
c)分布式理论:当单个数据库性能产生瓶颈的时候,可能会对数据库进行分区(物理分区),分区之后不同的数据库不同的服务器上 ,此时单个数据库的ACID不适应这种清苦啊,在此集群环境下很难达到集群的ACID,甚至效率性能大幅度下降,重要的是再很难扩展新的分区了。此时就需要引用一个新的理论来使用这种集群情况:CAP定理
d)CAP定理:由加州肚饿伯克利分销Eric Brewer教授提出,指出WEB服务无法同时满足3个属性:
a.一致性:客户端知道一系列的操作都会同时发生(生效)
b.可用性:每个操作都必须以可预期的响应结束
c.分区容错性:及时出现单组件无法可用,操作依然可以完成。
具体的将在分布式系统中,在任何数据库设计中,一个WEB应
至多只能同时支持上面两个属性。设计人员必须在一致性和可用
性之间做出选择。
e)BASE理论:分布式系统中追求的是可用性,比一致性更加重要,BASE理论来实现高可用性。核心思想是:我们无法做到羟乙酯,单每个应用都可以根据自身的业务特点,采用适当的方式使系统达到最终一致性。
f)数据库事务特性:ACID
i.原子性
ii.一致性
iii.独立性或隔离性
iv.持久性
(2)分布式系统中,实现分布式事务的解决方案:
a.两阶段提交2PC
b.补偿事务TCC
c.本地消息表(异步确保)
d.MQ事务消息
e.Sagas事务模型
sql语句优化会不会,说出你知道的?
(1)避免在列上做运算,可能会导致索引失败
(2)使用join时应该小结果集驱动大结果集,同时把复杂的join查询拆分成多个query,不然join越多表,会导致越多的锁定和堵塞。
(3)注意like模糊查询的使用,避免使用%%
(4)不要使用select * 节省内存
(5)使用批量插入语句,节省交互
(6)Limit基数比较大时,使用between and
(7)不要使用rand函数随机获取记录
(8)避免使用null,建表时,尽量设置not nul,提高查询性能
(9)不要使用count(id),应该使用count(*)
(10)不要做无谓的排序,尽可能在索引中完成排序
(11)From语句中一定不要使用子查询
(12)使用更多的where加以限制,缩小查找范围
(13)合理运用索引
(14)使用explain查看sql性能
mysql的存储引擎了解过没有?
(1)MySQL存储引擎种类:
(2)https://blog.csdn.net/m0_37888031/article/details/80704344
(3)https://blog.csdn.net/m0_37888031/article/details/80664138
(4)事务处理:在整个流程中出现任何问题,都能让数据回滚到最开始的状态,这种处理方式称之为事务处理。也就是说事务处理要么都成功,要么的失败。
红黑树原理?
红黑树的性质:红黑树是一个二叉搜索树。在每个节点增加了一个存储位记录节点的颜色,可以是RED,也可以是BLACK,通过任意一条从根到叶子简单路径上颜色的约束,红黑树保证最长路径不超过最短路径的两倍,加以平衡。性质如下:
i.每个节点颜色不是黑色就是红色
ii.根节点的颜色是黑色的
iii.如果一个节点是红色,那么他的两个子节点就是黑色的,没有持续的红节点
iv.对于每个节点,从该节点到其后代叶节点的简单路径上,均包含相同数目的黑色节点。
以上是关于2021Java面试题汇总全剧终?含答案及十八套面试题免费下载的主要内容,如果未能解决你的问题,请参考以下文章
面试技巧2018年 Java 面试题汇总(含答案),错过了血亏!
分享互联网2021年最新Java面试题汇总整理-附详细答案解析