自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式事务的原理

比如大型的电商系统中的下单场景,会涉及扣库存、优惠促销计算、订单 ID 生成。通常情况下,库存、 促销、主键生成策略都位于不同的服务器和数据库表中。下单接口的成功与否,不仅取决于本地节点的数据库操作,而且还依赖第三方系统的结果,这时候分布 式事务就保证这些操作要么全部成功,要么全部失败。基于 CAP 定理可以知道,对于上述情况产生的分布式事务问题,我们要么采用强一致性方案、要么采 用弱一致性方案。分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于分布式系统的 不同节点之上。

2025-03-10 20:51:11 164

原创 谈谈你对 Seata 的理解

从这四种模型中不难看出,在不同的业务场景中,我们可以使用 Seata 的不同事务模型来解决不同业 务场景中的分布式事务问题,因此我们可以认为 Seata 是一个一站式的分布式事务解决方案。3. 在分布式事务的实现上,对于强一致性,我们可以通过基于 XA 协议下的二阶段提交来实现,对于 弱一致性,可以基于 TCC 事务模型、可靠性消息模型等方案来实现。1. 在微服务架构下,由于数据库和应用服务的拆分,导致原本一个事务单元中的多个 DML 操作, 变成了跨进程或者跨数据库的多个事务单元的多个 DML 操作,

2025-03-07 20:42:34 297

原创 谈谈常用的分布式 ID 设计方案

另外,美团公司开源了一个全局唯一 id 生成系统 leaf,它里面也用到了雪花算法去构建全局唯一 id 并且在高性能和高可用方面,做了很多的优化,为美团内部业务提供了每天上亿次的调用。所以,目前市面上主流的解决方案是基于 Twitter 早期开源的 Snowflake 雪花算法(图片)。它是由 64 位长度组成的全局 id 生成算法,通过对 64 位进行区间划分来表述不同含义实现唯一性。以及 B+数据的存储结构中,范围查询的效率更高,并且可以提升 B+树数据维护的效率。

2025-03-05 20:46:36 383

原创 对服务降级的理解

因此,降级带来的结果是使得用户的体验下降,但是却保证了系统的稳定性和可用性。当触发了熔断机制以后,如果后续再向故障节点发起请求的时候,这个请求不会发送到故障节点上,而 是直接置为失败,这样就避免了请求堆积的问题。简单来说,就是当服务器压力增加的情况下,根据实际业务的需求和流量的情况,不对外提供部分服务 的功能。服务降级本身就是一种兜底的设计方案,主要是出现在分布式架构的设计场景中。服务降级有两种方式,一种是主动降级,一种是基于特定情况的被动降级。服务降级是一种提升系统稳定性和可用性的策略。

2025-03-04 20:52:29 198

原创 请说一下你对分布式和微服务的理解

分布式系统:通过多节点协作提升性能和可用性,适合大规模、高并发的场景。微服务:通过服务拆分提升灵活性和可维护性,适合复杂、快速迭代的应用。两者结合能构建出高性能、高可用且易于维护的系统。

2025-03-03 19:44:07 309

原创 关于“你对 Spring Cloud 的理解”

有了 Spring Cloud 这样的技术生态,使得我们在落地微服务架构时。Spring Cloud 是一套分布式微服务的技术解决方案,它提供了快速构建分布式系统的常用的一些组件比如说配置管理、服务的注册与发现、服务调用的负载均衡、资源隔离、熔断降级等等。Spring Cloud Netflix 是基于 Netflix 这个公司的开源组件集成的一套微服务解决方案,其中的组件有。不过 Spring Cloud 只是 Spring 官方提供的一套微服务标准定义,而真正地实现目前有两套体系用得比较多。

2025-02-27 20:27:36 178

原创 IO 和 NIO 有什么区别?

