- 博客(152)
- 收藏
- 关注
原创 Mysql存储引擎
B+树新加新的数据时,主键如果自增,B+树只需要在后面的节点依次新增新的节点存放数据,而且也会做一个新增节点和上一个节点的平衡,而主键不自增时,则会导致新的数据插入到之前的节点中,会和之前的节点进行比较,直至找到和新数据大小相邻的节点中,然后还会做一个新的平衡,而这个平衡则可能涉及很多节点索引的排序,效率会很低。特点:先从索引文件中查找索引,然后通过索引索引对应的磁盘文件地址,再从数据文件中查找数据,索引文件和数据文件分开的,这样的索引也叫做非聚集索引,也称非聚簇索引。我们从根节点查找元素进行对比时,
2024-09-25 21:48:48
224
原创 Mysql索引底层数据结构
索引是排好序的数据结构,如何较为高效地存取数据?或者说为什么要使用索引呢?没有索引的情况下,我想通过select * from t where t.Col2=89;这条数据,那么首先则会通过跟磁盘进行I/O操作,从磁盘读取数据,然后将会从第一行0x07这个文件地址依次往下查找对比,共需要查找6次,即全表扫描。
2024-09-25 21:37:33
435
原创 mysql事务mvcc模型实现原理
MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突。如果没有MVCC,想要实现同一条数据的并发读写,还要保证数据的安全性,就需要操作数据的时候加读锁和写锁,这样就降低了数据库的并发性能。有了MVCC,就相当于把同一份数据生成了多个版本,在操作的开始各生成一个快照,读写操作互不影响。无需加锁,也实现数据的安全性和事务的隔离性。事务的四大特性中隔离性就是基于MVCC实现的。
2024-09-25 12:00:46
1041
原创 Spring Security 实现原理 ① 初始化过程
在了解Spring Security初始化过程,可以先了解一下spring bean的生命周期,以及springboot的自动装配原理。Spring Security的初始化过程是一个复杂但有序的过程,它主要依赖于Spring框架的自动配置机制以及开发者提供的配置信息。以下是从注解方式(Java Configuration)的角度来概述Spring Security在Spring Boot项目中的初始化过程。
2024-09-12 23:32:05
1032
原创 Spring MVC 实现原理 ②调用阶段
了解完初始化阶段,让我们看看调用的整个过程,我们都知道servlet的service是提供业务服务的,而DispatcherServlet也简介继承了Servlet,让我们来看看业务逻辑里具体做了什么事。
2024-09-09 15:03:15
516
原创 Spring MVC 实现原理 ① 初始化阶段
Spring mvc 的实现我们主要分两个阶段来了解,一个是初始化阶段,一个是调用阶段,在了解mvc之前,可以先了解一下servlet的生命周期servlet生命周期包括init一次,service多次,destroy一次而我们下面要了解的mvc初始化阶段,核心就是DispatcherServlet。
2024-09-09 13:57:01
413
原创 Spring @Async ②实现原理
在了解spring 异步任务之前,可以先了解一下spring bean的生命周期,可以看下spring bean生命周期,以及其他相关文章。
2024-09-07 16:18:49
1026
原创 Spring @Async ①入门案例
Async 是Spring提供的一种用于实现异步执行的注解,常用于解决IO密集型任务,如:数据库查询、文件读写、远程服务调用等。
2024-09-06 23:12:10
205
原创 Spring bean的生命周期
此前的面向对象设计思想说到,要面对抽象编程,不要面向具体编程,依赖至于抽象等,具体的有依赖倒置原则、里氏替换原则等等,而Spring核心思想DI和IOC就是对面向对象设计的一个实践。Spring框架(在Java中称为IoC容器)。在该框架中,通过XML配置文件建立接口和具体类之间的关系,IoC容器通过该配置文件来做具体的新建的工作,这样在实际应用中,只需要修改配置文件就能换成不同的具体类,从而不需要修改任何代码了。下面让我们来看看Spring IOC容器管理的bean的生命周期。
2024-09-06 17:17:16
216
原创 迪米特准则
该准则是由Karl Lieberherr等在一个叫Demeter的项目中提出来的,用于解耦因对象结构的变化和不稳定而导致与该对象耦合在一起的代码。其核心思想就是要求一个类尽量只与它的直接对象交互,避免与间接对象交互,这样就可以与最少的类产生耦合,从而使整个系统的耦合度保持最低。该准则给出了在一个方法内应该向哪些对象发送消息的限制,规定在较少的操作,操作的关联度很高,其任务也比较单一;该准则给出了在一个方法内应该向哪些对象发送消息的限制,规定在一个方法中,消息只能发往以下对象。◆ 该方法内部创建的对象。
2024-09-02 15:26:30
156
原创 依赖倒置原则(TheDependency Inversion Principle, DIP)
这是因为抽象的事物不同于具体的事物,抽象的事物发生变化的频率要低,让高层模块与底层模块都依赖于一个比较稳定的事物比去依赖一个经常发生变化的事物的好处是显而易见的。在该框架中,通过XML配置文件建立接口和具体类之间的关系,IoC容器通过该配置文件来做具体的新建的工作,这样在实际应用中,只需要修改配置文件就能换成不同的具体类,从而不需要修改任何代码了。在传统的自顶向下、自底向上的编程思想中,通过对模块的分层形成不同层次的模块,最上层的模块通常都要依赖下面的子模块来实现,从而就形成了高层依赖底层的结构。
2024-08-29 23:28:13
377
原创 接口隔离原则(The Interface Segregation Principle,ISP)
按照传统的设计方案,首先设计订单访问接口IOrder,该接口提供了订单类对外公布的所有操作,包括查询订单(getOrder)、添加订单(insertOrder)、修改订单(modifyOrder)和删除订单(deleteOrder),然后定义订单类(Order)来实现这些接口。而管理后台需要的管理接口IOrderForAdmin首先继承已有的接口,并添加其他相关的行为。由于只为订单类提供了一个“肥”接口IOrder,因此,门户网站、前台系统和管理后台3个外围系统都通过该接口来使用订单类。
2024-08-29 17:24:14
338
原创 单一职责原则(The Single Responsibility Principle, SRP)
因此,要合理评估类的职责,结合业务场景考虑职责的相关性,从而将不相关的职责相互分离,达到SRP所要求的类的内聚性。在该设计方案中,保留了Rectangle类中的与数学模型相关的职责,而将GUI方面的职责封装到一个新的GUIRectangle类中。同时,不同的职责耦合在同一个类中,一个职责的变化可能会影响其他职责,从而引发“脆弱性”的“臭味”。为此,类设计应遵从SRP,应建立高内聚的类。因此,一个好的设计方案是将其中的一类职责分离出来,从而保持每一个类处理一类职责,从而满足SRP。
2024-08-29 16:52:50
352
原创 开放—封闭原则(The Open-Close Principle, OCP)
变化是永恒的主题,不变是相对的定义”。软件系统也是如此,任何系统在其生命周期中都需要有应对变化的能力,这也是体现设计质量的一个最重要的功能。那么,什么样的设计才能应对需求的变更,且可以保持相对稳定呢。
2024-08-29 15:43:26
358
原创 Liskov替换原则(The Liskov Substitution Principle, LSP)
子类型(subtype) 必须能够替换它们的基类型(base type)。换一个角度来理解,对于继承层次的设计,要求在任何情况下,子类型与基类型都是可以互换的,那么该继承的使用就是合适的,否则就可能出现问题。即子类型不能添加任何基类型没有的附加约束。为了避免子类型针对基类型的行为添加附加的约束(即违背LSP),基类型中应该只提供尽量少的必需的行为,而且不针对这些行为进行任何实现。此时,那些基类型往往就是抽象类(行为没有任何实现),甚至是接口。
2024-08-29 14:43:17
977
原创 面向对象的设计原则
面向对象的设计原则是指导面向对象设计的基本思想,是评价面向对象设计的价值观体系,也是构造高质量软件的出发点。抽象、封装、多态等概念就是最基本的设计原则。
2024-08-29 09:44:20
126
原创 通过JProfiler快速分析定位线上OOM问题
XX:+HeapDumpOnOutOfMemoryError -Xmx1000M -Xms1000M不久后就会抛出异常:当前目录会生成一个快照文件:可以看到调用树:
2024-08-27 16:39:13
599
原创 JVM性能监控与调优
命令行工具jps:查看正在运行的线程jstat:查看JVM统计信息jinfo:实时查看和修改JVM配置参数jmap:导出内存映像文件和内存使用情况jstack:打印JVM中线程快照jstatd:远程主机信息收集JVM监控及诊断工具jdk自带jconsole:JDK自带的可视化监控工具VisualVM:JDK自带的可视化监视工具,位于JDK的bin目录下。它提供了一个可视界面,用于查看JVM上运行的基于Java技术的应用程序的详细信息。JMC:Java Mission Contro
2024-08-27 15:41:05
199
原创 字节码指令
在方法执行期间,执行线程持有了同步锁,其他任何线程都无法再获得同一个锁。如果一个同步方法执行期间抛出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的锁将在异常抛到同步方法之外时自动释放。在JVM中,任何对象都有一个监视器与之相关联,用来判断对象是否被锁定,当监视器被持有后,对象处于锁定状态,指令monitorenter和monitorexit在执行时,都需要在操作数栈顶压入对象。JVM支持两种同步结构,分别是方法内部一段指令序列的同步和方法级的同步,这两种同步都是使用monitor来支持的。
2024-08-26 16:01:12
226
原创 JVM方法执行过程
● 弹出操作数栈栈顶元素,保存到局部变量表第1个位置(把常量2保存到局部变量表)。● 弹出操作数栈栈顶元素,保存到局部变量表第2个位置(把常量3保存到局部变量表)。● 弹出操作数栈栈顶元素,保存到局部变量表第0个位置(把结果5保存到局部变量表)。● 操作数栈中的前两个int相加,并将结果压入操作数栈栈顶。● 变量表中第1个变量压入操作数栈。● 变量表中第2个变量压入操作数栈。● 常量3压入操作数栈。● 常量2压入操作数栈。
2024-08-26 15:40:00
177
原创 docker部署centos并安装python
项目上用到的python脚本使用的环境与服务器不一致,导致无法运行,用虚拟环境也遇到了不少问题,所以决定使用docker安装。
2024-08-09 10:25:24
311
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人