自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【汇总贴】那些年的学习汇总贴

持续更新中。

2023-12-21 21:56:16 1122

原创 【MYSQL】当前读和快照读

复习下隔离级别:1、读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。2、读提交:一个事务提交之后,它做的变更会被其他事务看到3、可重复读:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。未提交的数据对其他事务不可见4、串行化:对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

2024-08-13 23:11:30 687

原创 【MYSQL】Doublewrite Buffer双写缓存区

一般情况下,其余程序因为需要跟操作系统交互,所以它们的页(Page)大小都为操作系统页大小的整数倍。比如,Oracle的Page大小为8KB。MySQL程序是跑在Linux操作系统上的,理所当然要跟操作系统交互,所以MySQL中一页数据刷到磁盘,要写4个文件系统里的页。需要注意的是,这个刷页的操作并非原子操作,比如我操作系统写到第二个页的时候,Linux机器断电了,这时候就会出现问题了。造成「页数据损坏」。并且这种页数据损坏靠 redo日志是无法修复的。

2024-08-12 21:16:18 1187

原创 【MYSQL】MYSQL三大日志undolog,redolog,binlog

MySQL InnoDB引擎使用redo log日志保证事务的持久性undo log日志保证事务的原子性。MySQL数据库的数据备份、主备、主主、主从离不开binlog,需要依赖binlog来同步数据,保证数据的一致性。

2024-08-09 23:23:00 863

原创 【MYSQL】MYSQL逻辑架构

mysql逻辑架构分为3层1). 连接层:主要完成一些类似连接处理,授权认证及相关的安全方案。2). 服务层:在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,SQL接口,SQL解析,SQL分析优化, 缓存查询的处理以及部分内置函数执行(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视图等。3). 引擎层:是底层数据存取操作实现部分,由多种存储引擎共同组成。真正负责MySQL中数据的存储和提取。

2024-08-04 21:00:06 388

原创 【redis】一致性hash算法和hash槽

类似于 windows 盘分区的概念。这种分区是可以自定义大小,自定义位置的。

2024-07-25 22:21:16 1308

原创 【redis】redis常见的集群部署模式

redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出了哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可以自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。(另外一种就是单机,单机先不说了,我们直接开始说集群)

2024-07-25 21:37:13 751

原创 【分布式事务】怎么解决分布式场景下数据一致性问题

原本收到充值回调后,可以将修改订单状态和扣减余额放在一个mysql事务中完成的,但是呢,因为服务拆分了,就面临着需要协调2个服务才能完成这个事务,所以我们怎么解决分布式场景下数据一致性问题呢?2、Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错的。在XA规范中,数据库充当RM角色,应用需要充当TM的角色,即生成全局的txId,调用XAResource接口,把多个本地事务协调为全局统一的分布式事务。

2024-07-19 23:35:46 823

原创 【JVM】类的加载机制

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。这个阶段是在元数据验证之后,对类的方法体进行校验分析,保证被校验类的方法在运行时不会做出危害虚拟机的安全事件,主要目的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。

2024-07-17 22:42:35 684

原创 【JAVA基础】反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。

2024-07-17 22:35:12 910

原创 【MYSQL】如何解决 bin log 与 redo log 的一致性问题

该问题问的其实就是redo log 的两阶段提交。

2024-07-08 22:08:57 1050

原创 【MySQL】事务四大特性以及实现原理

通过Undo Log实现事务的原子性,当事务开始时,MySQL 会在undo log中记录事务开始前的旧值。InnoDB使用重做日志(Redo Log)来保证事务的持久性,即使在事务提交后遇到系统崩溃,也能从日志中恢复数据。事务中的所有操作要么全部完成,要么全部不执行。如果事务中的任何一步失败,整个事务都会被回滚,以保持数据的完整性。通过事务的ACID属性整体保障,特别是在事务结束时通过提交或回滚操作来维护数据的一致状态。多个事务并发执行时,每个事务之间的操作互不影响,这通过不同的隔离级别来实现。

2024-07-06 20:46:12 453 1

原创 【MYSQL】InnoDB引擎为什么选可重复读作为默认隔离级别

一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQL Server等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为InnoDB引擎选可重复读作为默认隔离级别主要是解决主从同步不一致的问题。

2024-07-06 20:22:45 1244

原创 【MYSQL】事务隔离级别以及InnerDB底层实现(MVCC)

