自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 MySQL-什么是InnoDB的页分裂和页合并

在InnoDB中,当索引页面中的索引记录被删除后,页面可能会变得过于稀疏,这时为了节省空间和提高性能,可能会触发页合并操作。页合并是指将两个相邻的索引页面合并成一个更大的页面,减少b+树的层级,提高查询性能。页分裂是指将该页面中的一部分索引记录移动到另一个新的页面中,从而为新纪录腾出空间,这样可以保持b+树的平衡和性能。页分裂和页合并涉及大量数据移动和重组,频繁进行这些操作会增加数据库的消耗,影响数据库整体性能。页分裂和页合并可能导致b+树索引结构频繁调整,这会影响插入和删除的性能。

2024-05-24 11:11:29 452 1

原创 MySQL主从复制过程

主服务的binlog dump线程检测到binlog变化时,会从指定位置开始读取内容,然后会被从服务的IO线程拉过去。从服务的IO线程会告诉主服务的binlog dump线程,自己会从什么地方开始接收binlog。从服务还有一个sql线程会不断读取relay log中的内容,解析成具体操作然后执行。从服务在开启主从复制后,会创建出两个线程,SQL线程和IO线程。从服务的IO线程会把内容保存在relay log中。

2024-05-24 11:09:30 356 1

原创 InnoDB和MyISAM区别

保存行数:InnoDB中不保存表的行数,MyISAM保存了表的行数。行锁:InnoDB支持行锁和表锁,MyISAM只支持表锁。聚簇索引:InnoDB支持聚簇索引,MyISAM不支持。事务:InnoDB支持事务,MyISAM不支持事务。外键:InnoDB支持外键,MyISAM不支持。

2024-05-24 11:08:08 77 1

原创 如何在SpringBoot启动过程中做缓存预热

实现InitializingBean接口中的afterPropertiesSet方法。通过@EventListener监听ApplicationReadyEvent事件。实现ApplicationRunner接口。使用@PostConstruct。

2024-05-24 11:04:40 339 1

原创 Spring的三级缓存是如何解决循环依赖的问题的

从三级缓存中拿到A的对象工厂创建一个半成品的A,放到二级缓存里面。从一级缓存中取不到A对象且未处于创建中。提前暴露,把A的创建工厂加入三级缓存中。从一级缓存中取不到B对象且未处于创建中。提前暴露,把B的创建工厂加入三级缓存中。从一级缓存中取不到A对象且处于创建中。从二级缓存中取不到A对象。初始化A,尝试注入B。初始化B,尝试注入A。

2024-05-24 11:03:47 317 1

原创 SpringBoot自动装配原理

AutoConfigurationImportSelector里面有一个selectImports方法,这个方法会返回一个字符串数组,这些字符串都是类的全限定类名,这些全限定类名都会被Spring通过反射的方式创建出来放到ioc容器中交给Spring管理。@EnableAutoConfiguration:里面Import了一个AutoConfigurationImportSelector。在启动类上有一个@SpringBootApplication注解,这是一个复合注解,里面有几个比较重要的注解。

2024-05-24 11:03:02 270 1

原创 Spring事务失效场景

方法被final static修饰。rollBackFor设置错误。访问控制符非public。异常被catch捕获。事务中使用了多线程。

2024-05-24 11:02:18 335

原创 Spring中用到了哪些设计模式

上游每次变动都需要下游感知到(比如支付之后要触发记账、发货)。在Spring中体现就是Event。:在Spring中体现就是TransactionTemplate、JdbcTemplate。:在不修改源码的基础上对原先的功能进行增强。在Spring中体现出来就是AOP。:Spring中的Bean默认都是单例的,这样可以最大程度保证对象的复用。:屏蔽创建对象的细节,方便外部使用。在Spring中体现出来就是IOC。

2024-05-24 11:01:20 378

原创 JUC-ThreadLocal

ThreadLocal里面有一个ThreadLocalMap,ThreadLocalMap里面有一个Entry数组,Entry的key是ThreadLocal对象,val是我们要存的值,Thread里面有一个ThreadLocalMap成员变量,每个线程都对应一个ThreadLocalMap。

2024-05-24 10:54:55 284

原创 JUC-线程池

然后理论值的话,如果是cpu密集型应用,则线程池大小设置为N+1,如果是IO密集型应用,则设置为2N+1,当然这只是理论上的值,最后还要结合我们的压测结果。Executors创建的线程池允许创建的最大线程数是Integer.MAX_VALUE,或者等待队列的长度是Integer.MAX_VALUE,可能发生oom。线程池说的是提前创建好一批线程,然后保存在线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。(3) 如果正在运行的线程数>=corePoolSize,把任务放进等待队列中。

