自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Seata的两种模式

这里我们以XA模式和AT模式来给大家讲解其实现原理。XA规范 是X/Open组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

2024-11-05 20:15:50 640

转载 Redis事务

Redis 事务在运行错误的情况下,除了执行过程中出现错误的命令外,其他命令都能正常执行。并且,出错之前执行的命令是无法被撤销的,无法实现类似关系型数据库执行失败可以回滚的那种原子性效果。一段 Lua 脚本可以视作一条命令执行,一段 Lua 脚本执行过程中不会有其他脚本或 Redis 命令同时执行,保证了操作不会被其他指令插入或打扰。Redis 事务实际开发中使用的非常少,功能比较鸡肋,不要将其和我们平时理解的关系型数据库的事务混淆了。Redis 的事务和我们平时理解的关系型数据库的事务不同。

2024-10-30 22:28:42 16

原创 ConcurrentSkipListSet和ConcurrentSkipListMap分析以及总结Set

跳表是一种概率型数据结构,由多个层级的链表组成,每个元素在不同的层中出现的概率是固定的。这种结构使得在平均情况下,插入、删除和查找操作的时间复杂度为 (O(\log n))。

2024-10-30 22:07:38 858

原创 Redis为什么用跳表实现有序集合

有几个原因:1、它们不是很占用内存。这主要取决于你。改变节点拥有给定层数的概率的参数,会使它们比 B 树更节省内存。2、有序集合经常是许多 ZRANGE 或 ZREVRANGE 操作的目标,也就是说,以链表的方式遍历跳表。通过这种操作,跳表的缓存局部性至少和其他类型的平衡树一样好。3、它们更容易实现、调试等等。例如,由于跳表的简单性,我收到了一个补丁(已经在 Redis 主分支中),用增强的跳表实现了O(log(N))的 ZRANK。它只需要对代码做很少的修改。

2024-10-30 20:57:50 1180

原创 Redis中String 的底层实现是什么?

为了避免修改(增加/减少)字符串时,每次都需要重新分配内存(C 语言的字符串是这样的),SDS 实现了空间预分配和惰性空间释放两种优化策略。当 SDS 需要增加字符串时,Redis 会为 SDS 分配好内存,并且根据特定的算法分配多余的内存,这样可以减少连续执行字符串增长操作所需的内存重分配次数。通过源码可以看出,SDS 共有五种实现方式 SDS_TYPE_5(并未用到)、SDS_TYPE_8、SDS_TYPE_16、SDS_TYPE_32、SDS_TYPE_64,其中只有后四种实际用到。

2024-10-29 22:38:45 775

原创 3种常用的缓存读写策略详解

在 Cache-Aside Pattern 下,发生读请求的时候,如果 cache 中不存在对应的数据,是由客户端自己负责把数据写入 cache,而 Read Through Pattern 则是 cache 服务自己来写入缓存的,这对客户端是透明的。举例:请求 1 先读数据 A,请求 2 随后写数据 A,并且数据 A 在请求 1 请求之前不在缓存中的话,也有可能产生数据不一致性的问题。举例:请求 1 先写数据 A,请求 2 随后读数据 A 的话,就很有可能产生数据不一致性的问题。

2024-10-29 22:11:17 535

原创 JVM内存区域以及垃圾收集

深入理解Java虚拟机》中的叫法为:标记复制,标记清除,标记整理内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记压缩算法>标记清除算法 内存利用率:标记压缩算法=标记清除算法>复制算法思考一个问题:难道没有最优算法吗?答案:没有,没有最好的算法,只有最合适的算法——》GC:分代收集算法年轻代:存活率低复制算法老年代:区域大:存活率高标记清除(内存碎片不是太多)+标记压缩混合实现。

2024-10-28 20:25:26 818

原创 布隆(Bloom Filter)过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

2024-10-26 22:20:32 789

转载 缓存穿透、缓存击穿,缓存雪崩

缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。缓存穿透举个例子:某个黑客故意制造一些非法的 key 发起大量请求,导致大量请求落到数据库,结果数据库上也没有查到对应的数据。也就是说这些请求最终都落到了数据库上,对数据库造成了巨大的压力。缓存击穿中,请求的 key 对应的是热点数据,该数据。

2024-10-26 21:47:08 894

原创 MySQL三大日志(binlog、redo log和undo log)详解

使用。

2024-10-26 19:57:13 1021

原创 MySQL 性能怎么优化?

在面试中,建议按优先级依次介绍慢 SQL 定位、索引优化、表结构设计和 SQL 优化等内容。架构层面的优化,如读写分离和分库分表、数据冷热分离 应作为最后的手段,除非在特定场景下有明显的性能瓶颈,否则不应轻易使用,因其引入的复杂性会带来额外的维护成本。

2024-10-26 16:41:30 1016

原创 当前读和快照读有什么区别?

快照读的情况下,如果读取的记录正在执行 UPDATE/DELETE 操作,读取操作不会因此去等待记录上 X 锁的释放,而是会去读取行的一个快照。在 RC 级别下,对于快照数据,一致性非锁定读总是读取被锁定行的最新一份快照数据。在 RR 级别下,对于快照数据,一致性非锁定读总是读取本事务开始时的行数据版本。快照即记录的历史版本,每行记录可能存在多个历史版本(多版本技术)。(一致性锁定读)就是给行记录加 X 锁或 S 锁。# 对读的记录加一个X锁。# 对读的记录加一个S锁。# 对读的记录加一个S锁。

2024-10-26 15:48:46 213

原创 意向锁有什么用

InnoDB 支持多粒度锁,特定场景下,行级锁可以与表级锁共存。意向锁之间互不排斥,但除了 IS 与 S 兼容外,意向锁会与 共享锁 / 排他锁 互斥。IX,IS是表级锁,不会和行级的X,S锁发生冲突。只会和表级的X,S发生冲突。意向锁在保证并发性的前提下,实现了行锁和表锁共存且满足事务隔离性的要求。详解 MySql InnoDB 中意向锁的作用 - 知乎。

2024-10-26 15:33:55 322

原创 聚簇索引与非聚簇索引

聚簇索引(Clustered Index)即索引结构和数据一起存放的索引,并不是一种单独的索引类型。InnoDB 中的主键索引就属于聚簇索引。在 MySQL 中,InnoDB 引擎的表的.ibd文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。非聚簇索引(Non-Clustered Index)即索引结构和数据分开存放的索引,并不是一种单独的索引类型。二级索引(辅助索引)就属于非聚簇索引。

2024-10-26 10:05:29 246

原创 联合索引详解