允许事务读取其他事务未提交的数据,可能会导致脏读。

2024-07-06 20:03:45 1454

原创 【MYSQL】一颗B+树可以保存多少条数据

所以说,如果能熟悉最小单元,就意味着我们抓住了事物的本事,再复杂的问题也会迎刃而解。mysql 的最小存储单元叫做“页”,这么多的页是如何构建一个庞大的数据组织,我们又如何知道数据存储在哪一个页中?如:上图中 page number=3的页,该页存放键值和指向数据页的指针,这样的页由N个键值+指针组成。查询数据库时,不论读一行,还是读多行,都是将这些行所在的整页数据加载,然后在内存中匹配过滤出最终结果。如果逐条遍历,性能肯定很差。3、InnoDB存储引擎,有自己的最小单元,称之为页,一个页的大小是16K。

2024-05-13 22:37:04 566 1

原创 【联合索引】最左匹配原则是什么?

联合索引(Composite Index)是一种索引类型,它由多个列组成。MySQL的联合索引(也称为复合索引)是建立在多个字段上的索引。这种索引类型允许数据库在查询时同时考虑多个列的值,从而提高查询效率和性能。联合索引:也称复合索引,就是建立在多个字段上的索引。联合索引的数据结构依然是 B+ Tree。

2024-05-13 22:09:07 1746

原创 【索引】索引基础

MySQL可以通过CREATE、ALTER、DDL三种方式创建一个索引。在关系型数据库中,索引是一种用来帮助快速检索目标数据的存储结构。1、使用CREATE语句创建。2、使用ALTER语句创建。3、建表时DDL语句中创建。

2024-05-13 21:40:24 245

原创 【Spring】Spring框架为何要使用三级缓存(循环依赖)

如果 B 的 Bean 不存在,则需要创建 B 的 Bean,而创建 B 的 Bean 的过程和 A 一样,也是先创建一个 B 的原始对象,然后把 B 的原始对象提早暴露出来放入缓存中,然后在对 B 的原始对象进行依赖注入 A,此时能从缓存中拿到 A 的原始对象(虽然是 A 的原始对象,还不是最终的 Bean),B 的原始对象依赖注入完了之后,B 的生命周期结束,那么 A 的生命周期也能结束。正常的代理的对象初始化后期调用生成的,是基于后置处理器的,若提早的代理就违背了Bean定义的生命周期。

2024-04-20 15:21:43 1635

原创 【Spring】Spring 谈谈你对AOP的理解

属于运行时增强,AOP框架不会修改字节码,在每次运行时都会在内存中临时为方法生成一个代理对象,这个对象包含了目标对象的所有方法,并且在特定的切点做了增强处理,并回调原有对象的方法。属于编译时增强,它会在编译阶段就产生AOP的代理类,并将切面织入到字节码中,运行时的时候就是增强之后的AOP对象,性能比Spring AOP好。CGLIB:代理类没有实现接口,在运行时动态生成一个代理对象的子类对象,并覆盖其中特定的方法并增加增强代码,从而实现AOP。AOP的实现是基于代理模式的,主要分为静态代理和动态代理。

2024-04-20 14:56:55 400

原创 【MYSQL】索引优化思考题

假设有一张订单表 order,主要包含了主键订单编码 order_no、订单状态 status、提交时间 create_time 等列,并且创建了 status 列索引和 create_time 列索引。使用查询字段和排序字段建立联合索引,可以避免文件排序的发生。因为查询时我们只能用到status索引,如果要对create_time进行排序,则需要使用文件排序filesort。filesort是通过相应的排序算法将取得的数据在内存中进行排序,如果内存不够则会使用磁盘文件作为辅助。

2024-04-15 13:28:33 368

原创 【JVM】GCRoot

当调用 Java 方法时,虚拟机会创建一个栈桢并压入 Java 栈,而当它调用的是本地方法时,虚拟机会保持 Java 栈不变,不会在 Java 栈祯中压入新的祯,虚拟机只是简单地动态连接并直接调用指定的本地方法。如下代码所示,当 java 调用以上本地方法时,jc 会被本地方法栈压入栈中, jc 就是我们说的本地方法栈中 JNI的对象引用,因此只会在此本地方法执行完成后才会被释放。如下代码所示,我们给 s 赋值了变量的引用,s 在此时是类静态属性引用,充当了 GC Root 的作用,它指向的对象存活。

