阶段复盘与总结(一)

前言

一直想着复盘下知识点,刚好趁着最近的间隙时间,进行一个简单的阶段系列小结,如下

======================================================================================================

--1、spring 的生命周期、ioc\aop
(1)Spring的生命周期主要指创建、初始化、销毁。Bean的生命周期主要由容器进行管理,我们可以自定义bean的初始化和销毁方法,容器在bean进行到生命周期的特定时间点,来调用自定义的初始化和销毁方法。
以下需结合项目以及实际生产的使用进行进一步的解释
(2)ioc控制反转
(3)AOP面向切面
--2、int 和 integer的区别
两者的区别主要体现在以下几个方面:
(1)数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型;
(2)默认值不同:int 的默认值是 0,而 Integer 的默认值是 null(3)内存中存储的方式不同:int 在内存中直接存储的是数据值,而 Integer 实际存储的是对象引用,当 new 一个 Integer 时实际上是生成一个指针指向此对象;
(4)实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要;
(5)变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals 来比较两个变量是否相等。
--3、list的种类和区别
(1)作为共享变量时,存在线程安全问题,作为方法局部变量时,没有线程安全问题
(2)ArrayList与LinkedList区别、ArrayList与Vector区别
    ①底层数据结构不同:ArrayList底层时数组  LinkedList是双向链表,数据结构不同导致api有所差异,比如新增A会计算并决定是否需要扩容,然后把新增的数据直接赋值到数组上;而L只需要改变插入节点与前后节点的指向关系即可
	②A常用于快速查询匹配,L常用于新增与删除,适合大量修改
	③Vector与ArrayList区别是V是线程安全的集合,在需要线程安全且对效率要求比较低的情况,使用Vector
--4、Collections知识 ------------>原文链接:https://blog.csdn.net/qq_50692350/article/details/126292057
--5、map的种类与区别
Map类有:HashMap,LinkedHashMap,TreeMap
(1)HashMap中k的值没有顺序,常用来做统计,keyvalue可以为空,同时是线程不安全的,存入和输出的数据,顺序可能发生变化。
(2)LinkedHashMap。它内部有一个链表,保持Key插入的顺序。迭代的时候,也是按照插入顺序迭代,而且迭代比HashMap快,存入和输出的数据,顺序保持一致。
(3) TreeMap的顺序是Key的自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序。
需要多说明一下:HashMap它的访问时根据容器的大小进行访问,如果容器过大,那么它访问的时间也会变长,但是它访问单个数据的速度要比LinkedHashMap要快,因为linkedHashMap是基于链表有前驱和后继数据占的空间也比较大。LinkedHashMap是HashMap的一个子类。
--6、在JDK1.7和JDK1.8中HashMap有哪些不同
(1)1.8用了红黑树
(2)1.7用了头插法,1.8是尾插法
(3)1.7会rehash,1.8没有这个代码逻辑,但他多了putIfAbsent(key,value)
--7、spring cloud的用到了哪些
--8、项目中是如何处理分布式事务
--9、常用的linux指令
(1)cd /u01/page/                                                          进入文件路径  
(2)ll                                                                     查看当前路面下所有文件
(3)mv oisp-beijing-web.zip   oisp-beijing-web$(date +%Y%m%d%H%M%S).zip    zip重命名
(4)zip -p -r oisp-beijing-web.zip oisp-beijing-web/                       压缩项目
(5)unzip -o oisp-beijing-web.zip                                          解压
(6)history                                                                查看历史
(7)tail -f 日志.log                                                       查看实时日志
(8)tail -f -n 100 日志文件名                                              查看日志后100
--10、数据库优化有哪些 ------------>原文链接:https://blog.csdn.net/m0_72088858/article/details/126815713
(1)最左前缀法则:
如果使用多个列创建了组合索引,则必须满足最左前缀法则才会使用索引,即查询条件中使用了组合索引靠左边的列就会使用索引,不能跳过组合索引的列。
①例如:
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技'
这条查询语句的条件使用了name,组合索引为:“name,status,address”,属于组合索引靠左边的列。
②再比如:
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技' AND STATUS = 1
这条查询语句的条件使用了name和status,属于组合索引靠左边的列。
③再比如:
  EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技' AND STATUS = 1 AND address = '北京市'