使用表中的多个字段创建索引,就是,也叫或。最左前缀匹配原则指的是在使用联合索引时,MySQL 会根据索引中的字段顺序,从左到右依次匹配查询条件中的字段。如果查询条件与索引中的最左侧字段相匹配,那么 MySQL 就会使用索引来过滤数据,这样可以提高查询效率。最左匹配原则会一直向右匹配,直到遇到范围查询(如 >、

2024-10-26 09:55:14 391

原创 CopyOnWriteArrayList和 CopyOnWriteArraySet 怎么实现线程安全

线程安全机制:这两个集合类通过在写操作时复制底层数组来实现线程安全,从而避免了在读操作中需要加锁,确保了高效的并发访问。适用场景:适合读多写少的场景。如果写操作频繁,可能会导致性能下降,因为每次写操作都需要复制整个数组。

2024-10-24 21:31:37 271

转载 Java常见的线程安全的类

线程安全:就是当多线程访问时,采用了加锁的机制;Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。在这种机制中,任意数量的读取线程可以并发访问Map,执行读取操作的线程和执行写入操作的线程可以并发地访问Map,并且一定数量的写入线程可以并发地修改Map,这使得在并发环境下吞吐量更高,而在单线程环境中只损失非常小的性能。

2024-10-24 21:27:56 15

原创 怎么重写equals()方法和hashCode()方法

equals()

2024-10-24 21:13:33 895

原创 认识B树以及B+树

MySQL的数据是存储在磁盘文件中的,查询处理数据时,需要先把磁盘中的数据加载到内存中,磁盘IO操作非常耗时,需要我们去减少IO操作,那么就需要就减少树的高度 B树是一种多叉平衡查找树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;1.定义任意非叶子结点最多只有M个儿子;且M>2;2.根结点的儿子数为[2, M];3.除根结点以外的非叶子结点的儿子数为[M/2, M];

2024-10-23 22:33:36 686

原创 MyISAM 和 InnoDB 有什么区别?

InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。MyISAM 不支持外键,而 InnoDB 支持。MyISAM 不支持 MVCC,而 InnoDB 支持。虽然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。

2024-10-23 21:49:32 668

原创 事务隔离和用MVCC解决不可重复读原理

原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。update account set money = money-100 where name = '张三';update account set money = money+100 where name = '李四';官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

2024-10-22 23:26:40 662

原创 Mybatis工作原理

Mybatis是一款用于持久层的、轻量级的半自动化ORM(ORM,Object Relational Mapping, 直接翻译就是对象关系映射)框架,封装了所有jdbc操作以及设置查询参数和获取结果集的操作,支持自定义sql、存储过程和高级映射。

2024-10-22 21:55:20 447

原创 Maven是什么

我们这样来理解maven项目,就是在java项目和web项目上裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能,即通过pom.xml添加jar包 就像在蜜汁鸡外面裹了一层面粉油炸一下变成了炸鸡,但是他还是一只鸡。答: Maven能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。答: Maven是跨平台的:同一套指令可以在不同的系统上运行。

2024-10-21 22:59:58 393

原创 spring 事务实现方式有哪些?

一个用户操作下包含多个数据库修改操作(增、删、改)时, 必须确保这些修改操作要么同时执行,要么同时不执行, 那么这个用户操作涉及到的代码块必须要加事务。

2024-10-21 16:09:39 760

原创 Redis之持久化机制和实现原理

每种持久化机制各有优缺点,了解每种持久化机制的原理对我们使用Redis有很大的帮助。Redis4.0后支持两种持久化机制混合使用,所以存在三种持久化策略。

2024-10-20 16:06:35 905

原创 Spring aop讲解+动态代理思想+事务注解原理

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

2024-10-20 11:36:40 572

原创 Java IO 示例

数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。因此,I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。是一个比较常用的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。是最常用的字节输出流对象,可直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组。: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

2024-10-17 21:04:07 999

原创 用@Lazy解决循环依赖问题

springboot出现循环依赖问题,尝试多个方法无法解决,最后发现@Lazy导包导错。

2024-10-14 20:51:17 127

原创 后端直接从文件URL下载文件

需要直接在后端根据文件url下载文件。

2024-10-13 20:53:34 1163

原创 为什么阿里巴巴禁止使用 Executors 创建线程池?

阿里巴巴开发手册为什么禁止使用Executors去创建线程池,原因就是和两个方法允许请求的最大队列长度是,可能会出现任务堆积,出现OOM。允许创建的线程数量为,可能会创建大量的线程,导致发生OOM。它建议使用方式去创建线程池,通过上面的分析我们也知道了其实Executors三种创建线程池的方式最终就是通过来创建的,只不过有些参数我们无法控制,如果通过的构造器去创建,我们就可以根据实际需求控制线程池需要的任何参数,避免发生OOM异常。为什么阿里巴巴禁止使用 Executors 创建线程池?-CSDN博客。

2024-10-11 11:01:25 282

原创 什么是悲观锁?什么是乐观锁?

乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。等独占锁就是悲观锁思想的实现。

2024-10-10 19:17:37 127

原创 ArrayList 和 Array(数组)的区别?以及相互转换

对于基本类型数据,需要使用其对应的包装类(如 Integer、Double 等)。只是一个固定长度的数组,只能按照下标访问其中的元素,不具备动态添加、删除元素的能力。支持插入、删除、遍历等常见操作,并且提供了丰富的 API 操作方法,比如。//其他Array转ArrayList转换方法。可以直接存储基本类型数据,也可以存储对象。会根据实际存储的元素动态地扩容或缩容,而。被创建之后就不能改变它的长度了。创建时不需要指定大小,而。//List转Array。//Array转List。创建时必须指定大小。

2024-09-27 10:47:31 269

原创 Easy Excel解析excel后全部为空的问题(附上EasyExcel使用指南博客)

将excel解析之后VO类列表全为null。

2024-09-23 15:51:40 1122

原创 ==与equals()的区别

因为 Java 只有值传递,所以,对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。其他集合类似,则一般只有自定义的类需要重写equals()方法,同时注意要同时重写hashCode()方法)(常用的引用数据类型自带重写方法比较值,如:String、Date、File、包装类等,equals()方法基本数据类型无该方法,若没有重写,则比较地址,但可重写为比较属性。比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是。

2024-09-22 17:19:27 433

原创 保证消息可靠性和数据一致性的解决方案

3.在发消息之前将消息的相关信息写入本地消息表中,这样就保证了本地数据库业务操作以及消息表的一致性。4.生产者确认机制,未成功,则报错回滚。(若为分布式项目,则定时任务轮询发送未成功消息)5.消费者成功之后更新本地消息表的内容(即使一直未成功,数据库中也有记录)。2.创建本地消息表(内含消息状态)

2024-09-20 21:56:30 267

原创 用@Lazy解决循环依赖问题

springboot出现循环依赖问题,尝试多个方法无法解决,最后发现@Lazy导包导错。

2024-09-20 21:12:28 293

原创 Docker学习笔记

Docker-03.快速入门-部署MySQL哔哩哔哩bilibili](https://www.bilibili.com/video/BV1S142197x7/?前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?镜像结构 要想自己构建镜像,必须先了解镜像的结构。之前我们说过,镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。

2024-09-20 21:10:44 1287

原创 java批量插入mysql

稍微总结下我粗略的对比(虽然粗略,但实验结果符合原理层面的理解),如果你想更准确地实验,可以使用JMH,并且测试更多组数(如 5000,10000等)的情况。

2024-09-20 21:06:57 411

原创 学习笔记 redis项目实践 黑马点评(2)

粉丝查询service的分页不能按照正常逻辑记角标查询,应该通过score分数来查询,每次查询记住上次查询的最后一个分数。| count | 前端决定,一页显示几条就是几 | 前端决定,一页显示几条就是几 || offset | 0 | 在上一次结果中,与最小值一样的元素的个数 || max | 当前时间戳 | 上一次查询的最小时间戳 |这里我的位置使用的是固定坐标,实际开发中可以从用户手机上获取。前端可能不传输地址信息,因此是个选填的参数,需要走两条线。| 参数 | 第一次请求 | 第N次请求 |

2024-04-04 22:23:12 946

原创 学习笔记 redis项目实践 黑马点评(1)

商铺查询业务分析需求:自定义一个缓存工具类,方法如下方法1:将任意java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间方法2:将任意java对象序列化为json并存储在string类型的key中,并且可以设置逻辑过期时间,用于处理缓存击穿问题方法3:根据指定的key查询缓存,并反序列化为指定类型,利用缓存空值的方式解决缓存穿透问题方法4:根据指定的key查询缓存,并反序列化为指定类型,需要利用逻辑过期解决缓存击穿问题。

2024-04-04 22:05:34 221

空空如也

空空如也

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

TA关注的人

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