- 博客(139)
- 收藏
- 关注
原创 分布式事务的原理
分布式事务本质是在一致性、可用性、性能之间进行权衡,没有银弹方案。业务特性(是否允许最终一致)系统规模(服务数量、并发量)团队技术栈(框架学习成本)建议优先考虑 Seata AT 模式,通过无侵入方式解决 80% 的分布式事务问题,复杂场景再结合 TCC 或 Saga 模式。
2025-03-10 20:53:14
677
原创 谈谈你对Seata的理解
Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,旨在解决微服务架构下跨服务调用的事务一致性问题。随着企业级应用逐渐向微服务架构迁移,传统的单体式事务管理方式已无法满足需求。Seata提供了AT(Automatic Transaction)、TCC(Try-Confirm-Cancel)、Saga和XA等多种事务模式,以适应不同的业务场景。
2025-03-09 15:41:04
411
原创 谈谈你对Seata的理解
Seata 作为一款强大的分布式事务解决方案,为开发者们提供了便捷的方式来处理分布式环境下的事务管理。通过深入理解 Seata 的核心概念、组件和事务模式,开发者可以更好地利用 Seata 来构建高性能、高可用的分布式系统。在未来,随着分布式技术的不断发展,Seata 有望在更多的场景中发挥重要作用,为分布式系统的数据一致性提供坚实的保障。
2025-03-07 21:34:35
767
原创 常见的限流算法有哪些?
选择合适的限流算法取决于具体的应用场景和需求。在实际应用中,通常需要结合多种策略来达到最佳效果。例如,可以使用令牌桶算法来应对日常流量,同时结合计数器算法来保护系统免受突发流量的影响。
2025-03-06 21:01:59
283
原创 常用的分布式ID设计方案
UUID是一种标准的128位长的ID格式,它可以通过软件算法自动生成。然而,UUID的长度较长,存储和索引效率较低,而且它的随机性可能导致排序上的不便。在分布式系统中,生成全局唯一的ID是一个常见的需求。无论是数据库表中的主键,还是消息队列的消息ID,都需要一个高效且可靠的唯一标识符。Snowflake是由Twitter开源的一种分布式ID生成算法,它可以每秒产生约400万个ID。该算法产生的ID是一个64位的整数,其中包含时间戳、数据中心ID、机器ID以及序列号等信息。随机生成的ID不利于排序。
2025-03-05 20:56:17
447
原创 请你说一下你对服务降级的理解
然而,在高并发场景下,系统可能会面临性能瓶颈或资源不足的问题。服务降级是指在系统负载过高或资源不足的情况下,临时关闭非核心功能或降低某些功能的服务质量,从而保证核心业务的正常运行。例如,在电商平台的大促活动中,如果支付接口出现延迟,可以暂时关闭商品推荐功能,确保用户能够顺利完成支付操作。服务降级是分布式系统中一项重要的容错机制,能够在资源有限的情况下保障系统的稳定性和用户体验。定义:服务降级是指在系统负载过高或资源不足的情况下,临时关闭非核心功能或降低某些功能的服务质量,以确保核心业务的正常运行。
2025-03-04 20:57:30
370
原创 nacos是什么?
在数据同步方面,它的配置中心使用 Raft 协议保证一致性,而服务注册采用自研的 Distro 协议优先保证可用性。例如,当微服务实例启动时会向 Nacos 注册,集群通过 Distro 协议快速同步节点信息,即使部分节点宕机,仍能正常提供服务发现功能。Nacos 是阿里巴巴开源的一款用于动态服务发现、配置管理和服务管理的平台,常用于微服务架构中。:如与 Eureka(AP,仅服务发现)、ZooKeeper(CP,复杂)的对比。:存储在内存中,保证高性能,重启后数据丢失(需重新注册)。
2025-03-03 20:41:51
322
原创 Eureka Server 数据同步原理解析
服务注册:当某个服务实例向Eureka Server注册时,该Server会将注册信息写入本地缓存,并通过HTTP请求将变更同步到其他Eureka Server。如果Eureka Server在一定时间内未收到某个服务实例的心跳信号,则会将其标记为下线,并将该状态同步到其他Eureka Server。服务下线:当某个服务实例停止运行时,Eureka Server会在本地标记其为下线状态,并通知其他Eureka Server。每个Eureka Server维护了一个时间戳,记录上次同步的时间点。
2025-03-02 16:10:42
594
原创 nacos数据同步原理
作为微服务架构中的重要组件,Nacos 提供了高效的服务注册与发现机制,同时支持分布式系统中配置的动态更新和同步。Nacos 的数据同步机制结合了 Leader-Follower 模型、长轮询机制和异步通知等多种技术手段,能够在分布式环境中高效地实现服务注册与配置管理的数据一致性。服务注册与发现的数据同步:服务实例的状态信息(如地址、健康状态等)需要在多个 Nacos Server 节点之间保持一致。配置管理的数据同步:当用户通过 Nacos 更新配置时,新的配置需要被同步到所有订阅该配置的客户端。
2025-02-28 20:59:20
396
原创 关于“你对 Spring Cloud 的理解”
本文深入探讨 Spring Cloud 在微服务架构中的核心价值,分析其核心组件与设计理念,并结合实际场景解读其如何简化分布式系统开发。适合具备 Spring Boot 基础、希望系统理解微服务落地方案的开发者阅读。
2025-02-27 20:56:56
667
原创 什么是可重入,什么是可重入锁? 它用来解决什么问题?
从早期的经典 I/O 到后来引入的 NIO(New Input/Output),Java 提供了多种方式来处理文件、网络等数据流。假设我们使用的是非可重入锁(如早期的 synchronized 键),当 outerMethod 获取锁后,innerMethod 再次尝试获取锁时会导致死锁,因为锁已经被当前线程持有。Java 的经典 I/O 模型(也称为阻塞 I/O)是基于流(Stream)的。可重入锁主要用于解决多线程环境下的资源竞争问题,同时避免因锁的不可重入性导致的死锁问题。
2025-02-26 20:55:53
587
原创 可重入与可重入锁:从概念到实战的保姆级教程
可重入锁(Reentrant Lock)是一种支持同一线程多次获取的同步机制,通过内部计数器实现重入管理。Java的和关键字都是典型实现。线程绑定机制:明确锁的所有权归属重入计数器:实现多次获取的关键有序释放:确保状态一致性随着并发编程复杂度提升,建议进一步研究:无锁编程(Lock-Free)技术Actor模型并发方案分布式锁的实现原理掌握可重入锁的精髓,您已经迈出了成为并发编程专家的关键一步!在实际开发中,建议结合具体场景选择合适的同步机制,既要保证线程安全,也要追求系统性能的最优平衡。
2025-02-25 20:52:15
362
原创 Mysql 主从集群同步延迟问题怎么解决
- 更新100万条数据。slave_parallel_type = LOGICAL_CLOCK # 按事务分组并行。delay = get_slave_delay() # 获取从库延迟。-- 结果中的Seconds_Behind_Master: 5 表示延迟5秒。slave_parallel_workers = 4 # 启动4个工作线程。Seconds_Behind_Master: 120 -- 延迟2分钟。分店把收到的快递单贴在分店的记事本上(relay log)---> 从库2(上海分店)
2025-02-24 20:59:32
758
原创 索引与Redis 知识点
Redis 是一种高性能的内存键值数据库,广泛应用于缓存、消息队列等多种场景。在高并发和分布式环境下,程序的线程安全问题尤为关键。许多开发者都会问:Redis 是否存在线程安全问题?本文将从Redis的设计理念、单线程模型及其在并发环境下的表现等方面深入探讨这一问题,并提供解决方案。在计算机科学中,线程安全是指当多个线程访问共享资源时,程序能够正常工作,不会因为数据竞争或资源冲突导致异常或不一致的结果。如果没有适当的同步机制,可能会引发诸如竞态条件、死锁等问题。
2025-02-22 17:23:02
948
原创 Redis 存在线程安全问题吗?为什么?
Redis本身是,但在某些场景下可能会出现线程安全问题,这主要取决于客户端如何使用Redis。Redis的核心设计是单线程的,所有的命令都是按顺序串行执行的。这种设计避免了多线程并发带来的复杂性,因此在服务端层面,Redis是线程安全的。同理,Redis就像这个厨师,所有请求都按顺序执行,不会有并发冲突。虽然Redis服务端是线程安全的,但如果多个客户端同时操作同一个数据,可能会导致线程安全问题。假设你有一个计数器存储在Redis中,初始值为0正常情况下,最终的结果应该是2。0011结果变成了1。
2025-02-21 20:56:27
867
原创 Redis 存在线程安全问题吗?为什么?
假设两个 redis client 同时获取 Redis Server 上的 key1, 同时进行修改和写入,因为多线程环境下的原子性无法被保障,以及多进程情况下的共享资源访问的竞争问题,使得数据的安全性无法得到保障。对于客户端层面的线程安全性问题,解决方法有很多,比如尽可能的使用 Redis 里面的原子指令,或者对多个客户端的资源访问加锁,或者通过 Lua 脚本来实现多个指令的操作等等7。线程安全性:由于一次只有一个请求在处理,Redis 的数据操作是原子的,因此不存在线程安全问题。
2025-02-20 20:56:40
406
原创 Spring Boot 中自动装配机制的原理
2. 这个配置类是放在第三方的 jar 包里面,然后通过 SpringBoot 中的约定优于配置思想,把这个配 置类的全路径放在 classpath:META-INF/spring.factories 文件中。它的出现,让开发人员更加聚焦在了业务代码的编写上,而不需要去关心和业务无关的配置。@Enable 注解是模块驱动的意思,我们只需要增加某个@Enable 注解,就自动打开某个功能,而不需 要针对这个功能去做 Bean 的配置,@Enable 底层也是帮我们去自动完成这个模块相关 Bean 的注入。
2025-02-18 20:47:31
880
原创 Spring 是如何解决循环依赖问题的?
三级缓存是用来存储代理 Bean,当调用 getBean()方法时,发现目标 Bean 需要通过代理工厂来创建, 此时会将创建好的实例保存到三级缓存,最终也会将赋值好的 Bean 同步到一级缓存中。1.多例 Bean 通过 setter 注入的情况,不能解决循环依赖问题 2.构造器注入的 Bean 的情况,不能解决循环依赖问题 3.单例的代理 Bean 通过 Setter 注入的情况,不能解决循环依赖问题 4.设置了@DependsOn 的 Bean 的情况,不能解决循环依赖问题。
2025-02-17 20:41:18
939
原创 什么是Spring Boot?
Spring Boot 通过减少配置和提供开箱即用的模块,显著提升了开发效率。适合快速构建微服务、REST API 或全栈应用。掌握起步依赖、自动配置和常用注解后,开发者可以专注于业务逻辑而非环境搭建。Spring Boot 的核心原理是通过约定优于配置自动装配和内嵌容器等机制,简化 Spring 应用的开发和部署。机制实现方式自动配置通过注解和按需加载 Bean。起步依赖Maven/Gradle 的依赖管理模板,解决版本冲突。内嵌服务器将服务器作为库依赖,启动时动态初始化。外部化配置。
2025-02-16 13:58:18
1233
原创 Spring Boot 的约定优于配置,你的理解是什么?
框架预先定义好一套默认规则(约定),开发者只需遵循这些规则,就能省去大量显式配置的步骤。只有当需要打破默认规则时,才需要手动配置。举个例子假设你要在传统 Spring MVC 中配置一个视图解析器,通常需要手动指定前缀、后缀等参数。而在 Spring Boot 中,只要你将 HTML 文件放在目录下,并引入 Thymeleaf 依赖,框架就会自动配置视图解析器,无需一行 XML 或 Java 代码。
2025-02-14 20:27:05
750
原创 布隆过滤器到底是什么东西?它有什么用
布隆过滤器向我们展示了计算机科学中永恒的权衡之道——在空间与准确性、性能与可靠性之间寻找最佳平衡点。当处理海量数据时,它就像一位聪明的守门人,虽然偶尔会误放个别访客(假阳性),但能确保不放行任何可疑分子(无假阴性),这种特性使其成为构建高性能系统的秘密武器。理解并善用这种数据结构,将帮助开发者在日益复杂的系统架构中做出更明智的设计决策。
2025-02-13 20:47:34
899
原创 B+,-树的介绍
节点结构:B + 树的节点通常包含多个关键字和对应的数据指针。非叶子节点只存储关键字和指向下一层节点的指针,而叶子节点除了关键字外,还存储了实际的数据记录或者指向数据记录的指针。关键字有序排列:节点中的关键字按照从小到大的顺序排列。这使得在查找、插入和删除操作时能够快速定位到目标关键字的位置。
2025-02-06 17:44:32
693
原创 SpringBoot
什么是SpringBoot?SpringBoot对Spring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式 Spring的缺点Spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。虽然Spring的组件代码是轻量级的,
2025-02-06 17:38:46
754
原创 Linux系统的文件目录结构
./:表示上级目录(上一级) ./ :表示当前目录(同级),普通文件./可以省略,可执行文件(绿色)必须加./ 文件夹名称/:表示下级目录(下一级),注意这个斜杠/例如 /bin/bash、/bin/ed 等。Linux 系统不同于 Windows,没有 C 盘、D 盘、E 盘那么多的盘符,只有一个根目录(/),所有 的文件(资源)都存储在以根目录(/)为树根的树形目录结构中。文件管理命令 在日常工作中,我们经常需要对Linux的文件或目录进行操作,常见操作包括新建,删除,更改,查 看,复制,移动等。
2025-02-06 17:24:12
875
原创 若依框架使用(低级)
浏览器搜索若依,选择RuoYi-VueRuoYi-VueRuoYi-Vue重要的事情说三遍,进入gitee下面这个页面(注意红色框起来的部分)进入Gitee进行下载我下载的是最新的springboot3下载好后我们可以选择一个文件夹,压缩到里面压缩后有3个文件,一个数据库SQL,前后端,一开始都放在RuoYi-Vue-springboot3中,最好把前端的文件拿出来使用IDEA打开项目创建数据库和执行初始化 SQL建立好数据库之后,需要点击新建查询把SQL重新运行一下就欧克了,启动后端项目1. 修改 ap
2025-02-06 16:57:05
554
原创 虚拟机网络配置最佳实践
特别提示(重要): HWADDR=00:50:56:25:a3:22 每块网卡 MAC 地址都不一样,这里配置的值要与 ip addr 命令查看到的 ens33 信息中 link/ether xx:xx:xx:xx:xx:xx 一致 其他信息可按上面文档中进行配置。1. 设置静态IP,地址为:192.168.2.100 2. 设置子网掩码(默认):255.255.255.0 3. 设置默认网关:192.168.2.1 (重要!# 按 : 键进入命令模式,按 w 保存,按 q 退出,按!
2025-02-06 16:27:55
804
原创 消息队列总结ytesMessage:一个字节的数据流
使用消息队列后,下单操作和后续的扣款、发货、通知等操作就解耦了,下单完成发送一个消息到消息队列,需要用到的地方去订阅这个消息进行消息即可。,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。生产者(客户端)发送消息到消息队列中去,消费者(服务端)处理消息,需要消费的系统直接去消息队列取消息进行消费即可而不需要和其他系统有耦合,这显然也提高了系统的扩展性。
2025-01-14 20:39:43
582
原创 CDN工作原理详解
基于成本、稳定性和易用性考虑,建议直接选择专业的云厂商(比如阿里云、腾讯云、华为云、青云)或者 CDN 厂商(比如网宿、蓝汛)提供的开箱即用的 CDN 服务。这样的话,用户下单的第一时间,商品就从距离用户最近的仓库,直接发往对应的配送站,再由京东小哥送到你家。GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个 CDN 节点之间相互协作,最常用的是基于 DNS 的 GSLB。的方式将源站的资源同步到 CDN 的节点中。
2025-01-13 20:38:07
937
转载 认证授权基础概念详解
小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了 10000 元。典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。在 RBAC 权限模型中,权限与角色相关联,用户通过成为包含特定角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。
2025-01-11 17:08:43
94
原创 Spring&SpringBoot常用注解
自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。的话一般是用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。注解的使用,在下面的“前后端传值”这块会讲到。注解说一下,虽然我们一般不会主动去使用它。如果你的项目太老了的话,就当我没说。一般用来声明配置类,可以使用。
2025-01-09 20:54:14
475
原创 字符集详解
级别的字符集是 MySQL 服务器的全局设置,它不仅会作为创建或修改数据库时的默认字符集(如果没有指定其他字符集),还会影响到客户端和服务器之间的连接字符集,具体可以查看。级别的字符集是 MySQL 服务器的全局设置,它不仅会作为创建或修改数据库时的默认字符集(如果没有指定其他字符集),还会影响到客户端和服务器之间的连接字符集,具体可以查看。GB18030 完全兼容 GB2312 和 GBK 字符集,纳入中国国内少数民族的文字,且收录了日韩汉字,是目前为止最全面的汉字字符集,共收录汉字 70000 多个。
2025-01-08 18:53:39
865
原创 Explain
Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是 执行这条SQL 注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中Explain分析示例示例表: 2 DROP TABLE IF EXISTS `actor`; 3 CREATE TABLE `actor` ( 4 `id` int(11)
2025-01-07 20:48:28
456
原创 MySQL
开发当中我们大多数时候用的都是长连接,把连接放在Pool内进行管理,但是长连接有些时候会导致 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。我们知道由于MySQL是开源的,他有非常多种类的客户端:navicat,mysql front,jdbc,SQLyog等非常丰富的客户端,这些客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是有连接器完成的。第一步,你会先连接到这个数据库上,这时候接待你的就是连接器。
2025-01-06 20:25:41
448
原创 Git核心概念
分布式版本控制系统可以不用联网就可以工作,因为每个人的电脑上都是完整的版本库,当你修改了某个文件后,你只需要将自己的修改推送给别人就可以了。有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。集中化的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
2025-01-04 16:59:37
824
原创 MySQL隐式转换造成索引失效
在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很小的疏忽造成的,又或者是因为不了解某个技术特性产生的。所以,我们在写 SQL 时一定要养成良好的习惯,查询的字段是什么类型,等号右边的条件就写成对应的类型。某些转换是隐式发生的。类型的,查询条件等号右边加引号的第 4 条 SQL 是用到索引的,那么是查询的数据类型和字段数据类型不一致造成的吗?这四条 SQL 都是有针对性写的,12 查询的字段是 int 类型,34 查询的字段是。
2025-01-03 20:44:26
843
原创 MySQL查询缓存详解
分配内存块需要先锁住空间块,所以操作很慢,MySQL 会尽量避免这个操作,选择尽可能小的内存块,如果不够,继续申请,如果存储完时有空余则释放多余的。MySQL 中的查询缓存虽然能够提升数据库的查询性能,但是查询同时也带来了额外的开销,每次查询后都要做一次缓存操作,失效后还要销毁。配置的空间,即使缓存数据很小,申请数据块也是这个,因为查询开始返回结果的时候就分配空间,此时无法预知结果多大。对于一个更新频繁的系统来说,查询缓存缓存的作用是很微小的,在某些情况下开启查询缓存会带来性能的下降。
2025-01-02 20:42:43
931
原创 MySQL三大日志(binlog、redo log和undo log)详解
其中,比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)。比如 MySQL 实例挂了或宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与完整性。MySQL 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到。为了保证事务的持久性,我们必须将其设置为 1。满了,这时候不能再写入新的 redo log 记录,MySQL 得停下来,清空一些记录,把。
2024-12-31 16:16:41
1298
原创 Spring
我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。于是,Spring Boot 诞生了!
2024-12-30 20:48:26
806
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人