IOC&AOP概念?I0C好处?I0C和DI的关系?AOP原理?
什么是IOC,首先IOC又叫做控制反转,是Spring中的一个基础的特性。指的是在原来我们在使用对象的时候需要new一个对象,让然后通过set方法进行属性注入;而ioc的就是通过一个配置或者一个注解就可以自动往里面进行对象的注入。所以ioc并不是代表这种技术,而是更多的表现得是这种自动注入的设计思想
IOC和DI的关系:而DI(依赖注入)就是IOC的具体的实现。其中就包括构造方法注入、属性注入(@Autowired注解和@Resourse注解),setter注入
AOP指的是面向切面编程,作用就是将一些代码从业务中中分离出来,降低耦合。例如:公共日志的实现、事务的管理
AOP的实现原理:切点表达式(记录日志的方法)+环绕通知(操作类的信息、方法信息等)
Mysql事务的隔离级别
Mysql中的事务隔离界别主要是分为:读未提交、读已提交、可重复读和串行化。这些不同的隔离级别可以解决Mysql在并发的时候引出的脏读、不可重复读和幻读的问题
- 脏读:一个事务读取到了另一个事务没有提交的数据。例如:事务 A 修改了一条数据但还未提交,此时事务 B 读取到了事务 A 修改后的数据。如果事务 A 后续回滚,那么事务 B 读取到的数据就是无效的、不正确的(读已提交可解决)
- 不可重复读:一个事务在多次读取一个数据,读取的数据不同。例如:事务A读取了某条数据,事务B对这条数据进行了更改并且提交。当事务A再次读取这条数据发现与上次读取的数据不同(可重复读可解决)
- 幻读:幻读值得是在一个事务中按照某个条件进行查询,多次查询的结果集不一样。例如:事务A按照某些条件查询一些数据的时候,发现一些数据不存在,但是这个时候事务B插入了一些符合条件的数据并且提交。当事务A再次按照条件进行查询的时候发现结果中多了事务B插入的条件(串行化可解决)
Innodb引擎的默认隔离级别?怎么实现的?MVCC机制?MVCC一条记录有几个版本?
Innodb默认的隔离级别是可重复读。而事务的隔离性就是通过锁+MVCC机制来实现的
MVCC又叫做多版本并发控制,它会记录一个数据的多个版本,是的读写没有冲突,根据内部的匹配规则和当前的一些事务id来决定读取的数据是哪一个版本的。
MVCC底层实现主要是分为三个部分:隐藏字段、undo log日志和readView读视图。
- 隐藏字段:主键、事务id和回滚指针指向上一个版本的事务地址
- undo log:主要是记录回滚日志的,存储老版本的数据,在内部会根据回滚指针形成一个版本链,记录的不同版本的数据
- readView读视图: 解决的是一个事务选择版本的问题,在内部定义了一套匹配规则和当前的事务id来判断访问哪个版本的数据。并且在不同的版本下生成的快照读不一样最终的访问结果也不一样。在RC隔离级别下,每一次执行快照读的时候都会生成一个ReadView;rr隔离级别只是在第一次快照读的时候生成ReadView,后续复用
讲讲索引?联合索引听过么?场景(a=1&b>2&c=2)和(a=1|b=2|c=3)索引失效问题?追问用or一定会索引失么?怎么看sq1是不是走索引了?
索引是一种高效查询数据的一种数据结构。主要的作用就是:加快查询速度,降低数据库的io成本,同时也通过索引对数据进行一个排序。
联合索引就是多个列组成的索引(更加节省空间,查询性能高)。当查询条件涉及联合索引中的多个列的时候,数据库可以通过联合索引快速定位数据。但是联合索引必须原配遵循最左前缀原则,只有查询条件从最左侧的列开始匹配,索引才会发挥最大作用
对于场景 (a=1&b>2&c=2)
,如果创建的联合索引顺序是 (a, b, c)
,那么这个查询通常能够使用索引。因为它遵循了最左前缀原则,从索引的最左侧字段开始匹配条件,而对于场景 (a=1|b=2|c=3)
,这种使用 OR
连接的条件,可能会导致索引失效。因为 OR
操作可能使数据库难以利用索引进行优化查询
使用 OR
不一定会导致索引失效。例如,如果每个 OR
条件中的字段都有单独的索引,或者 OR
条件中的字段在一个联合索引中,并且查询条件能够匹配联合索引的最左前缀部分,那么仍然可能使用索引
使用explain/desc+select语句就可以出现一张表,看其中的key(当前sql实际命中的索引)和key_len(索引占用的大小)字段
redis的常用数据结构?zset和set有啥区别?做排行榜用什么?
redis常用的数据结构:String、Hash、List、Set、ZSet
其中set表示的无序无重复集合,而ZSet中的字段需要存储一个分数可以根据这个分数对数据进行排序,代表有序无重复集合。所以如果做排行榜这种需要使用zset
redis的持久化方式?AOF和RDB的优缺点?如何解决AOF文件太大的问题?除了文件大小还有别的区别?
redis实现持久化主要是两种方式:AOF和RDB
- AOF:AOF是一种追加文件,当对redis进行写操作的时候,这个语句会被记录到追加文件中,当需要恢复数据的时候只需要执行这个文件即可
- 优点:不容易丢失数据
- 缺点:文件可能会比较大,恢复速度慢
- RDB:RDB是一种二进制快照文件,它会每隔一段时间就进行一次快照,当需要恢复数据,就将RDB中的数据拷贝到redis即可
- 优点:二进制文件所以恢复速度快,文件大小下
- 缺点:由于是按照一定的频率进行快照,所以可能出现丢数据的情况
了解决AOF文件体积不断增大的问题,用户可以向Redis发送BGREWRITEAOF命令,这个命令会通过移除AOF文件中的冗余命令
来重写(rewrite)AOF文件,使AOF文件的体积变得尽可能地小
cookie和session有啥区别
存储位置:cookie数据存储在客户端(浏览器),Session数据存储在服务器端
安全性:cookie存储在客户端所以安全性不如Session
讲讲restful的概念
RESTful的核心思想是将网络上的资源视为一种状态,并通过HTTP协议(get、post、put、delete)来传输和操作这些状态。
POST和GET有啥区别?POST、GET、PUT、DELETE应用什么场景
post和get区别:
- 数据传输的方式:
- GET是将数据作为url的一部分进行传输,数据会显示在浏览器的地址栏中
- POST是将数据放在请求体中进行传输
- 安全性:
- GET传输时可见的不太安全
- POST相对安全,适用于传输敏感和大量数据
- 用途:
- GET 方法常用于获取数据,如查询操作。
- POST 方法常用于提交数据,如表单提交、创建新资源等
POST、GET、PUT、DELETE 的应用场景:
-
GET:
- 用于获取资源的信息,如获取用户列表、获取文章详情等。
- 适合只读操作,不改变服务器上的数据。
-
POST:
- 用于创建新的资源,如注册新用户、发表新文章等。
- 通常用于向服务器提交表单数据。
-
PUT:
- 用于更新现有资源的全部信息。
- 例如,更新用户的完整信息或更新一篇文章的全部内容。
-
DELETE:
- 用于删除指定的资源,如删除用户、删除文章等。
幂等性概念?如何实现接口的幂等?
幂等性指的就是统一操作无论是执行多少次,产生的结果集都是相同的。
实现接口幂等的方法:
- 使用唯一标识符:为每一个请求创建唯一的标识符(如订单号、交易号),服务端会根据这个标识符判断是否处理过这个请求
- 分布式锁:在处理请求的时候,获取分布式锁,处理完成释放分布式锁。如果锁获取失败,则表示正在处理或者已经处理过,直接返回
- 利用数据库的约束:通过数据库的唯一索引、主键约束等,防止重复数据的插入。例如:在插入用户信息时,以用户 ID 作为主键,如果尝试插入相同用户 ID 的数据,数据库会拒绝