也就是说,通过 NIO 进行网络数据传输的时候,如果连接未就绪或者 IO 事件未就绪的情况下,服务端 不会阻塞当前连接,而是继续去轮询后续的连接来处理。(如图)基于 Socket 的 IO 通信,它是属于阻塞式 IO,也就是说,在连接以及 IO 事件未就绪的情况 下,当前的连接会处于阻塞等待的状态。因此,总的来说,IO 和 NIO 的区别,站在网络 IO 的视角来说,前者是阻塞 IO,后者是非阻塞 IO。以上就是我对这个问题的理解。首先,I/O ,指的是 IO 流, 它可以实现数据从磁盘中的读取以及写入。

2025-02-26 20:44:46 217

原创 什么是可重入,什么是可重入锁?它用来解决什么问题?

在多线程并发编程里面,绝大部分锁都是可重入的,比如 Synchronized、ReentrantLock 等,但是也 有不支持重入的锁,比如 JDK8 里面提供的读写锁 StampedLock。(如图) 而可重入锁,简单来说就是一个线程如果抢占到了互斥锁资源,在锁释放之前再去竞争同一 把锁的时候,不需要等待,只需要记录重入次数。简单来说,就是在运行的某个函数或者代码,因为抢占资源或者中断等原因导致函数或者代码的运行中断,锁的可重入性,主要解决的问题是避免线程死锁的问题。自己释放锁,这很显然是无法成立的。

2025-02-25 20:53:52 168

原创 Mysql 主从集群同步延迟问题怎么解决

实际上,主动复制的场景无法避免同步延迟的问题,如果一定要用强一致方案,那就应该考虑其他能够 实现一致性场景的技术方案。主从数据同步涉及网络数据传输,由于网络通信的延迟以及从库数据处理的效率问题,就会导致主从数 据同步延迟的情况。下面我先来给大家复习一下主从复制的工作原理。一般可以通过以下几个方法来解决。

2025-02-24 20:22:14 162

原创 索引有哪些缺点以及具体有哪些索引类型

第一个,索引的优缺点。

2025-02-21 20:36:23 146

原创 Redis 存在线程安全问题吗?为什么?

(如图)虽然 Redis 6.0 里面,增加了多线程的模型,但是增加的多线程只是用来处理网络 IO 事件, 对于指令的执行过程,仍然是由主线程来处理,所以不会存在多个线程同时执行操作指令的情况。当然,对于客户端层面的线程安全性问题,解决方法有很多,比如尽可能地使用 Redis里面的原子指令,或者对多个客户端的资源访问加锁,或者通过 Lua脚本来实现多个指令的操作等等。(如图)虽然 Redis Server 中的指令执行是原子的,但是如果有多个 Redis 客户端同时执行多个指令 的时候,就无法保证原子性。

2025-02-20 20:51:34 392

原创 能回答一下 Spring Bean 生命周期的执行流程吗

Spring 生命周期全过程大致分为五个阶段:创建前准备阶段、创建实例阶段、依赖注入阶段、 容器缓存阶段和销毁实例阶段。这张是 Spring Bean 生命周期完整流程图,其中对每个阶段的具体操作做了详细介绍:(把这张图按照阶段截断,当我说第一个阶段时,就显示第一个阶段的图片,依次往后.)

2025-02-19 20:53:40 387

原创 spring如何解决循环依赖的问题

Spring设计了三级缓存来解决循环依赖问题,第一级缓存里面存储完整的Bean实例,这些实例可以直接被使用,第二级缓存里面存储的实例化以后但是还没有设置属性值的Bean实例,也就是Bean里面的依赖注入还没有做,第三季缓存是用来存放Bean工厂,他主要用来生成原始Bean对象并且放在第二缓存里面,,采用一级缓存储存完整的Bean实例,采用二级缓存来存储不完整的Bean实例,通过不完整的Bean实例为突破口解决循环依赖问题,至于第三极缓存主要是解决代理对象的循环依赖问题。解决部分循环依赖的问题。

2025-02-17 20:51:43 378

原创 UDP与TCP

