文章目录
- 101.分布式事务你知道哪些解决方案?
- 102.什么是2pc,基于什么协议,有什么缺点?
- 103.Seata相比传统2PC有什么区别,以及优点?
- 104.Seata的TC,TM,RM的含义,以及作用?
- 105.你知道TCC吗,它的缺点是什么?
- 106.解释一下Seata的工作原理?
- 107.你能简单描述一下你在项目中是如何集成Seata的吗?
- 108.哪些因素可能会造成数据库性能问题?
- 109.Mysql的执行流程是怎么样的?
- 110.优化SQL你采用什么样的优化流程?
- 111.如何去定位慢SQL?
- 112.定位到慢SQL你如何优化?
- 113.你如何看SQL有没有命中索引?
- 114.mysql存储引擎有哪些,有什么区别,如何选择?
- 115.一个sql :select sum(amount) from recharge,来查询总充值,recharge表数据量达到了上千万,怎么优化?
- 116.什么是索引?
- 117.Mysql索引有哪些类型?
- 118.Mysql的索引原理?为什么用B+tree?
- 119.InnoDB的索引结构和MyIsam的索引结构有什么区别?
- 120.哪些列不适合创建索引?
- 121.哪些因素会造成索引失效?
- 122.辅助索引的原理?
- 123.组合索引的匹配原则?
- 124.什么是Mysql主从复制?Mysql主从复制原理是怎么样的?
- 125.简单说一下如何实现Mysql主从?
- 126.Mysql的集群有哪些模式?
- 127.Mysql单机优化到极致了,可以怎么优化?
- 128.Mysql多机优化有哪些方式?
- 129.解释一下分库分表的含义?
- 130.水平分表有哪些分表规则?
- 131.你们项目中是怎么分库分表的?
- 132.分库分表后会带来哪些问题,如何解决?
- 133.能简单说一下你怎么使用shardingjdbc做读写分离的?
- 134.能简单说一下你怎么使用shardingjdbc做读分库分表的?
- 135.Redis内存不够了,怎么办?
- 136.Redis的主从有什么优点,和缺点?
- 137.解释一下Redis的哨兵模式?
- 138.Redis的cluster集群怎么存储数据的?
- 139.什么情况下Redis集群不可用?
- 140.简单说一下你对分布式和集群的理解?
- 141.项目中那些地方用到Redis,怎么用的?
- 142.缓存穿透、缓存击穿、缓存雪崩区别和解决方案?
- 143.Redis怎么实现栈和队列?
- 144.说一下Redis集群是怎么存储数据的?
- 145.Redis有哪些存储结构?每种结构说4个命令
- 146.Redis集群方式有哪些?简单说一下主备切换时Redis如何选举master的?
- 147.说一下Redis淘汰策略?
- 148.Redis为什么那么快?
- 149.为什么用ES做全文检索比数据库使用 like 快?
- 150.说说你理解的ES分片(Shard)机制?
- 151.什么情况下ES集群不可用?
- 152.ES内部是如何进行并发控制的?
- 153.Mysql中的数据库,表,行,列 在ES中是怎么对应的?
- 154.如果我要把一个User表中的数据存储到ES中,我应该怎么做?
- 155.描述一下ES添加文档的过程?
- 156.详细描述一下Elasticsearch获取文档的过程?
- 157.详细描述一下Elasticsearch搜索过程?
- 158.详细描述一下Elasticsearch更新和删除文档的过程?
- 159.ES有几种节点类型?他们的作用分别是什么?
- 160.你们用什么工具监控JVM?
- 161.JVM类加载流程?
- 162.JVM类加载器有几种?
- 163.JVM组成,以及他们的作用?
- 164.JVM组成部分,哪些是线程共享的,哪些是不共享的?
- 165.在JVM层面,一个线程是如何执行的?
- 166.应用内存溢出了,如何定位问题出在哪儿?
- 167.常用的垃圾回收算法有哪些,简单说一下?
- 168.说说看JDK1.8中,堆的划分?分别使用是什么GC机制?
- 169.JVM优化的目的是什么?
- 170.使用什么参数配置堆内存?使用什么参数配置配置栈内存?
- 171.什么是JPA和Hibernate的关系?
- 172.JPA和MyBatis的区别,以及优缺点?
- 173.介绍一下JPA内置的Repository?
- 170.一对多使用什么注解,多对一使用什么注解?
- 174.你们项目中ID使用JPA什么生成策略?
- 175.对象关联,延迟查询会有什么问题,怎么解决?
- 176.多对多打什么标签?
- 177.JPA中对象的状态有几种?分别什么意思?
- 179.你们用Nginx,用来干嘛?
- 180.Nginx的负载均衡算法有哪些?你们项目用的什么算法?
- 181.在浏览器发起一个请求一个,这个请求会怎么执行?
- 182.说10个docker的命令?
- 183.说一下你们这个项目是怎么部署的?
- 184.docker容器通信有哪些方式?
- 185.docker构建镜像有哪些方式?
- 186.如何做端口映射?
- 187.如何拷贝文件到容器中?
- 188.你们项目中容器之间通信使用的是哪种方式?
- 189.Linux的常用命令,说10个?
- 190.Docker-compose常用的命令?
- 191.大概说一下docker-compose的模板文件的格式?
101.分布式事务你知道哪些解决方案?
2PC、TCC、可靠消息最终一致性、最大努力通知这几种
102.什么是2pc,基于什么协议,有什么缺点?
2PC即两阶段提交协议,是将整个事务流程分为两个阶段,2是指两个阶段, P是指准备阶段, C是指提交阶段:
准备阶段( Prepare phase):事务管理器(TM)先于事务参与者(RM)们发送准备请求,大家都返回OK状态,那么就进入第二阶段
提交阶段( Commit phase) :如果在第一阶段有任何一个参与者没有OK,那么事务协调器(TC)通知其他所有事务参与者(RM)回滚事务
2PC常见的标准是XA,JTA,Seata等
缺点:第一阶段如果RM没有回复OK或者单点故障,都会造成阻塞
103.Seata相比传统2PC有什么区别,以及优点?
架构层次方面:传统2PC方案的RM实际上是在数据库层,存在代码的侵入,而Seata高效并且对业务0侵入
两阶段提交方面:传统2PC无论第二阶段的决议是commit还是rollback ,事务性资源的锁都要保持到Phase2完成才释放;而Seata的做法是在Phase1就将本地事务提交,节省持锁的时间。
104.Seata的TC,TM,RM的含义,以及作用?
- Transaction Coordinator(TC):事务协调器,它是独立的中间件,需要独立部署运行,它维护全局事务的运行状态,接收TM指令发起全局事务的提交与回滚,负责与RM通信协调各各分支事务的提交或回滚。相当于是一个软件需要单独部署
- Transaction Manager(TM):事务管理器, TM需要嵌入应用程序中工作,它负责开启一个全局事务,并最终向TC发起全局提交或全局回滚的指令
- Resource Manager (RM):资源管理器,控制分支事务, 负责分支注册、状态汇报,并接收事务协调器TC的指令, 驱动分支(本地)事务的提交和回滚
105.你知道TCC吗,它的缺点是什么?
TCC,是基于补偿型事务的AP系统的一种实现,具有弱一致性
对应用的侵入性强。业务逻辑的每个分支都需要实现try、confirm、cancel三个操作,应用侵入性较强,改造成本高。实现难度较大
106.解释一下Seata的工作原理?
看图说话!!!
开启全局事务----->从TC获取XID----->开始执行业务----->将XID携带到分支事务----->分支事务向TC注册本地分支事务----->写入本地undo log----->发起全局事务的提交----->分支事务删除undo log
107.你能简单描述一下你在项目中是如何集成Seata的吗?
下载事务协调器TC----->导入依赖----->Yml配置seata----->拷贝配置----->配置数据源----->@GlobalTransactional事务处理(在需要的事务上打上该注解,需要将原来的@Transactional删掉,同时准备undolog表)
108.哪些因素可能会造成数据库性能问题?
- 不合理的需求
- 架构设置的不合理(sql重复、表设计不合理、不合理的索引设置)
- SQL语句编写的不合理(sql太复杂、太多表的join、select * )
- 硬件环境
- 网络环境
109.Mysql的执行流程是怎么样的?
server层:客户端----->连接器(管理链接、鉴权)----->分析器(词法、语法分析)----->优化器(对sql语句进行优化)----->执行器(操作引擎,返回结果)
存储引擎:数据的存储和读取
110.优化SQL你采用什么样的优化流程?
- 定位慢sql发现问题
- 分析慢sql分析问题
- 优化解决问题
111.如何去定位慢SQL?
- 可以通过sql命令,查看sql执行的时间以及各项效率参数
- 使用阿里巴巴开发工具Druid查看
112.定位到慢SQL你如何优化?
- 可以通过增加冗余字段或者冗余表等来减少表的join
- 一些特殊情况可以使用增量查询
- 使得当的增加索引
- 表中数据量太大,分表
113.你如何看SQL有没有命中索引?
通过指令explain+查询语句进行查询
114.mysql存储引擎有哪些,有什么区别,如何选择?
Myisam:查询较多(不支持事务,不支持外键,最小的锁粒度是表锁)
Innodb:既有查询又有CRUD(支持事务,支持外键,最小的锁粒度是行锁)
115.一个sql :select sum(amount) from recharge,来查询总充值,recharge表数据量达到了上千万,怎么优化?
可以使用增量查询,创建一个汇总表,只有一个字段就是每日的总充值数据,每次只查询该表即可
116.什么是索引?
索引是帮助数据库高效获取数据的一种数据结构
117.Mysql索引有哪些类型?
普通索引Normal: 允许重复的值出现,可以在任何字段上面添加
唯一索引Unique: 除了不能有重复的记录外,其它和普通索引一样,可以在值是唯一的字段添加(用户名、手机号码、身份证、email,QQ),可以为null,并且可以有多个null
主键索引: 是随着设定主键而创建的,也就是把某个列设为主键的时候,数据库就会給改列创建索引,这就是主键索引,唯一且没有null值
全文索引: 用来对表中的文本域(char,varchar,text)进行索引, 全文索引针对MyISAM有用InnoDB不支持全文索引,所以一般不用,默认只支持英文----所以实际情况使用ES,Lucene代替就ok
118.Mysql的索引原理?为什么用B+tree?
Mysql底层是通过B+tree作为索引结构,因为B+tree所有数据都存在于叶子节点,查询效率稳定,并且叶子节点数据是有序的,方便分组查询,排序等操作,同时非叶子节点均存放键值KEY,存放数据量更大
119.InnoDB的索引结构和MyIsam的索引结构有什么区别?
InnoDB有主键索引和辅助索引,辅助索引查询完后,还需要通过回表查询主键索引,数据与索引物理结构在一起
MyISAM数据与索引物理结构是分开的,所以树的节点指向的是数据的地址
120.哪些列不适合创建索引?
- 不经常查询的
- 唯一性较低的(离散度较小)
- 频繁修改的字段
121.哪些因素会造成索引失效?
- sql有使用到or
- 模糊查询like中%在字段之前:%xx
- 使用拼接后的字段concat()
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
122.辅助索引的原理?
非主键列创建的索引就叫辅助索引,也叫二级索引
123.组合索引的匹配原则?
向左匹配原则
124.什么是Mysql主从复制?Mysql主从复制原理是怎么样的?
Mysql在做集群的时候,会有主从模式,主负责读写,从负责读操作,从库的数据从主库同步复制的过程叫做主从复制
主从复制是通过在主数据库会有一个二进制日志(binary log)文件记录主库的各项操作,而从库会通过一个I/O线程读取binarylog文件,异步执行里面的sql操作,实现复制
125.简单说一下如何实现Mysql主从?
- 准备环境,构造主、从数据库,配置端口,日志目录,安装目录,数据目录,安装及启动配置的Mysql
- master服务器配置,配置服务server-id,授权savle服务器的使用的账号及权限
- slave配置,配置服务server-id,配置master链接信息,启动同步(start slave)
- 代码中配置读写分离
126.Mysql的集群有哪些模式?
一主多从、双主、环形多主
127.Mysql单机优化到极致了,可以怎么优化?
可以进行Mysql的多机优化,例如集群化操作,分库分表等操作
128.Mysql多机优化有哪些方式?
集群化操作,分库分表等操作
129.解释一下分库分表的含义?
分库分表分为水平分库、垂直分库、水平分库、水平分表
水平分库/分表:因为数据量较大,按照行进行分,等同于将一张表拆分成为多个小表,单看每个表列业务都是完整的
垂直分库/分表:按照业务进行划分,每个表中的列一般不存在重复的
130.水平分表有哪些分表规则?
- 按区间范围,例如将数据按照原来ID进行划分,然后从新创建一张表维护总的ID
- 按照时间范围,例如一个月一张表
- Hash分表,将ID按照或者表中其他字段进行hash计算,确定存放的表
- 雪花算法
131.你们项目中是怎么分库分表的?
我们项目如果是微服务就是分库分表,如果是单体项目就知识垂直分表,一般很少用到水平分库分表,因为项目大小问题,同时水平分库分表会带来很多问题
132.分库分表后会带来哪些问题,如何解决?
垂直分库:
- 分布式事务------>使用Seata分布式事务
- 跨库操作------>可以使用Feign进行服务的相互调用
水平分库:
- 主键重复------>分布式ID,比如使用雪花算法来实现
- 跨节点操作排序分页------>先将多个库中多个表union合并成一个大表,在大表中进行查询和分页
133.能简单说一下你怎么使用shardingjdbc做读写分离的?
- 导入sharding-jdbc依赖(这个包guava可能存在冲突,要进行排除)
- 配置多数据源
- 进行测试,查看控制台sql执行的语句
134.能简单说一下你怎么使用shardingjdbc做读分库分表的?
- 导入sharding-jdbc依赖(这个包guava可能存在冲突,要进行排除)
- 准备两个库,两个表,注意主键不能设置为自动递增,分库可以是用hash,分表可以使用雪花算法
- 配置多数据源
- 进行测试,查看控制台sql执行的语句
135.Redis内存不够了,怎么办?
可以使用Redis集群
136.Redis的主从有什么优点,和缺点?
优点:
1、数据冗余:主从复制实现了热备份
2、故障恢复:主从切换实现快速的故障恢复
3、负载均衡:配合读写分离,可以分担少写多读情况的压力
4、读写分离:写是主Redis,读是从Redis
5、高可用的基石:是后面哨兵模式的基础
缺点:
1、不具备自动容错和回复功能,需要手动切换主从
2、数据量特别大的话一个主是存储不了的
3、主机宕机数据丢失,主机宕机会导致部分数据还未同步到从机进而丢失
137.解释一下Redis的哨兵模式?
在主从模式的基础上实现自动化的系统监控和故障恢复功能
138.Redis的cluster集群怎么存储数据的?
数据分散存储,实现分布式存储, 通过哈希槽(hash slot) 的方式来分配数据具体算法就是:CRC16(key) % 16384
139.什么情况下Redis集群不可用?
Cluster集群情况下,如果一个主节点宕机,并且该主节点没有从节点替换,将会导致整个Redis集群宕机
140.简单说一下你对分布式和集群的理解?
集群: 就是多个应用分散在不同的服务器,每个应用跑的是同一套代码做的是相同的工作,以提高系统的整体性能,类似1+1=2
分布式: 就是将一个完整的业务按照功能/应用进行拆分,多个子应用分别部署在不同的服务器,子应用一同工作、相互协调配合才能完成一个完整的业务,类似0.5+0.5=1
141.项目中那些地方用到Redis,怎么用的?
● 令牌(Token)生成
● 短信验证码
● 排行榜
● 消息队列
142.缓存穿透、缓存击穿、缓存雪崩区别和解决方案?
缓存穿透:
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大
解决方式:
- 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
- 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
缓存击穿:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大
解决方式:
- 设置热点数据永远不过期;
- 加互斥锁
缓存雪崩:
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库
解决方式:
- 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生;
- 如果缓存数据库是分布式部署,将热点数据均匀分布在不同得缓存数据库中
- 设置热点数据永远不过期
143.Redis怎么实现栈和队列?
先要区分栈和队列的区别:
队列:
- 先进先出(FIFO)
- 支持PUSH/POP,PUSH从尾端增加元素,POP从前端弹出元素
- 容量不受限制
堆栈:
- 后进先出(LIFO)
- 支持PUSH/POP,从尾端追加/弹出元素
- 容量不受限制
队列和堆栈都是可以用Redis得List数据类型实现得,因为List支持以下操作:
- lpush/rpush,从左侧/右侧追加元素
- lpop/rpop,从左侧/右侧弹出元素
- llen,获取队列的长度
- lindex,获取某个位置的元素
144.说一下Redis集群是怎么存储数据的?
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做 哈希槽 (hash slot) 的方式来分配的。redis cluster默认分配了16384个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key)%16384。
145.Redis有哪些存储结构?每种结构说4个命令
有基础得五种数据结构:字符串、链表、哈希结构、集合、有序集合
String:
- set key value:将字符串value关联key存储到redis中
- get key:通过key获取存储的字符串
- mset key value key value:同时存储多个键值对
- mget key key:根据key获取多个字符串
Set:
- sadd key value value:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
- smembers key:获取集合中所有元素
- srem key member:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
- SCARD key:返回集合存储的key的基数 (集合元素的数量).如果key不存在,则返回 0
Hash:
- HSET key field value:设置 key 指定的哈希集中指定字段的值。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段在哈希集中存在,它将被重写
- HGet key name:获取hash类型的name键对应的值
- HMSET key field value field value:同时将多个 field-value (域-值)对设置到哈希表 key 中
- HMGET key field field:批量获取hash类型的键对应的值
List:
- lpush key value value:将一个或多个值 value 插入到列表 key 的表头(最左边)
- rpush key value value:将一个或多个值 value 插入到列表 key 的表尾(最右边)
- lrange key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定
- lpop key:移除并返回列表 key 的头(最左边)元素
ZSet:
- ZADD key score value score value:将所有指定成员添加到键为key有序集合(sorted set)里面,如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置
- ZCARD key:返回key的有序集元素个数。key存在的时候,返回有序集的元素个数,否则返回0
- ZCOUNT key min max:返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员
- ZPOPMAX key [count]:删除并返回有序集合key中的最多count个具有最高得分的成员。如未指定,count的默认值为1
146.Redis集群方式有哪些?简单说一下主备切换时Redis如何选举master的?
三种方式:主从复制、哨兵模式、Cluster集群
投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉,故障节点对应的从节点自动升级为主节点,如果某个主挂掉,而没有从节点可以使用,那么整个Redis集群进入宕机状态
147.说一下Redis淘汰策略?
-
volatile-lru :从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
-
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
-
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
-
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
-
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
-
no-enviction(驱逐):禁止驱逐数据
148.Redis为什么那么快?
- Redis是单线程,没有锁的竞争,没有线程切换的性能开销
- Redis基于内存读写并发能力强
- Redis结构简单key-value存储
- Redis采用多路IO复用模型
- Redis对String做了极致优化SDS
149.为什么用ES做全文检索比数据库使用 like 快?
因为数据结构-----------倒排索引文档
而like会进行全文搜索(想想就是一种灾难)
150.说说你理解的ES分片(Shard)机制?
是将将一个索引中的数据切分为多个shard,分布在多台服务器上存储
通俗的说分片(Shard)就是:一块超级大的拼图(索引),是由有好多好多小片组成的
151.什么情况下ES集群不可用?
当主分片(Primary Shard)宕机,并且没有从分片(Replica Shard)作为替换,此时整个ES不可用
152.ES内部是如何进行并发控制的?
每次修改时,再ES中会自动维系一个version,每次操作后自动+1,使用到的是乐观锁
153.Mysql中的数据库,表,行,列 在ES中是怎么对应的?
154.如果我要把一个User表中的数据存储到ES中,我应该怎么做?
(1)创建一个索引库,可以用kibana或者用Java代码
(2)然后做文档映射,可以用kibana或者用Java代码
(3)然后通过ES的Java的API去添加数据到索引库
155.描述一下ES添加文档的过程?
- 客户端请求一个协调节点(负载均衡节点)coordinating node
- 协调节点根据算法选择一个primary shard: 算法 hash(document_id) % (num_of_primary_shards)
- 对应的primary shard 所在节点保存完数据后,将数据同步到replica node
- 协调节点(负载均衡节点)coordinating node 发现 primary node 和所有 replica node 都搞定之后返回结果给客户端
156.详细描述一下Elasticsearch获取文档的过程?
- 客户端请求一个协调节点coordinating node
- coordinate node 根据算法hash(document_id) % (num_of_primary_shards),将请求转发到对应的 node,此时会使用 round-robin随机轮询算法,在 primary shard 以及其所有 replica 中随机选择一个,让读请求负载均衡
- 接收到请求的 node 返回 document 给调节点 coordinate node
- coordinate node 返回 document 给客户端。
157.详细描述一下Elasticsearch搜索过程?
- 在初始查询阶段时,查询会广播到索引中每一个分片拷贝(主分片或者副本分片)
- 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的优先队列。PS:在搜索的时候是会查询Filesystem Cache的,但是有部分数据还在Memory Buffer,所以搜索是近实时的
- 每个分片返回各自优先队列中所有文档的 ID 和排序值给协调节点,协调节点它合并这些值到自己的优先队列中来产生一个全局排序后的结果列表
- 接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端
总结:查询请求 -> 每个分片执行查询,结果(文档ID,排序值)转到优先队列 -> 每个分片返回队列数据给协调节点 -> 协调节点处理全局排序 -> 根据文档ID去每个分片查询完整数据 -> 返回客户端
158.详细描述一下Elasticsearch更新和删除文档的过程?
删除和更新也都是写操作,但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更;
磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。
在新的文档被创建时,Elasticsearch会为该文档指定一个版本号,当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。
159.ES有几种节点类型?他们的作用分别是什么?
三种节点类型,分别是:
协调节点(负载均衡)client:负责处理路由请求,处理搜索,分发索引操作等
主节点master:主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点
数据节点data:主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等,数据节点对CPU、IO、内存要求较高
160.你们用什么工具监控JVM?
Java提供了2个监视工具,都是在Java的bin目录下可以找到,jconsole.exe和jvisualvm.exe
161.JVM类加载流程?
类加载的过程包括了加载、验证、准备、解析和初始化这5个步骤:
- 加载: 找到字节码文件,读取到内存中.类的加载方式分为隐式加载和显示加载两种。隐式加载指的是程序在使用new关键词创建对象时,会隐式的调用类的加载器把对应的类加载到jvm中。显示加载指的是通过直接调用class.forName()方法来把所需的类加载到jvm中
- 验证: 验证此字节码文件是不是真的是一个字节码文件,毕竟后缀名可以随便改,而内在的身份标识是不会变的。在确认是一个字节码文件后,还会检查一系列的是否可运行验证,元数据验证,字节码验证,符号引用验证等.Java虚拟机规范对此要求很严格,在Java 7的规范中,已经有130页的描述验证过程的内容
- 准备: 为类中static修饰的变量分配内存空间并设置其初始值为0或null。可能会有人感觉奇怪,在类中定义一个static修饰的int,并赋值了123,为什么这里还是赋值0。因为这个int的123是在初始化阶段的时候才赋值的,这里只是先把内存分配好。但如果你的static修饰还加上了final,那么就会在准备阶段就会赋值
- 解析: 解析阶段会将java代码中的符号引用替换为直接引用.比如引用的是一个类,我们在代码中只有全限定名来标识它,在这个阶段会找到这个类加载到内存中的地址
- 初始化: 如刚才准备阶段所说的,这个阶段就是对变量的赋值的阶段
162.JVM类加载器有几种?
一共是有四种,前三种是必然存在的
- 启动类加载器:加载<JAVA_HOME>\jre\lib下的
- 扩展类加载器:加载<JAVA_HOME>\jre\lib\ext下的
- 应用程序类加载器:加载Classpath下的
- 自定义类加载器
163.JVM组成,以及他们的作用?
JVM是Java Virtual Machine 的缩写,正如他的英文名字,中文名字叫java虚拟机
- 程序计数器:用来确定指令的执行顺序,保证每个线程都能按正确顺序执行,此外,程序计数器是Java虚拟机规定的唯一不会发生内存溢出的区域
- Java虚拟机栈:每个方法执行都会创建一个栈帧,局部变量就存放在栈帧中,还有一些其他的动态链接之类的
- 本地方法栈:本地方法栈执行的是本地方法(Native Method)
- 堆内存:就是一个所有线程共享的,是存放对象的区域,也是GC的主要区域。其中的分区分为新生代,老年代,新生代中又可以细分为一个Eden,两个Survivor区(From、To)
- 元空间:jdk1.8中,已经不存在永久代(方法区),替代它的一块空间叫做“元空间”,和永久代类似,都是JVM规范对方法区的实现,但是元空间并不在虚拟机中,而是使用本地内存
164.JVM组成部分,哪些是线程共享的,哪些是不共享的?
JDK1.8以后,方法区被元空间替代,没有方法区了,元空间直接使用本地内存
165.在JVM层面,一个线程是如何执行的?
虚拟机会为每个线程分配一个虚拟机栈,每个虚拟机栈中都有若干个栈帧,每个栈帧中存储了局部变量表、操作数栈、动态链接、返回地址等。一个栈帧就对应Java代码中的一个方法,当线程执行到一个方法时,就代表这个方法对应的栈帧已经进入虚拟机栈并且处于栈顶的位置,每一个Java方法从被调用到执行结束,就对应了一个栈帧从入栈到出栈的过程
166.应用内存溢出了,如何定位问题出在哪儿?
方法一:在编译工具中进行配置,捕获jvm日志
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=d:\(打印日志的位置)
通过使用Java Visual VM 分析日志
方法二:jvisualvm分析内存快照,右键开启在出现OOME时生成堆dump,然后使用监视 - 堆Dump :如下,主要可以查看每个类占用的空间、实例的数量和实例的详情等
方法三:命令方式,执行jmap -dump 可以转储堆内存快照到指定文件,比如执行 jmap -dump:format=b,file=/data/jvm/dumpfile_jmap.hprof PID ,可以把当前堆内存的快照转储到dumpfile_jmap.hprof文件中,然后可以对内存快照进行分析
167.常用的垃圾回收算法有哪些,简单说一下?
常用的垃圾回收算法有三种:标记-清除算法、复制算法、标记-整理算法
-
标记-清除算法:分为标记和清除两个阶段,首先标记出所有需要回收的对象,标记完成后统一回收所有被标记的对象
-
复制算法:把内存分为大小相等的两块,每次存储只用其中一块,当这一块用完了,就把存活的对象全部复制到另一块上,同时把使用过的这块内存空间全部清理掉,往复循环
-
标记-整理算法:先对可用的对象进行标记,然后所有被标记的对象向一端移动,最后清除可用对象边界以外的内存
168.说说看JDK1.8中,堆的划分?分别使用是什么GC机制?
分区分为新生代,老年代;新生代中又可以细分为一个Eden,两个Survivor区(From,To)。
Eden中存放的是通过new 或者newInstance方法创建出来的对象,绝大多数都是很短命的。正常情况下经历一次GC之后,存活的对象会转入到其中一个Survivor区,然后再经历默认15次的GC,就转入到老年代.这是常规状态下,在Survivor区已经满了的情况下,JVM会依据担保机制将一些对象直接放入老年代
169.JVM优化的目的是什么?
使用较小的内存占用来获得较高的吞吐量或者较低的延迟
170.使用什么参数配置堆内存?使用什么参数配置配置栈内存?
参数 | 说明 | 实例 |
---|---|---|
-Xms | 初始堆大小,默认物理内存的1/64 | -Xms512M |
-Xmx | 最大堆大小,默认物理内存的1/4 | -Xms2G |
-Xmn | 新生代内存大小,官方推荐为整个堆的3/8 | -Xmn512M |
-Xss | 线程堆栈大小,jdk1.5及之后默认1M,之前默认256k | -Xss512k |
171.什么是JPA和Hibernate的关系?
- Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO(就是咱们的domain)与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
- JPA是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术
简单一句话:JPA是持久化规范,而Hibernate是其一种用得超级多的一种实现
172.JPA和MyBatis的区别,以及优缺点?
JPA是一种全自动的ORM框架
MyBatis是一种半自动的ORM框架
JPA:
- 优点:
1、程序操作简单,只需要做很少的配置
2、直接面向持久对象操作,不用写sql语句
3、数据库移植性很强,很少的修改(通过配置版本搞定) - 缺点
1、因为不写sql,所以没有办法进行sql优化
2、如果一张表中有上亿级别的数据量,也不适合用JPA
MyBatis:
- 优点:
1、可以对sql进行控制,进行优化
2、支持动态SQL编程
3、提供xml标签 - 缺点
1、sql语句编写工作量大,尤其是字段多、关联表多时,对程序员的sql语句的功底有一定要求
2、SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
173.介绍一下JPA内置的Repository?
- Repository是一个空接口,即是一个标记接口;
- 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,进而可以在该接口中定义满足一定规范的方法。
- 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。
- 查询方法以find | read | get开头;
- 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
- 使用@Query注解可以自定义JPQL语句实现更灵活的查询。
170.一对多使用什么注解,多对一使用什么注解?
一对多:@OneToMany
多对一:@ManyToOne
174.你们项目中ID使用JPA什么生成策略?
主键ID生成规则由@GeneratedValue设定的,主要有以下四种规则
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列(MySQL不支持)
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制
175.对象关联,延迟查询会有什么问题,怎么解决?
could not initialize proxy - no Session
在进行数据库访问之时,当前针对数据库的访问与操作session已经关闭且释放了,故提示no Session可用
配置一个OpenSessionInViewFilter,实现原理是在web环境中,执行业务之前通过filter前置拦截手动 openSession ,执行完之后通过filter的后置拦截手动closeSession,这样的话JPA就不会自动closeSession了,多个sql使用的是同一个Session。而我们在配置文件中的如下配置就是在开启该功能:该配置要整合SpringMVC才能用
open-in-view: true
176.多对多打什么标签?
@ManyToMany
177.JPA中对象的状态有几种?分别什么意思?
有四种状态:
- 临时状态(transient):瞬时状态
刚刚用new语句创建,没有和entityManager发生关系,没有被持久化,不处于entityManager中 - 持久化状态(persistent):托管状态
和entityManager发生关系,已经被持久化,加入到entityManager的一级缓存中 - 游离状态(detached):脱管状态
已经被持久化,但不处于entityManager中 - 删除状态(removed):从JPA才开始有的状态
只有调用了entityManager.remove(domain对象)方法,对象有关联的ID,并且在entityManager管理下,但是已经被计划删除,事务提交就真的被删除了
179.你们用Nginx,用来干嘛?
部署前端,反向代理/负载均衡,解决跨域,限流
180.Nginx的负载均衡算法有哪些?你们项目用的什么算法?
- 轮询(round robin)(默认):轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式
- 加权(weight):根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
- 一致性哈希(IP_hash):根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题
- url_hash(第三方):根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高
- fair(第三方):根据后台响应时间来分发请求,响应时间短的分发的请求多
181.在浏览器发起一个请求一个,这个请求会怎么执行?
- 首先在hosts中找寻本地域名是否匹配
- 本地没有的话在网络上找DNS(域名解析服务器)来解析域名
182.说10个docker的命令?
docker images ------->查看本地镜像
docker search 镜像名------->搜索远程镜像
docker rmi 镜像名:版本/imageId ------->删除指定镜像
docker rmi ‘docker images -q’ ------->删除所有镜像
docker pull 镜像名:版本 ------->拉取镜像
docker push 镜像:版本 ------->推送镜像到远程
systemctl start docker------->启动docker
systemctl stop docker------->停止docker
systemctl restart docker------->重启docker
systemctl status docker------->查看docker状态
systemctl enable docker------->开机启动
docker info------->查看docker概要信息
docker --help------->查看docker帮助文档
183.说一下你们这个项目是怎么部署的?
前端代码进行打包,打成html形式通过Nginx进行部署,后端代码打成jar包
Nginx中一个站点配置一个server
需要为门户网站、后台管理、java代码等配置域名
配置Nginx反向代理(集群还需要配置负载均衡)、以及跨域
184.docker容器通信有哪些方式?
- 通过容器ip访问:但是重启docker,ip会变化,查看ip
docker inspect 容器 | grep IPAddress
- 端口映射:把docker暴露到外部,这种方式不安全,只有暴露到外部需要访问才用
- 通过link建立连接:启动容器的时候,给要通信的目标容器使用link指定一个“链接名”,在容器中就可以使用“链接名”和目标容器通信,
docker run -di --name=容器名 --link mysql:容器名_mysql --link redis:容器名_redis
- 通过 User-defined networks:docker network来创建一个桥接网络,在docker run的时候将容器指定到新创建的桥接网络中,这样同一桥接网络中的容器就可以通过互相访问,通过
docker network create test-network
构建网络;docker run -it --network test-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
启动容器时,加入创建的网络;docker run -it --network test-network --network-alias centos centos /bin/bash
启动被链接的容器
185.docker构建镜像有哪些方式?
-
基于容器构建
通过命令docker commit 容器名 自己定义镜像名:版本号
-
dockerfile构建-脚本构建
上面介绍了什么是dockerfile
上面是一些基本的命令
基于centos:7安装jdk1.8
1)在宿主机准备包jdk1.8
2)搞一个centos7容器
3)把jdk1.8传到容器
4)解压缩jdk1.8
5)配置javahomepath -
maven插件构建-也是转换为dockerfile
1)开启Docker远程访问
2)刷新配置,重启服务
3)增加Docker插件
4)构建镜像
186.如何做端口映射?
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
187.如何拷贝文件到容器中?
docker cp 你的文件路径 容器名/ID:docker容器路径
188.你们项目中容器之间通信使用的是哪种方式?
通过link建立连接
189.Linux的常用命令,说10个?
arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的内核版本
shutdown -r now 重启
reboot 重启
logout 注销
cd … 返回上一级目录
cd …/… 返回上两级目录
mkdir dir1 创建一个叫做 ‘dir1’ 的目录’
mkdir dir1 dir2 同时创建两个目录
cp -a dir1 dir2 复制一个目录
find / -name file1 从 ‘/’ 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 ‘user1’ 的文件和目录
190.Docker-compose常用的命令?
docker-compose build - 构建容器
docker-compose up -d 启动服务
docker-compose ps - 查看容器
docker-compose down - 删除容器/网络/镜像
docker-compose stop - 停止容器
docker-compose restart - 重启服务容器
docker-compose -h - 查看帮助
docker-compose logs - 查看服务日志
docker-compose pull - 拉取镜像
docker-compose rm - 删除停止的服务容器
docker-compose start - 启动服务容器
docker-compose run - 在服务容器运行命令
docker-compose scale - 指定服务容器个数
191.大概说一下docker-compose的模板文件的格式?
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分