2024-03-16 23:04:33 898 1

原创 【MySQL】Mysql 索引失效的场景

联合索引不满足最左匹配索引列参与计算Like 查询使用了%开头类型隐式转换,如varchar 类型的字段用了查找时用了int ,解决方案就是加上双引号Where 查询中条件有or ,除非所有查询条件都有索引,否则索引失效Is not null 不走索引,查询条件is null时可以走索引,Mysql优化器的其他优化策略,比如优化器认为在某些情况下,全表扫描比走索引快,则它就会放弃索引。

2024-03-12 22:24:45 368

原创 【线上问题】一次消息积压处理的线上应急

记一次线上消息投递错误暴增的异常排查。

2024-02-25 21:16:40 366

原创 【JVM】线上一次fullGC排查思路

再仔细观察堆内内存使用情况发现发生fullgc后,老年代该对象就可以正常回收,说明该对象的因为过大而直接进入老年代的,本来如果是小对象就会直接被YGC回收的。这是因为我们当时配置了自动dump的参数,每次fullgc后都会去dump日志,并且dump的日志太大,占用了很大的磁盘空间,导致线上一直在告警。(4)、分配担保: 就是在年轻代的两个区都放不下的时候,就分配到老年代,如果老年代也放不下了,那么就会进行fullGC。(1)、大对象优先分配老年代。(3)、老对象也会放到老年代。

2024-02-25 20:59:48 687

原创 【MYSQL】存储引擎MyISAM和InnoDB

在实现上面两个功能的同时,需要考虑客观条件的限制,因为机器的内存大小是有限的,所以MySQL的InnoDB Buffer Pool的大小同样是有限的,如果需要缓存的页占用的内存大小超过了Buffer Pool大小,也就是Free链表中已经没有多余的空闲缓存页的时候岂不是很尴尬,发生了这样的事儿该咋办?所以,我们不得不再创建一个存储脏页的链表,凡是在LRU链表中被修改过的页都需要加入这个链表中,因为这个链表中的页都是需要被刷新到磁盘上的,所以也叫FLUSH链表,有时候也会被简写为FLU链表。

2024-01-17 22:01:10 1019

原创 【MYSQL】事务隔离级别

一个事务正在对一条记录做修改,在这个事务完成并提交前,另一个事务也来读取同一条记录,读取了这些未提交的“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。例子:事务A根据时间20231212条件筛选查询数据有3条,事务B插入了时间为20231212的一条数据,事务A再次查询发现数据变为了4条,仿佛出现幻读。一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”(Phantom Reads)。

2024-01-17 21:39:52 522

原创 【数据库】间隙锁Gap Lock

间隙锁(Gap Lock):间隙锁是(RR级别下)一个在索引记录之间的间隙上的锁,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。间隙锁(Gap Lock)是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制当我们用范围条件而不是相等条件索引数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”。

2024-01-14 21:22:42 1357

原创 【JVM】内存结构

程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为 Undefined。

2024-01-11 14:38:36 2362

原创 【JVM】垃圾回收算法

标记-清除算法将垃圾回收分为两个阶段,标记阶段和清除阶段在标记阶段首先通过GC Roots,标记所有从根节点开始的对象,未被标记的对象就是未引用的垃圾对象。然后,在清除阶段,清除未被标记的对象。1、存活对象较多的情况下比较高效2、使用于老年代1、容易产生内存碎片,再来一个较大对象时。会提前触发消息回收(即,对象的大小大于空闲中的每一块大小,但是小于其中两块的和)2、扫描了整个空间两次。第一次:标记存活对象,第二次:清除没有标记的对象。

2024-01-11 14:16:32 532

原创 【JVM】对象已死吗?

而线程共享区(堆和方法区)则不一样,一个方法中的多个分支需要的内存可能不一样,只有在程序处于运行期间时才能知道会创建哪些对象,这部分的内存的分配和回收都是动态的,垃圾收集器(GC)所关注的也是这部分内存,今天要介绍的内容也是围绕着这部分内存来说的。JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference),引用强度依次减弱。

2024-01-09 21:18:43 919

原创 【分布式】分布式链路跟踪技术

对于上面的情况,我们迫切需要一些新工具,帮我们精准分析性能问题。于是,分布式系统下链路追踪技术(Distributed Tracing)出现了。它的核心思想是:在用户一次请求服务的调⽤过程中,无论请求被分发到多少个子系统中,子系统又调用了更多的子系统,我们把系统信息和系统间调用关系都追踪记录下来。最终把数据集中起来可视化展示。它会形成一个有向图的链路,看起来像下面这样。