UDP的价值:本质是内核提供的一个最小网络传输功能,很多时候,都号称自己用了UDP,但实际上都很忌惮他的丢包问题,所以大部分情况下都会在UDP的基础上做各种不同程度的应用层可靠性保证,某些游戏为了追求低延迟,不同程度使用了UDP,比如王者农药(KCP)当接收窗口变为0时,也就是所谓的0窗口,此时发送端停止发送数据接收方接收到数据之后会不断处理,处理能力也不是一成不变的,有时候处理的快一些就可以多收点数据,处理的慢点,就希望对方能少发点数据,像这种根据自身能力不断调整窗口的机制就是所谓的。

2025-02-17 11:21:24 890

原创 Spring Boot 的约定优于配置,你的理解是什么?

2.Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架下的一个脚手架,通过 Spring Boot,我们可以快速开发基于 Spring 生态下的应用程序。而在 Spring Boot 中,我们不需要再去做这些繁琐的配置,Spring Boot 已经自动帮我们完成了,这 就是约定于配置思想的体现。1.首先, 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维 护,从而让开发人员更加聚焦在业务逻辑上。我从 4 个方面来回答。

2025-02-14 20:24:36 259

原创 布隆过滤器

如果数据库挂掉了,导致两个小时系统不可用的一个故障,接下来来分析一下原因,当一个请求进来,大量的请求都会被Redis抗住,只有当Redis当中不存在的时候才会有极少数的请求排队的来到数据库当中进行查询,当数据库查到了之后再放到redis当中,下次呢就能保证从radis当中查询到数据,所以Redis它扛住了大量的压力,只有少量的请求才会落到数据库当中进行查询。接着继续发送请求,都是发送一些数据库中没有的信息,这样就可以击穿Redis,这样就可以直接来到数据库,数据库当中肯定也没有,这个时候就出现了所谓的。

2025-02-13 16:13:15 520

原创 jvm 篇

字节码的作用兼容多种语言jvm的基本结构‌‌‌1.:加载class文件到内存中进行使用。2‌.:这是JVM在运行Java程序期间管理的内存区域,包括方法区、Java堆(Heap)、虚拟机栈(Stack)程序计数器和本地方法栈等部分。这些区域负责不同的职能,有各自的生命周期‌。3‌.:将字节码翻译成底层系统指令并执行,处理程序中的各种运算操作‌。‌4.:用于支持JVM调用操作系统级别的本地库或其它语言的代码‌。

2025-02-06 20:13:03 1194

原创 Mybatis篇

当用户发起查询 时, MyBatis 根据当前执行的语句生成 MappedStatement,在 Local Cache 进行查询,如果 缓存命中 的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入 Local Cache,最后 返回结果给用户。在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的 SQL , MyBatis 提供了一级缓存的方案优化这部分场景,如果是相同的 SQL 语句,会优先命中一级缓 存, 避免直接对数据库进行查询,提高性能。

2025-02-06 19:56:41 1070

原创 Redis篇

如果此时客户端准备好接收返回结果了,那么Redis中Socket01会产生一个AE_WRITABLE事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对Socket01输入本次操作的一个结果,比如ok,之后解除Socket01的AE_WRITABLE事件与命令回复处理器的关联。是指用数据集快照的方式半持久化模式)记redis数据库的所有键值对,在某个时间点将数据写录入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。,所以Redis才叫做单线程的模型。

2025-02-06 19:36:22 552

原创 Spring篇

而对于没有实现接口的对象,就无法使用 JDK 动态代理,转而使 用 CGlib 动态代理生成一个被代理对象的子类来作为代理。横切 关 注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全 和数 据传输,几乎应用的每个模块都需要的功能。@Resource 和@Autowired 都是做 bean 的注入时使用,其实@Resource 并不是 Spring 的注解, 它的 包是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。

2025-02-03 19:25:07 667

原创 Spring Boot篇

为什么要用Spring BootSpring Boot的核心注解是哪个?它主要由哪几个注解组成 的?启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含 了 以下 3 个注解:@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

