一、redis和mysql一致性怎么保证?
1.编写删除缓存的接口,在更新数据库的同时,调用删除缓存的接口删除缓存中的数据。
2.消息队列:ActiveMQ、消息通知;将更新操作发送到消息队列中,顺序更新mysql和redis。
二、redis分布式锁有了解过吗?
redis的特性:1.安全特性:互斥访问,即永远只有一个客户能拿到锁;
2.避免死锁:最终客户都可能拿到锁,不会出现死锁的情况;
3.容错性:只要大部分redis节点存活就可以正常提供服务。
redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对redis的连接并不存在竞争关系redis中可以使用sentnx命令实现分布式锁。当且仅当key不存在,将key值设为value;若给定的key已经存在,则sentnx不做任何操作。
三、ArrayList和Linkedlist的区别?
ArrayList:1.Arraylist使用动态数组实现,底层基于数组,它通过数组的连续内存空间存储元素,支持随机访问;
2.ArrayList适用于大量随机访问和遍历操作,但插入和删除元素时性能较低;
Linkedlist:1.使用双向链表实现,每个节点包含数据元素和两个指针,分别指向前一个节点和后一个节点;
2.Linkedlist适用于大量插入和删除的操作,对随机访问性能要求不高。
四、Mysql隔离级别
1.读未提交:事务中的修改未提交,其他事务可以读取到这些未提交的数据。
可能出现的问题:脏读、不可重复读、幻读;
2.读已提交:事务中的修改提交后,其他事务才能读取到这些已经提交的数据
可能出现的问题:不可重复读、幻读
3.可重复读:事务中查询结果保持一致,即使其他事务修改了数据也不会影响当前事务的查询结果
可能出现的问题:幻读
4.可串行化:最高隔离级别,确保事务之间完全独立,避免了所有并发访问问题,但可能导致性能下降
****补充:脏读、不可重复读、幻读
脏读:事务 A 读取了事务 B 更新但未提交的数据,然后基于这些数据进行了操作,如果事务 B 回滚了,则事务 A 读取到的数据是脏数据。导致读取到的数据不一致,可能会产生错误的计算结果或业务逻辑错误。
不可重复读:事务 A 多次读取同一个数据项,在两次读取之间,事务 B 修改了该数据项,并提交了事务,导致事务 A 读取到的数据不一致。导致同一个事务中多次读取到的数据不一致,可能影响事务的正确执行。
幻读:事务 A 多次查询一个数据范围,两次查询之间,事务 B 插入了新的数据项并提交了事务,导致事务 A 查询到的数据项数量不一致。
五、接口和抽象类的区别
1.接口是行为的抽象;抽象是对类的抽象
2.接口没有构造方法;抽象类有构造方法
3.抽象体现继承关系;接口体现实现关系
六、spring框架中用到了什么设计模式?
1.工厂模式:Beanfactory是简单工厂模式的体现,用来创建对象的实例
2.单例模式:Bean默认为单例模式
3.代理模式:spring的AOP功能用到了JDK代理和CGLIB代理
4.模板方法:用来解决代码重复的问题。
5.观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新。
七、注解实现的原理
1.编译时:编译器处理源代码时会检查注解,并可能据此生成额外的源代码和资源文件
2.类加载时:某些注解会在类加载到jvm时被处理
3.运行时:在程序运行阶段,可以通过反射机制访问注解信息。