这条查询语句的条件使用了name,status和address属于组合索引靠左边的列。
这三条查询语句都满足最左前缀法则会使用索引。
再来看看不符合最左前缀法则的例子:
④例如:
  EXPLAIN SELECT * FROM tb_seller WHERE STATUS = 1
这条sql语句的查询条件跳过了name,直接使用status不符合最左前缀法则
  EXPLAIN SELECT * FROM tb_seller WHERE STATUS = 1 AND address='北京市'
这条sql语句同样跳过了name不符合最左前缀法则
如果查询条件跳过了组合索引的某列则只有左边的索引会生效
⑤例如:
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技' AND address='北京市'
只有name上的索引会生效

(2)范围查询右边的列不能使用索引
例如:
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技' AND STATUS='1' AND address = '北京市'
这条sql语句会使用组合索引中的每一列:
下面这条sql语句使用了范围查询:
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技' AND STATUS>'1' AND address = '北京市'
索引只能使用name和status索引,不能使用address索引,因此key_len 为410 

(3)如果在索引列上进行运算操作索引会失效:
例如:
EXPLAIN SELECT * FROM tb_seller WHERE SUBSTRING(NAME,3,2) = '科技' 
这个sql语句的索引列name使用了substring函数所以索引会失效。

(4)字符串不加单引号会导致索引失效:
例如:
EXPLAIN SELECT * FROM tb_seller WHERE NAME='科技' AND STATUS = '0'
字符串’0’加了单引号,会使用索引列name和status查询
 EXPLAIN SELECT * FROM tb_seller WHERE NAME='科技' AND STATUS = '0' 
如果使用下面的sql语句,0没有加单引号,只会使用索引列name来查询:
EXPLAIN SELECT * FROM tb_seller WHERE NAME='科技' AND STATUS = 0

(5)尽量使用覆盖索引即查询的列都是索引中的列避免使用 select * :
例如:
EXPLAIN SELECT NAME,STATUS FROM tb_seller WHERE NAME='科技' AND STATUS = '0' AND address='西安市'
效率比:
EXPLAIN SELECT * FROM tb_seller WHERE NAME='科技' AND STATUS = '0' AND address='西安市'
要高。

(6)or分割开的条件当中只要有一个非索引列则不会使用索引:
例如:
EXPLAIN SELECT NAME,STATUS FROM tb_seller WHERE STATUS = '0' OR PASSWORD='123'
会导致全表扫描