2025-02-01 19:34:17 1373

原创 Mysql锁机制

‌:全局锁是一种锁定机制,可以锁定整个数据库或特定的资源。‌:表锁是针对整张表进行的锁定,通常用于对表进行DDL操作或备份等需要操作整张表的情况。‌:插入意向锁用于避免多个事务在相同范围内插入相同数据时的冲突,通过锁定表示即将插入记录的范围来避免重复插入。‌:隐式锁是MySQL数据库在执行某些操作时自动为数据添加的锁,确保并发操作的一致性和正确性。‌:Next Key锁是间隙锁和记录锁的结合,锁定一个范围并包括范围内的具体的记录。意向锁的使用可以提高行锁的效率,减少遍历整个表的时间。

2025-01-06 10:26:15 401

原创 MySQL事务隔离级别详解

全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。并不会有任何性能损失。

2024-12-10 19:50:07 790

原创 Mysql基础

这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。这时另外一个事务读取了这个还未提交的数据,但第一个事务突然回滚,导致数据并没有被提交到数据库,那第二个事务读取到的就是脏数据,这也就是脏读的由来。在很多我们已知场景中,InnoDB 的速度都可以让 MyISAM 望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。

2024-12-02 19:31:38 1120

原创 MySQL执行计划分析

的结果,可以了解到如数据表的查询顺序、数据查询操作的操作类型、哪些索引可以被命中、哪些索引实际会命中、每个数据表有多少行记录被查询等信息。id 不同,id 值越大,执行优先级越高,如果行引用其他行的并集结果,则该值可以为 NULL。这列包含了 MySQL 解析查询的额外信息,通过这些信息,可以更准确的理解 MySQL 到底是如何执行查询的。语句并不会真的去执行相关的语句,而是通过查询优化器对语句进行分析,找出最优的查询方案,并显示对应的信息。查询执行的类型,描述了查询是如何执行的。

2024-11-28 20:02:25 520

原创 Redis常见面试题总结(上)

与传统数据库不同的是,Redis 的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度非常快,被广泛应用于分布式缓存方向。一般像 MySQL 这类的数据库的 QPS 大概都在 4k 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 5w+,甚至能达到 10w+(就单机 Redis 的情况,Redis 集群的话会更高)。不过,从 Tendis 这个项目的 Github 提交记录可以看出,Tendis 开源版几乎已经没有被维护更新了,加上其关注度并不高,使用的公司也比较少。

2024-11-22 19:56:31 1141

原创 SQL语法基础知识总结

DDL 的核心指令是。

2024-11-14 19:49:09 837

原创 数据库基础知识

比如在关系 R(学号 , 姓名, 系名,系主任)中,学号 → 系名,系名 → 系主任,所以存在非主属性系主任对于学号的传递函数依赖,所以该表的设计,不符合 3NF 的要求。优点是运行模块化的设计,就是只需要创建一次,以后在该程序中就可以调用多次,如果某次操作需要执行多次SQL语句,使用存储过程要比单纯的SQL语句执行起来要快、可以用一个命令对象来调用存储过程。所以说,不要一股脑的就抛弃了外键这个概念,既然它存在就有它存在的道理,如果系统不涉及分库分表,并发量不是很高的情况还是可以考虑使用外键的。

2024-11-06 19:54:05 4790 2

原创 Java IO 基础知识

数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。是一个比较常用的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。是最常用的字节输出流对象,可直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组。用于读取指定类型数据,不能单独使用,必须结合其它流,比如。用于写入指定类型数据,不能单独使用,必须结合其它流,比如。

2024-10-30 19:39:13 484

原创 AOP详解

AOP 的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP 的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化(也能实现代码的复用),提高代码的可读性和可维护性。以日志记录为例进行介绍,假如我们需要对某些方法进行统一格式的日志记录,没有使用 AOP 技术之前,我们需要挨个写日志记录的逻辑代码,全是重复的的逻辑。

