个人技术分享

一、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.运行时:在程序运行阶段,可以通过反射机制访问注解信息。