(7)%开头的模糊查询索引失效。
例如:
EXPLAIN SELECT * FROM tb_seller WHERE NAME LIKE '%米'
这种情况可以采用覆盖索引来解决:
EXPLAIN SELECT NAME FROM tb_seller WHERE NAME = '小米科技'
--11、说说项目使用到redis的地方
(1)保存一些通用参数表信息到redis方便即时查询
(2)通过锁获取redis只增数生成指定业务批次号
--12、说说nginx的使用,配置文件有什么信息
(1)配置文件信息
nginx.conf的内容分为以下几段:
main配置段:全局配置段。其中main配置段中可能包含event配置段
event {}:定义event模型工作特性
http {}:定义http协议相关的配置-----端口、服务地址
配置指令:要以分号结尾,语法格式如下:
derective value1 [value2 …];
(2)作用;nginx错误日志地址配置,服务上传地址,web指定跳转
--13、索引失效的原因有哪些 ------------>原文链接:https://www.cnblogs.com/xiaolincoding/p/15839040.html
(1)当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
(2)当我们在查询条件中对索引列使用函数,就会导致索引失效。
(3)当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。
(4)MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
(5)联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
(6)WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。
(7)查询条件中有 is null
(8)查询条件中有<> / not in / not exists
--14、消息队列用到了哪些
--15、数据迁移的过程是怎么处理的
--16、索引的底层原理 ------------>原文链接:https://blog.csdn.net/xxxcAxx/article/details/128197710
(1)索引是排好序的快速帮助MySQL高效获取数据的数据结构。
(2)优点:
①提高数据检索的效率,减少数据库IO的成本;
②通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
(3)缺点:
①索引会占据磁盘空间
②索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
③创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
④对表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度
⑤如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
⑥对于非常小的表,大部分情况下简单的全表扫描更高效。
(4)索引的分类
根据索引的具体用途,MySQL 中的索引在逻辑上分为以下 5 类:
①普通索引(索引名:index)
普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统对数据的访问速度。普通索引允许在定义索引的列中插入重复值和空值。
②唯一索引(索引名:unique)
顾名思义,唯一索引就是专门为具有唯一约束字段创建的索引。当一个字段被设置唯一约束时,MySql会自动为此字段创建唯一索引。唯一索引列的值必须唯一,但允许有空值。
③主键索引(索引名:primary key)
顾名思义,主键索引就是专门为主键字段创建的索引。当一个字段被设置为主键时,MySql会自动为此字段创建主键索引。主键索引是一种特殊的唯一索引,不允许值重复或者值为空。
④全文索引(索引名:fulltext)
全文索引主要用来查找文本中的关键字,只能在 CHARVARCHARTEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
⑤空间索引(索引名:spatial)
空间索引是对地理空间数据类型 GEOMETRY的字段建立的索引。创建空间索引的列必须将其声明为 NOT NULL,空间索引只能在存储引擎为 MyISAM 的表中创建。对于初学者来说,这类索引很少会用到。
--17、redis的优势
(1)单线程
(2)纯内存 KV
(3)高效的数据结构及合理的数据编码
(4)同步非阻塞I/O——多路复用
--18、ob数据库的底层原理  ------------>原文链接:https://blog.csdn.net/songyun333/article/details/125393117
(1)OB是分布式的关系型数据库。
(2)部分节点故障后内部自动切换恢复服务,不需要运维人员或工具产品介入。切换恢复时间在30s以内, 绝对不丢数据。
(3)有多(租户)实例管理能力,集群资源作为一个池子,分出多个(租户)实例给不同业务使用。
(4)极致的弹性伸缩能力。租户扩容和缩容一个命令搞定,集群扩容和缩容也是一个命令搞定。弹性伸缩涉及到的负载均衡和数据迁移等事情都是数据库内部异步完成。 运维很方便。
(5)对硬件要求低。普通PC服务器,普通SSD盘(OB对SSD写很友好,即随机写很少),千兆或万兆网卡。不需要存储、光纤,不需要小机。
(6)OB的数据压缩能力也很强,16T的数据大概会压缩到3T左右
--19、oracle和mysql的区别
MySQL比较小,而且免费,开源的缘故,现在也很健壮,若不是大型应用的话,MySQL足以应付一切。
oracle比较庞大,整个体系都很健全。简单的说MySQL是实用很好用,oracle就是很好很强大
(1)Oracle是大型数据库,Mysql是中小型数据库
(2)Oracle占有内存空间大,Mysql占有小
(3)Oracle支持大并发访问量,是OLTP最好的工具,Mysql并发小,面对大访问量可以做分表分库优化
(4)Oracle没有自动增长类型,Mysql一般使用自动增长类型
(5)Oracle处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80,MYSQL处理翻页的SQL语句比较简单,用LIMIT开始位置,记录个数
(6)MYSQL的非空字段有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义Oracle是is null
(7)MYSQL里用 字段名 like%字符串%,ORACLE用 字段名like '%字符串%'但不能使用索引,速度不快。【like%’开头 无法使用索引 不使用开头 可以使用索引】
(8)Oracle实现了ANSII SQL中事务的隔离级别、传播特性等比Mysql强;
--20、springBoot的启动流程
(1)启动springboot这需要执行SpringApplication执行类即可
(2)执行的时候执行两个重要的代码,@springBootApplication和 SpringApplication.run
(3) @springBootApplication 利用springboot的自动装载加载了META-INF下的spring.factories配置文件,将配置文件的所有类都注册到容器IOC中,执行完成
(4)调用SpringApplication.run
   ① createApplicationContext()创建了上下文,并且同时注册spring的核心组件
   ②refreshContext()启动Spring容器和内置的Servlet容器(tomcat)
