- 博客(24)
- 收藏
- 关注
原创 事务、AOP、动态代理
事务的实现有两种,编程式、声明式,编程式利用Transactional template执行事务操作,声明式利用注解@Transactional,但这样的最小粒度是方法,必须把事务操作抽象成一个方法,无法让一个代码段事务执行。4、声明式事务时,事务中使用了多线程,因为声明式事务采用threadlocal保存事务上下文信息,多个线程的threadlocal是线程隔离的,无法恢复。声明式事务有失效的情况,因为基于AOP,而AOP 又是基于动态代理,所以如果动态代理失效则事务失效,那么什么情况会失效呢?
2024-10-24 16:51:38
204
1
原创 计网 各器件 作用所属分层
首先MAC地址可以让两个设备识别对方,并进行连接,设备多了之后,由于每台电脑能连的设备数量有限,所以用集线器,都到集线器找目的MAC地址的设备。但集线器需要广播给连在上面的所有设备,目的设备做出响应,效率太低。所以引入了交换机,交换机存储连在上面设备的MAC地址,根据目的地址进行转发。为什么有了MAC地址还需要IP地址?
2024-10-10 11:56:45
294
原创 序列化和反序列化
进行序列化时,虚拟机会先尝试调用要序列化对象里的writeobject和readobject方法(可使用户自定义序列化过程),如果没有 则采用默认方法进行序列化,进行反序列化时需要检查传入的字节数组中的serialVersionUID和本地对应类的serialVersionUID是否相同,如果不同则不能反序列化成功。我们创建的对象仅存在于JVM中,但当JVM停止运行时我们创建的对象就又可能丢失,为了保存下来这些对象,可以将他们进行序列化,转化为字节数组,反序列化就是将字节数组再恢复为对象。
2024-10-08 15:47:03
248
原创 SQL调优
查询字段索引覆盖,但where 条件没满足最左前缀或where的条件是前导列的一个范围explain select b from t2 where a in ('a','d','sd');5、隐式类型转换,索引本来是varchar类型,用int找:select * from mytable where name = 1;where条件未被索引覆盖explain select * from t2 where d = "ni";遍历全索引树扫描,要看是否没满足最左前缀法则。4、查询字段太多:只查询关键字段。
2024-09-23 11:02:26
197
原创 Redis八股总结
4核8g下,redis可支持10w的qps,mysql只能支持5000的并发编程中的事务和数据库的事务的原子性不太一样,数据库的原子性指要么全部成功要么全部失败,提供回滚机制;但并发编程中的原子性指执行过程中不可被拆分、不可被中断。redis以multi标记事务块开始,然后可输入一些语句,然后遇到exec命令后执行以上输入的所有命令,在执行之前会检查语句是否有错(检查的类似编译时异常),如果有则直接拒绝执行,没有则开始执行,如果执行过程中有错(类似运行时异常的概念),不会影响后续语句执行。
2024-09-04 14:35:51
331
原创 spring 中循环依赖及解决
用二级缓存可以解决普通对象的的循环依赖问题,但如果循环依赖的是aop增强的代理对象,代理对象是在对象初始化的最后才会生成,无法在二级缓存中获得,因此需引入三级缓存,三级缓存中是object factory,如果是代理对象,getobject就会返回增强后的代理对象。三级缓存:object factory通过getobject()方法可返回bean对象。二级缓存:仅创建了实例对象,未初始化好,没赋值的半成品对象。可采用@lazy注解懒加载构造方法中的依赖对象。一级缓存:存放完全初始化好的bean对象。
2024-09-04 12:07:40
173
原创 Redis数据类型及对应的数据结构
压缩列表,是一种紧凑的数据结构,将数据存储在一片连续的空间,头部存储整个列表的字节数,尾部偏移量,以及整个列表包含多少节点,中间存储数据,尾部标记结束点。改写了c语言实现的char ,设计了SDS简单动态字符串,在内部会存储字符串长度,以及分配给字符串的内存长度,可以快速准确获得字符串,并且扩充字符串时可先查询分配的内存是否够用,如果不够先扩充,避免缓冲区溢出的问题。整数集合,内部用整数数组保存元素,有多种类型的整数数组(int16,int32,int64),涉及到升级操作。
2024-08-31 17:53:11
315
原创 抽象类和接口?
只能单继承抽象类,可以多实现接口。接口中的方法都是abstract,java8之后可以有static方法。抽象类中可以有普通方法。接口中的成员变量只能是public static final。都包含抽象方法,必须在子类中重写。
2024-08-28 17:56:22
121
原创 静态代码块,构造方法执行顺序
父类静态代码块->子类静态代码块->父类普通代码块 -> 父类构造方法->子类普通代码块->子类构造方法。构造方法不可以被重写,但可以被重载。
2024-08-28 17:55:44
150
原创 String
采用+拼接字符串时,底层依然采用的stringbuilder,但每次调用都会创建新的stringbuilder对象,不如直接自己创建,采用stringbuilder拼接。该类用final修饰不可被继承,内部由private final 修饰字符数组,不可修改,不对外提供set方法。string中的equals是被重写过的,用于比较字符串字面值是否相等,原始object的equals默认实现比较的是引用地址是否相等。依然采用字符数组存储,但修饰不采用private final因此可以修改。
2024-08-28 17:55:06
144
原创 JVM相关
加载由类加载器完成,类加载器双亲委派模型,加载一个类时先寻找其父类加载器,若父类无法加载才会自己尝试加载,顺序是启动类、扩展类、应用类、自定义。内存共享的有堆(字符串常量池在堆里,堆中存放实例信息)和方法区(jdk8后变为在内存中的元空间不占用JVM空间,这里存放类信息,静态变量,运行时常量池),内存私有的有虚拟机栈(一个方法对应一个栈帧,方法的局部变量在此),本地方法栈,程序计数器。创建对象,给静态变量赋值,调用静态方法,加载子类前会先加载其父类。验证:主要检查文件、程序等是否存在危险与错误。
2024-08-28 17:54:14
623
原创 java 基础知识点总结
对于基本数据类型,==比较的是值,对于包装类,==比较的是对象地址,所以对象的比较用equals(),equals用于比较属性是否相等,hashcode可以辅助进行判断两个对象是否相等,如果hashcode不相等则一定不等,若hashcode相等,还需要equals为true才能确定真的相等。成员变量属于类,可被访问控制符和static修饰,可被final修饰,有默认初值,未被static修饰的对象存储在堆中属于实例变量,被static修饰的在方法区中属于类变量。defaut同一包中可访问。
2024-08-28 17:53:23
596
原创 项目问题总结
将库存存入redis,CAS库存大于0则可以买,一人一单,利用setnx,将用户id作为key,thread id作为value,判断当前id是否有值,如果有则不能获取锁,获取锁之后通过数据库查询订单是否存在,解锁时通过del操作解锁,为了避免线程1的锁超时释放后解线程2的锁,在解锁时需要判断value是否为当前线程id,保证释放的是自己的锁,且为了保证判断与解锁的原子性问题,将判断与解锁写入lua脚本。用户输入验证码,判断验证码是否正确,正确则生成JWT令牌存储用户信息,不正确则提示错误信息。
2024-08-28 17:52:50
182
原创 主从延迟总结
Mysql利用binlog实现主从的数据同步,binlog有statement row mixed三种格式,statement记录sql语句(RC下会由于事务乱序而造成主从不一致,RC下默认用row),row记录数据变化(更改的数据量大会使log数据量很大),mixed采用两种结合的方式。2、从数据库读操作太多,从既要处理读操作,还要执行binlog重建,处理会存在延迟。3、大事务,一个事务执行时间过长,很久之后才能执行其他操作,可以将大事务分解为多个。但这会随之带来主从延迟的问题,
2024-08-28 17:51:04
134
原创 分库分表总结
b、若根据买家字段分表,但查询时采用卖家id,可以维护一张卖家表,用空间换时间,但这张卖家表只做读操作,不做写,写操作依然在买家表中进行,防止大卖家造成的数据倾斜,卖家表从买家表进行同步。c、既不是买家,也不是卖家号呢,用订单号查询但分表字段是买家号,可以利用基因法,将买家id设计到订单号中,根据订单号可以推算买家id进而找到对应的表。雪花算法:64位,时间(ms级别),主机号,序列号,可以在1ms一个主机上生成大量id。3、操作涉及到多个库时,事务会失效,怎么保证事务?每个表设置步长,自增。
2024-08-28 17:50:11
160
原创 RocketMQ总结
并发消费、顺序消费(message queue selector(消息发送到同一个队列), messege listener orderly ,通过三把锁保证,一个队列的消息只发给同一个消费者,message queue锁保证一个队列中只有一个线程能消费,process queue锁保证重平衡后不会重复消费)防止本地事务提交成功但消息发送失败,消费者消费不到),此时对消费者不可见,只有本地事务提交后,会再发一个信号(2pc)消息才真正可被消费,如果没有收到信号,本地提供接口可查询事务状态。
2024-08-28 17:48:45
266
原创 Synchronized底层原理
syschronized通过实现锁的获取和释放当线程monitor enter后,会尝试获取锁,如果锁计数器为0则获得锁成功,并将锁计数器变为1,如果有想继续获取锁(重入),则锁计数器加一,monitor exit后,锁计数器减一,当为0时释放锁。
2024-08-28 17:01:27
168
原创 垃圾回收总结
标记复制的流程是,先放入eden区,满了之后采用标记复制将存活的放入suvivor区,然后继续向eden放,满了之后放入另一个空的suvivor区。是整堆的垃圾回收,采用了分区的方式,并有时间停顿模型,可以保证在M时间内最多N时间用于垃圾回收,后台维护了优先列表,优先选择回收价值最大的区域进行GC,注重控制STW的时间。注重减少STW的时间,采用了三色标记法,初始标记(STW),并发标记(STW),重新标记,并发清理。(标记复制)、serial old(标记整理)是串行的垃圾回收器,单线程进行垃圾回收。
2024-08-28 15:20:32
278
原创 线程池学习总结
Excutors中的singleThreadExcutor和FixedThreadPool使用的LinkedBlockingQueue,是没有大小限制的,如果一直添加任务则有OOM的风险,CachedThreadPool可以无限创建线程,如果任务执行过慢可能会创建大量线程,也有OOM的风险。接口自定义拒绝策略,当阻塞队列满了之后存入Mysql数据库中,并继承BlockingQueue实现混合阻塞队列,重写take方法,取任务时优先从数据库取,然后再从阻塞队列里取),线程工厂(重写这里可以定义线程的名字)
2024-08-15 11:44:11
470
原创 集合类null值存储总结
hashmap hashset可以存null,但null 的hash值都相同,所以只能存储一个null值。队列Arrayqueue,priorityqueue中也不可以存null,但linkedlist可以。concurrenthashmap不能存null。ArrayList可以存储任意数量的null值。hashtable不能存储null值。
2024-08-14 11:46:28
104
原创 双重校验锁实现单例模式
是为了避免并发下,A、B两个线程,加入A线经过第一次判断之后还未创建对象,B也进行了第一次判断,判断后交出时间片A继续执行,A创建结束后释放锁,B可获得锁继续执行,如果 不进行第二次判断则会再创建一个对象,无法保证单例。如果不加volatile则可能进行指令重排,1-》3-》2,如果A线程完成了前两部操作,此时B线程经过第一次判断singleton不为空,则直接返回,返回的会是一个空对象。是判断是否已经创建对象,如果已经有则不进行锁竞争,直接返回;3、将内存地址指向singleton对象。
2024-08-14 11:45:33
173
原创 HashMap线程安全问题
put操作时,如果两个线程同时put,且hash值发生了hash冲突,第一个线程判断之后线程执行权被2 抢占,线程2 进行hash冲突的判断并完成插入,线程1 再次获得执行权直接put,则会对线程2 的结果进行覆盖,造成数据丢失。在扩容时,如果一个位置是链表,多线程对链表进行操作时由于头插法可能会使扩容后的链表成环,再次访问时陷入死循环,但JDK1.8之后采用尾插法,可以解决成环的问题。hashmap线程不安全主要体现在PUT和扩容操作上。
2024-08-13 16:42:36
107
原创 io学习记录
io流分为字节流和字符流,字节流(inputstream,outputstream),字符流(reader,writer)字节流可以通过inputstreamwriter(fileinputstream)将字节流转为字符流,体现了适配器模式。poll用动态数组存储任务,突破了个数限制,和select共同的限制在于,内核态发现有准备好的任务后交给用户态所有任务,用户态需要重新遍历。NIO同步非阻塞,调用IO后不断轮询是否准备好,轮询时可以干其他事,准备好后可以被调用进行拷贝,拷贝时依然是阻塞的。
2024-08-13 10:05:58
167
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人