2024-10-25 19:04:15 1328

原创 Shiro 授权(Authorization)

术语简介术语简介。

2024-10-23 09:59:46 565

原创 IoC详解

AOP 的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP 的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化(也能实现代码的复用),提高代码的可读性和可维护性。以日志记录为例进行介绍,假如我们需要对某些方法进行统一格式的日志记录,没有使用 AOP 技术之前,我们需要挨个写日志记录的逻辑代码,全是重复的的逻辑。

2024-10-22 19:53:14 1096

原创 RBAC 模型

RBAC1,基于RBAC0的优化,增加了角色的分层(即:子角色),子角色可以继承父角色的所有权限;角色继承的RBAC模型的思路是上层角色继承下层角色的所有权限,并且可以额外拥有其他权限。简单地说:一个用户可以拥有若干角色,每一个角色又可以被分配若干权限,这样就构造成“用户-角色-权限” 的授权模型。角色互斥,一个用户能拥有角色A,就不能拥有角色B,角色A和角色B是互斥的。在 RBAC 权限模型中,权限与角色相关联,用户通过成为包含特定角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。

2024-10-21 16:04:29 1275

原创 CAS 详解

如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回 A,那 CAS 操作就会误认为它从来没有被修改过。方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。的值,如果更新失败(当前值在此期间被其他线程修改),它会重新获取当前值并再次尝试更新,直到操作成功。

2024-10-18 16:49:53 1011 2

原创 乐观锁和悲观锁详解

乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。

2024-10-17 19:25:01 735

原创 Java并发

变量的那段代码用到了 Java8 的知识,它等于下面这段代码,如果你写了下面这段代码的话,IDEA 会提示你转换为 Java8 的格式(IDEA 真的不错!顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。和其他的几个策略不同,它既不会抛弃任务,也不会抛出异常,而是将任务回退给调用者,使用调用者的线程来执行任务。的任务是个非常耗时的任务,且处理提交任务的线程是主线程,可能会导致主线程阻塞,影响程序的正常运行。

2024-10-16 19:35:30 821

原创 Java集合

相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。默认是按 key 的升序排序,不过我们也可以指定排序的比较器。

2024-10-15 19:05:51 623

原创 Shiro认证(Authentication)

对于任意一个应用程序,Shiro 都可以提供全面的安全管理服务,对比 Spring Security,可能没有 Spring Security 功能强大,但是我们在实际工作中可能并不需要那么复杂的功能,所以使用简单易用的 Shiro 就已经足够了,本教程也只介绍基本的 Shiro 使用,不会过分分析源码等,重在使用。接下来我们分别从外部和内部来看看 Shiro 的架构,对于一个好的框架,从外部来看应该具有非常简单易于使用的 API ,且 API 契约明确;2.配置Shiro相关对象,具体如下;

2024-10-15 17:20:21 502

原创 Java基础(3)

当 try 语句和 finally 语句中都有 return 语句时,try 语句块中的 return 语句会被忽略。这是因为 try 语句中的 return 返回值会先被暂存在一个本地变量中,当执行到 finally 语句中的 return 之后,这个本地变量的值就变为了 finally 语句中的 return 返回值。,Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被。常见的受检查异常有:IO 相关的异常、

2024-10-14 18:42:03 988

原创 SpringBoot集成Redis

Redis 数据类型不仅与关系数据库管理系统不同,也不同于任何简单的NoSQL键值数据储存。在这些页面中,可以选择最新的稳定版本,并下载.zip压缩包或.msi安装包。其中,.msi安装包提供了图形界面的安装向导,而.zip压缩包则需要手动解压并配置。由于Redis的官方版本并不直接支持Windows,因此需要前往GitHub等开源社区寻找适用于Windows的版本。其他数据类型的操作我们在后续的SpringBoot操作Redis中演示。Windows 安装。

2024-10-11 20:20:49 669

空空如也

空空如也

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

TA关注的人

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