(5)总结@SpringBootApplication注解由三个注解共同完成自动装配,各个注解作用如下
@SpringBootConfiguration: 标记启动类为一个spring配置类
@EnableAutoConfiguration: 实现自动装配的核心注解(重头戏)
@ComponentScan: 扫描启动类所在的包以及子包下所有标记为Bean的组件并注册到IOC容器中
--21、SpringMVC工作流程
(1)浏览器发起HttpRequest请求;
(2)DispathcherServlet(前端控制器)收到请求后,会向HandlerMapping(处理器映射器)发送请求;
(3)HandlerMapping(处理器映射器)收到请求后,返回对应的执行链;
(4)前端控制器将执行链发送给相应的HandlerAdaptor(处理器适配器);
(5)HandlerAdaptor(处理器适配器)通过执行链去让相应的Controller(处理器)执行,并返回一个ModelAndView对象给前端控制器;
(6)DispathcherServlet(前端控制器)会将这个ModelAndView对象去向ViewResolver(视图解析器)进行匹配和请求;
(7)ViewResolver(视图解析器)解析后会给前端控制器返回一个View;
(8)前端控制器将相应的view进行视图渲染,形成HttpResponse(响应对象),响应给浏览器,展示在页面上。
--22、Spring和Spring Boot区别
Spring 和 Spring Boot的最大的区别在于Spring Boot的自动装配原理:
(1)我们使用Spring创建Web程序时需要导入几个Maven依赖,而Spring Boot只需要一个Maven依赖来创建Web程序,并且Spring Boot还把我们最常用的依赖都放到了一起,现在的我们只需要spring-boot-starter-web这一个依赖就可以完成一个简单的Web应用。
(2)以前用Spring的时候需要XML文件配置开启一些功能,现在Spring Boot不用XML配置了,只需要写一个配置类(@Configuration和继承对应的接口)就可以继续配置。
(3)Spring Boot会通过启动器开启自动装配功能以@EnableAutoConfiguration扫描在spring.factories中的配置,然后通过@XxxxautoConfiguration进行扫描和配置所需要的Bean,自动的扫描Spring
(4)Boot项目引入的Maven依赖,只有用到的才会被创建成Bean,然后放到IOC容器内。
--23、数据库调优方案
(1)表结构优化:数据库表冗余字段以减少大数据表的关联,如果这个字段更新会同时涉及到多个表的更新,因此在选择冗余字段时要尽量选择不经常更新的字段。
(2)硬件优化:在前期业务量比较小的时候,升级硬件数据库性能可以得到较大提升;但是在后期,升级硬件得到的收益就不那么明显了。
(3)分库分表:单应用单数据库 、水平拆分的方式也很多,除了上面说的按照 id 拆表,还可以按照时间维度取拆分,比如订单表,可以按每日、每月等进行拆分。
每日表:只存储当天的数据。
每月表:可以起一个定时任务将前一天的数据全部迁移到当月表。
历史表:同样可以用定时任务把时间超过 30 天的数据迁移到 history表。
总结一下水平拆分和垂直拆分的特点:
垂直切分:基于表或字段划分,表结构不同。
水平切分:基于数据划分,表结构相同,数据不同。
总结:如果出现数据库问题不要着急分库分表,先看一下使用常规手段是否能够解决。
--24、mybatis 的一级缓存二级缓存
(1)一级缓存S
①一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,默认打开一级缓存,它的作用域是sqlsession级别的,同一个sqlsession中执行相同的sql和参数时,第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。
②何时清空一级缓存
如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
③一级缓存无过期时间,只有生命周期
MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个Executor对象,Executor对象中持有一个PerpetualCache对象,见下面代码。当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
(2)二级缓存
①它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。
②在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。
③开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中。
④二级缓存有过期时间,但没有后台线程进行检测
需要注意的是,并不是key-value的过期时间,而是这个cache的过期时间,是flushInterval,意味着整个清空缓存cache,所以不需要后台线程去定时检测。
每当存取数据的时候,都有检测一下cache的生命时间,默认是1小时,如果这个cache存活了一个小时,那么将整个清空一下。
(3)当 Mybatis 调用 Dao 层查询数据库时,先查询二级缓存,二级缓存中无对应数据,再去查询一级缓存,一级缓存中也没有,最后去数据库查找。
--25、消息队列问题(如何处理重复消费、消息丢失)
 ------------>原文链接:https://blog.csdn.net/qq_37221991/article/details/101476862
 ------------>原文链接:https://blog.csdn.net/YJulius/article/details/121546885
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值