2024-01-07 23:10:41 2316

原创 【事务】事务传播级别

若当前存在事务,则新建一个事务,新老事务相互独立。PROPAGATION_REQUIRED:默认的Spring事物传播级别,若当前存在事务,则加入该事务,若不存在事务,则新建一个事务。PROPAGATION_NOT_SUPPORTED:以非事务的方式执行,若当前存在事务,则把当前事务挂起。PROPAGATION_SUPPORTS:支持当前事务,若当前不存在事务,以非事务的方式执行。PROPAGATION_NEVER:以非事务的方式执行,如果当前存在事务,则抛出异常。

2024-01-07 22:16:05 395

原创 【数据库】SQL执行顺序

HAVING 中可以是普通条件的筛选,也能是聚合函数,HAVING 语句在SQL中的主要作用与WHERE语句作用是相同的,但是HAVING是过滤聚合值,在 SQL 中增加 HAVING 子句原因就是,WHERE 关键字无法与聚合函数一起使用,HAVING子句主要和GROUP BY子句配合使用。对虚拟表VT1 应用ON筛选器,ON 中的逻辑表达式将应用到虚拟表 VT1中的各个行,筛选出满足ON 逻辑表达式的行,生成虚拟表 VT2。根据指定的条件对数据进行筛选,并把满足的数据插入虚拟表VT6。

2024-01-02 22:21:49 516

原创 【多线程】voliate如何禁止指令重排

java语言规范规定JVM线程内部维持顺序化语义。即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。指令重排是处理器为提高运算速度而做出违背代码原有顺序的优化。指令重排可以保证串行语义一致,否则我们的应用程序根本无法正常工作,但是没有义务保证多线程间的语义也一致。

2023-12-31 22:42:39 2522

原创 【数据结构】B树和B+树

根据上文,非叶子节点保存的是索引值和指针,假设索引 id 是 long类型,占 8个byte,指针占 6 byte,所以,根节点可以存放 16KB / (8 + 6) = 1170 个索引值,因此就有1170个指针,假设一条数据的大小是1K,因此叶子节点可以存放 16Kb/1K = 16条数据,所以3层的B+树可以存放 1170 * 1170 * 16 = 21902400行记录,所以,一个三层的 B+树可以存放 2000万左右的数据。B+树的叶子节点形成了一个有序链表,使得范围查询更加容易实现。

2023-12-29 21:37:12 883

原创 【redis】redis缓存问题 - 缓存雪崩、击穿、穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。所谓穿透,就是直接透过了redis,直接透到数据库比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

2023-12-27 22:55:09 330

原创 【MYSQL】事务四大特性ACID

一致性与业务有关,因此,对一致性的理解需要依赖特定的业务逻辑。例如,在关系数据库中,一旦事务提交,其对数据的修改就会被永久地保存在数据库中。即使系统出现故障,数据库也可以通过日志进行恢复,确保数据的完整性和一致性。原子性确保事务内的操作要么全做,要么全不做,是一个不可分割的工作单位。隔离性是指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。如果没有隔离性,多个事务同时对同一数据进行操作,可能会导致数据不一致的问题,如脏读、不可重复读和幻读等。

2023-12-25 23:09:27 361

原创 【线程池】深入理解线程池

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。其技术的核心思想其实就是实现资源的一个复用,避免资源的重复创建和销毁带来的性能开销。在线程池中,线程池可以管理一堆线程,让线程执行完任务之后不会进行销毁,而是继续去处理其它线程已经提交的任务。

2023-12-25 22:47:23 1248

原创 【MYSQL】索引覆盖&索引下推

每天学习一个小知识。

2023-12-24 21:26:49 1117 2

原创 【JVM】双亲委派机制

双亲委派机制(Parent Delegation Mechanism)是Java中的一种类加载机制。在Java中,类加载器负责加载类的字节码并创建对应的Class对象。双亲委派机制是指当一个类加载器收到类加载请求时,它会先将该请求委派给它的父类加载器去尝试加载。只有当父类加载器无法加载该类时,子类加载器才会尝试加载。

2023-12-23 15:34:59 843

空空如也

空空如也

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

TA关注的人

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