1、框架
1、spring
1、定义
spring框架是一个为java应用程序提供一个综合,广泛的基础支持的java平台,帮开发者解决一些基础性问题,使开发者能更专注的进行应用的开发,而且它本身也是按照设计模式精心制造的,可以更方便集合spring框架。
2、使用spring的好处
1.轻量:spring是轻量的,基本的版本大约2MB
2.控制反转(IOC):spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖对象们
3.面向切面的编程(AOP):spring支持面向切面的编程,并且可以把业务逻辑和系统服务分开
4.容器:spring包含并管理应用中对象的生命周期和配置
5.MVC框架:spring 的 web 框架是个精心设计的框架,是 web 框架的一个很好的替代品
6.事务管理:spring提供了一个持续的事务管理接口,可以扩展到下至本地事务,上至全局事务
7.异常处理:Spring 提 供 方 便 的 API 把 具 体 技 术 相 关 的 异常 ( 比 如 由 JDBC,Hibernate or JDO 抛 出 的 ) 转 化 为一 致 的 unchecked 异 常
3、spring事务使用
在你需要事务的方法上加上@Transactional注解,那么这个方法就加上了事务,如果遇到异常,整个方法中的数据修改的逻辑都会被回滚,避免造成数据的不一致性。
4、Spring事务有哪几种事务传播行为?(propagation)
支持当前事务的情况:
1.REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务(spring默认的)
2.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
3.MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常(mandatory:强制)
不支持当前事务的情况:
4.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起(暂停)
5.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则把当前事务挂起(暂停)
6.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常
其他情况
7.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套(NESTED)事务来运行;如果当前没有事务,则该取值等价于REQUIRED
5、spring有哪些隔离级别(isolation)
1.DEFAULT:底层数据库存储的默认隔离级别,其他级别对应于JDBC隔离级别,eg:MySQL默认采用的是REPEATABLE_READ隔离级别,Oracle默认采用的是READ_COMMITTED隔离级别
2.READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据,可能导致脏读、幻读或不可重复读
3.READ_COMMITTED:允许读取并发事务以及提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
4.REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被事务自己修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生
5.SERIALIZABLE:最高的隔离级别,所有事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读和幻读。但是这将严重影响程序性能,通常也不会用到
2、springmvc
3、springboot
4、mybatisPlus
5、springcloud
1、定义
首先要明白微服务,它是一种架构风格,是由一个或者多个服务组成。可以由业务拆分成多个服务,每个服务都是独立部署的,也是可以去耦合的。
spring cloud是关注全局的微服务协调整理治理框架,它把这些拆分的服务整合并管理起来,为各个服务之间提供服务发现,远程调用,断路器,路由,配置管理等集成服务。
2、数据库
1、mysql
1、定义
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性
2、说说你对SQL优化的理解
1.应当尽量避免 select *, 使用指定具体字段的形式,读取越多数据查询越慢还会增加网络传输的负载
2.当只要一行数据时使用 limit 1,这样数据库引擎会在找到第一条数据停止搜索
3.为经常用来搜索字段建立索引
4.尽量不要让字段出现null值,因为null值在存储的时候不仅需要占用额外的空间,而且在查询的时候还有可能使索引失效
5.查询时避免索引失效
2、什么情况索引会失效(模型数空运最快)
1.首先索引要在使用索引作为查询条件才会生效
2.模糊查询前置%
3.数据类型不一样
4.对索引列使用函数计算
5.使用is not null
6.最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配
7.组合索引:如果全部字段建立索引,使用or不会失效,但是正常业务不可能所有都建立,所有会失效
3、MyISAM 和 InnoDB的区别
1.InnoDB支持事务,MyISAM不支持,InnoDB对于每一条sql都默认封装成事务,自动提交,这样会影响速度,所以可以多条sql语句组成一个事务一起执行
2.InnoDB支持外键,而MySAM不支持
3.InnoDB支持表锁和行锁,但是myisam只支持表锁
4.innodb在5.6版本之后支持全文索引,myisam一直支持
5.InnoDB最后叶子节点是存放时数据,而MySAM是存放地址,最后在通过地址找到数据
4、Btree 和 Hash 索引的区别
1.Hash索引只能用等值查询,不能用范围查询,等值查询速度比Btree高;Btree既可以使用等值查询,也可以使用范围查询
5、四大特性
1.原子性:一个事务,要么全部执行,要么不全不执行
2.一致性:一个事务的更新和提交后数据的一致性(例:A向B转账,不可能A扣了钱,B没收到)
3.隔离性:多个事务之间互相不影响
4.持久性:一个事务的提交是永久性的,就算服务器重启了,也不影响
6、隔离级别
1.读未提交(Read uncommitted):读取到还没提交的数据
2.读提交(Read committed):同一个事务内,多次读取不一样的数据
3.可重复读(Repeatable read):同一个事务内,不会读到其他事务对已有的数据的修改
4.串行化(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
1.脏读:一个事务读到另外一个事务还没有提交的数据
2.不可重复读:不可重复读是指一个事务先后读取同一条记录,但两次读取的数据不同
3.幻读:在一个事务的两次查询中数据笔数不一致(不可重复读和幻读的区别:一个是针对单条记录,侧重于修改,幻读则是针对查询总记录,侧重于新增和删除)
7、为什么mysql要使用B+Tree,而不是其他的
1、hash索引格式缺点
1.需要把所有数据加载到内存,比较浪费内存(可以看下扰动函数)
2.如果所有的查询时等值查询,那hash确实比较快,但是实际开发中的范围查询更多,所有hash就不太合适了
2、二叉树或红黑树
1.无论是二叉树还是红黑树都会因为数的深度而造成 io 的读写次数,从而影响读取效率
3、B+树
1.多叉树
2.节点有序
3.每一个节点可以存放多条记录
局部性原理:数据和程序都有聚集成群的倾向,分为空间局部性和时间局部行
磁盘预读:内存跟磁盘交互的时候要保证每次读取是一个逻辑单位,而这个逻辑单位叫做页,也叫datapage,一般都是4k或者8k,在进行读取的时一般都是4k的整数倍,而 innodb 每次读取默认是16k的数据
8、使用索引的出现的情况
1.回表 :通过查询的id,再去查找整行数据(例:select * )
2.索引覆盖:直接通过 id 查找数据(例:select id)
3.最左原则:聚合索引必须从最左开始
4.索引下推(mysql5.6后):查找一个有聚合索引的 (name,age),原本是直接从磁盘拿出所有的有 name 的,然后在内存中筛选有 age的,索引下推则是在磁盘中直接 拿到 name, 然后在根据 name 筛选出 age,因为数据是聚集存放的,而且整体的io次数减小,还能提升性能
9、mysql的索引一般有几层?
一般的情况下,3到4层就足以千万级别的表查询了
10、创建索引的字段是长了好还是短了好?
短了好,因为在层数不变的情况下,可以存储更多的数据量
11、我们在创建表的时候是用代理主键还是自然主键好?
尽量使用代理主键,自然主键的维护成本比较高
12、主键设置好之后,要不要自增?
在满足业务的情况下,可以使用自增,不自增会增加索引的维护成本
13、在分布式应用场景中,自增id还适用吗?
雪花算法,snowflack,自定义自增id生成器
14、聚簇索引和非聚簇索引
1.聚簇索引:数据跟索引是否是聚集储存的(innodb的主键索引就是聚簇索引,必须要包含一个主键列的:key,如果创建表的时候设置了主键,那么key就是主键,如果没有设置,那么key就是唯一键,如果唯一键也没有,那么就是key就是6字节的rowid)
2.非聚簇索引:myisam都是非聚簇索引,innodb的二级索引(普通索引,辅助索引)
15、建立索引的必要条件
1.对查询频次较高, 且数据量比较大的表, 建立索引
2.唯一性强的
3.需要作为其他表外键的字段
4.排序字段上, 因为排序效率低, 添加索引能提高查询效率
5.where条件后面可以考虑建立组合索引
9、CRC32(循环冗余校验规则)
2、redis
1、定义
redis是一个key-value类型的内存数据库,数据是在内存中操作的,定期通过异步操作吧数据库数据flush到硬盘上保存
2、常用数据类型
1.String(常用的字符串)
2.Hash(适合存储对象)
3.List(可以用来做消息队列)
4.Set(因为它是无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。应用场景:列表功能的自动排重(共同好友),也可用来求交集、并集、差集等)
5.Sorted Set(有序集合的成员是唯一的,但分数(score)却可以重复。应用场景:排行榜)
3、线程是否安全
1.从内部来讲:因为是串行的,所以安全
2.从外部来讲:可能无法保障,要自己在程序里做处理(可以使用Lua去实现)
4、常见问题
1、缓存雪崩
1、定义
由于大量热点key同时失效,导致所有的请求直接打到数据库上
2、解决方案
1.随机初始化失效时间(这样就不会造成全部同时失效)
2.不设置失效时间(不太友好)
3.如果是redis集群,可以把热点key分散在各个节点上
4.设置定时任务,快过期的时候更新一下
2、缓存穿透
1、定义
通过不存在的key去请求,然后redis上没有,就会打到数据库上
2、解决方案
1.不管是否是null值,都缓存到redis上
2.做筛选过滤,对于不存在的直接return
3.把那个故意请求的ip拉黑
4.布隆过滤器
3、缓存击穿
1、定义
缓存热点key忽然失效
2、解决方案
1.设置缓存不失效
2.分布式锁(单体可以使用互斥锁:让只有一个请求抢到锁,去数据库请求数据,其他等待,等后面这个拿到数据缓存到redis上,后面直接到redis去数据)
3、消息队列
4、设计模式
5、java基础
1、集合
2、多线程
3、反射
6、JVM
7、项目
标签:总结,事务,索引,spring,查询,面试,数据,主键 From: https://www.cnblogs.com/ki16/p/17300306.html