2024-05-24 10:52:20 213

原创 JUC-CAS

CAS是一项乐观锁技术,思想是先比较再替换。CAS有3个操作数,内存位置V,预期值A,新值B。进行CAS操作时,会先比较内存位置V中的值和预期值A是否相同,如果相同就把内存位置V的值改成B,否则不做任何操作。一个线程1从内存位置v中取出a,这时另一个线程2也从内存位置v中取出a,并且线程2把内存位置v中的数据变成了b,然后线程2又把内存位置v中的数据变成了a,这时线程1进行CAS操作,发现内存位置v中的数据还是a和预期相同,线程1操作成功。但是不代表这个操作没问题。

2024-05-24 10:48:46 120

原创 基于Redis实现滑动窗口限流

滑动窗口是一种流量控制策略,用于控制在一定时间内允许执行的操作数量,在窗口内允许的操作数量是固定的,窗口会随着时间的推移不断滑动。

2024-05-24 10:46:02 433

原创 MySQL uuid和自增id哪个做主键更好

全局唯一不可预测适合用于分布式系统。

2024-05-13 16:25:30 185 1

原创 Redis中zset是怎么实现的

带多级索引的链表,各种操作时间复杂度为O(logN)。

2024-05-13 15:20:55 148 3

原创 JVM如何判断对象是否存活

给对象中添加一个引用计数器,当有地方引用它的时候计数器就+1,当引用失效,计数器就-1,当计数器为0的时候,对象就是不可能再被使用的。从GCRoots开始向下搜索,没有被搜索到的对象就是不可用的。三色标记法把对象分为三种状态:白色、灰色、黑色。白色:该对象没有被标记过。灰色:该对象已经被标记过了,但是该对象的引用对象还没有标记完。黑色:该对象已经被标记过了,而且该对象的引用对象全部被标记完了。

2024-04-06 13:15:43 163 1

原创 JVM-垃圾回收算法

当JVM发现内存中的垃圾后,就立即清除。首先把内存划分为两个区域,新创建的对象放在其中一块内存区域中,当快满的时候,就把标记出来的存活的对象复制到另一块内存区域中(复制的时候在内存空间上是严格排序且连续的),依次循环往复。标记整理法第一阶段会遍历GC Roots,标记出存活的对象。第二阶段会移动所有存活的对象,且按内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。标记清除法>标记复制法>标记整理法。

2024-04-06 13:13:36 181 1

原创 Redis-高可用方案

主从复制是指master节点把数据同步给其他的slave节点。Cluster集群是一个多主多从的分布式服务集群,Redis Cluster将所有数据划分为16384个slots(槽位),每个主节点都有对应的哈希槽,存放数据的时候,会根据crc16算法计算key的hash值来确定应该把key存贮到哪个槽位上,每个主节点都可以存放不同的数据,比哨兵模式更加节约内存。

2024-04-06 13:11:09 421 1

原创 JUC-线程池

我们先会估算整个业务的一个场景,它的一个并发量是多少,然后可以不断压测,不断调整,最终达到一个相对合理的值。然后理论值的话,如果是cpu密集型应用,则线程池大小设置为N+1,如果是IO密集型应用,则设置为2N+1,当然这只是理论上的值,最后还要结合我们的压测结果。线程池说的是提前创建好一批线程,然后保存在线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。(4) 如果等待队列已满并且正在运行的线程数<maximumPoolSize,创建新的线程执行该任务。(5) 线程池拒绝策略。

2024-04-06 13:10:07 295 1

原创 JVM-垃圾回收器

Serial GC是单线程的串行的垃圾回收器,回收新生代垃圾,采用标记复制算法进行回收。Serial Old是单线程的串行的垃圾回收器,回收老年代垃圾,采用标记整理算法进行回收。ParNew是多线程的并行的垃圾回收器,回收新生代垃圾,采用标记复制算法进行回收。Parallel Scavenge是多线程的并行的垃圾回收器,回收新生代垃圾,采用标记复制算法进行回收。与ParNew不同的是,Parallel Scavenge更关注垃圾回收的吞吐量(吞吐量=代码运行时间/(代码运行时间+垃圾回收时间))。

2024-04-05 10:27:57 787 1

原创 MySQL存储引擎

应用在读和插入比较多的地方,(更新和删除少)并且对事务的完整性并发性要求不高。如果对事务完整性要求比较高,就可以使用InnoDB。(1) 操作内存,速度比较快,但是会受到断电的影响。因为会受到断电的影响,所以适用于做临时表或缓存。(4) 不支持聚簇索引。(4) 支持聚簇索引。

2024-04-04 10:52:26 174 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除