- 博客(116)
- 收藏
- 关注
原创 分布式事务的原理
分布式系统无法同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)。分布式事务的核心是通过协议(如 2PC/3PC/XA)或业务逻辑(如 TCC/Saga)协调多节点操作,在性能、一致性和可用性之间取得平衡。节点间通信可能延迟、中断或消息丢失,导致事务状态无法同步,出现 “部分提交” 或 “悬挂事务”。节点或数据库故障后,需通过日志、补偿等机制恢复事务状态,避免数据不一致。
2025-03-10 20:37:05
644
原创 谈谈你对Seata的理解
Seata 通过分层架构和多种事务模式,为分布式系统提供了灵活且高效的事务解决方案。其 AT 模式的无侵入性和自动化补偿能力,使其成为微服务场景下的首选方案。然而,在复杂业务或对强一致性要求极高的场景中,需结合 TCC 或 XA 模式使用。随着开源生态的不断完善,Seata 已成为分布式事务领域的重要标准之一。Seata 的核心目标是为分布式系统提供高性能、易使用的事务解决方案,确保跨服务 / 跨数据库操作的原子性和一致性。,通过分层架构支持不同场景的事务需求。
2025-03-07 21:19:30
386
原创 谈谈常用的分布式ID设计方案
将64位ID划分为时间戳(41位)、机器ID(10位)、序列号(12位),支持每秒409.6万ID生成278。:通过等待回拨时间、记录最后时间戳并报警、预留扩展位(如调整机器ID位)解决810。:引入RingBuffer预生成ID,解决时钟回拨问题,支持容器化部署10。:用户独立序列号体系,结合步进式持久化与分号段共享存储,避免全局锁竞争6。),通过设置不同初始值和步长实现多实例ID生成(如步长=机器数)213。多主模式:部署多个数据库实例,设置不同步长(如步长=实例数)13。
2025-03-05 20:19:19
947
原创 服务降级的理解
服务降级是指在分布式系统中,当系统面临高并发、资源紧张、故障等情况时,为了保证核心功能的可用性和稳定性,主动降低一些非核心服务的性能或暂时关闭一些不重要的服务功能,以牺牲部分功能的完整性来换取整体系统的可用性和稳定性,避免系统出现雪崩效应而导致整体崩溃。
2025-03-04 20:28:15
343
原创 Nacos数据同步原理解析
Nacos 数据同步机制分为和:采用,异步同步,保证最终一致性48。:采用,同步阻塞写入,保证强一致性211。客户端通过机制主动拉取配置变更,服务端通过队列延迟响应实现实时感知16。
2025-02-28 20:52:34
865
原创 SpringCloud的理解
Spring Cloud 是一个基于 Spring Boot 的开源微服务架构解决方案,它为开发者提供了一系列工具和组件来简化分布式系统的开发。Spring Cloud 通过集成不同的中间件和服务治理框架,帮助开发者快速构建出具有高可用性、可扩展性和弹性的微服务应用。
2025-02-27 20:16:12
839
原创 IO 和NIO有什么区别?
综上所述,IO 和 NIO 在数据读取方式、阻塞特性、使用的概念以及性能和适用场景等方面都存在明显的区别。在实际开发中,需要根据具体的需求和场景选择合适的 IO 方式。
2025-02-26 20:15:06
929
原创 什么是可重入,什么是可重入锁? 它用来解决什么问题?
可重入是指一段代码或函数在执行过程中可以被多次调用(包括递归调用或中断后再次调用),且不会因多次调用导致数据错误或逻辑异常。不依赖全局或静态变量:每次调用时状态独立。无共享资源竞争:不修改共享数据或正确处理并发访问。可中断恢复:执行过程中被中断后再次调用仍能正常完成。示例递归函数如果不依赖外部状态(如全局变量),仅通过参数传递状态,则是可重入的。不可重入的例子可能是一个函数在计算过程中修改全局计数器,导致多次调用时结果混乱。可重入锁是一种同步机制,允许同一个线程多次获取同一把锁而不被阻塞。
2025-02-25 19:57:46
270
原创 索引有哪些缺点以及具体有哪些索引类型
除了上述索引类型外,还有一些其他类型的索引,如函数索引、反向索引等,它们在特定的应用场景下也能发挥重要作用。
2025-02-21 19:33:46
362
原创 Redis 存在线程安全问题
因此,从这个角度讲,在单个 Redis 实例上,对数据的操作是原子性的,不需要额外的锁机制来保证线程安全。为了避免这种情况,应用程序通常需要对 Redis 客户端进行合理的管理,如使用连接池来管理 Redis 连接,确保每个线程正确获取和释放连接,避免多个线程同时使用同一个连接导致的问题。综上所述,Redis 单线程模型在一定程度上保证了自身操作的线程安全,但在集群环境、与外部系统交互等场景下,仍然需要考虑和处理与线程安全相关的问题,以确保数据的一致性和系统的稳定性。
2025-02-20 20:27:50
577
原创 Spring Bean 生命周期的执行流程
在 Spring 应用启动时,会读取配置文件(如 XML 配置、Java 注解配置等)或者扫描带有特定注解(如@Component@Service等)的类,将这些 Bean 的定义信息加载到 Spring 的或中。这些定义信息包括 Bean 的类名、作用域、依赖关系等。Spring Bean 的生命周期可以概括为:定义 -> 实例化 -> 属性注入 -> 初始化前 -> 初始化 -> 初始化后 -> 使用 -> 销毁前 -> 销毁。
2025-02-19 19:57:42
731
原创 Spring Boot 中自动装配机制的原理
启动类注解触发:使用注解标注启动类,该注解包含了多个重要注解,从而开启自动装配功能。加载自动配置类:Spring Boot 通过机制从文件中加载自动配置类。条件注解筛选:自动配置类中使用了大量的条件注解,根据不同的条件决定是否生效。配置 Bean 定义:当自动配置类生效后,会向 Spring 容器中注册相应的 Bean 定义。当自动配置类通过条件注解筛选后生效时,会向 Spring 容器中注册相应的 Bean 定义。通常在自动配置类中使用@Bean@Bean上述代码表示,当类路径下存在。
2025-02-18 20:43:15
622
原创 Spring Bean 生命周期的执行流程
解析配置元数据:Spring 容器会读取配置信息,这些配置信息可以是 XML 文件、Java 注解或者 Java 配置类。容器根据这些配置信息解析出 Bean 的定义,包括 Bean 的类名、作用域、依赖关系等。注册 Bean 定义:解析完成后,Spring 会将 Bean 定义信息注册到中,是一个存储 Bean 定义的注册表,它为后续的 Bean 创建提供了基础信息。
2025-02-17 18:57:56
833
原创 bloom filter 详细说明
Bloom filter(布隆过滤器)是一种空间效率很高的概率型数据结构,它可以用来判断一个元素是否属于一个集合。
2025-02-16 16:40:53
365
原创 Spring Boot 中 “约定优于配置” 原则的理解
综上所述,Spring Boot 的 “约定优于配置” 原则极大地简化了 Spring 应用的开发过程,提高了开发效率和项目的可维护性。尽管存在一些局限性,但在大多数情况下,它为开发人员提供了一种高效、便捷的开发方式,尤其适用于快速迭代的项目开发场景。,Spring Boot 会自动配置好 Web 开发所需的 Servlet 容器(如 Tomcat)、Spring MVC 等相关组件,无需开发人员手动编写大量的 XML 配置或 Java 配置类来进行初始化。例如,配置数据源时,使用。例如,如果项目依赖了。
2025-02-14 20:32:41
1168
原创 布隆过滤器有什么用?什么原理?如何使用?
Guava 提供的布隆过滤器的实现还是很不错的(想要详细了解的可以看一下它的源码实现),但是它有一个重大的缺陷就是只能单机使用(另外,容量扩展也不容易),而现在互联网一般都是分布式的场景。如果我们需要判断某个字符串是否在布隆过滤器中时,只需要对给定字符串再次进行相同的哈希计算,得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值在布隆过滤器中,如果存在一个值不为 1,说明该元素不在布隆过滤器中。并且,理论情况下,添加到集合中的元素越多,误报的可能性就越大。
2025-02-13 20:37:09
679
原创 Future与FutureTask源码解析,接口阻塞问题及解决方案
引言在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。一、多线程优化技巧1.1 线程池的使用与调优线程池是一种预先创建一定数量线程的容器,当有任务需要执行时,从线程池中获取可用线程来执行任务,任务完成后线程不会被销毁,而是返回线程池等待下一个任务。
2025-02-06 16:56:08
651
原创 RuoYi(若依)框架的介绍与基本使用
前端:在ruoyi-ui/src/views/system/user/index.vue中,使用Axios发送请求。前端:在ruoyi-ui/src/views/system/role/index.vue中,使用Axios发送请求。前端:在ruoyi-ui/src/views/system/tenant/index.vue中,添加租户管理页面。前端:在ruoyi-ui/src/views/login/index.vue中,使用Axios发送登录请求。
2025-02-06 16:39:56
1502
原创 Future、lock体系、死锁、AQS
2.lock可以提供一些synchronized不具备的功能,如响应中断、超时获取、非阻塞式获取、公平锁(实现方法:直接参数位置加ture(Lock lock = new ReentrantLock(true))、共享锁如读写锁。1 . 若无特殊的应用场景,推荐使用synchronized,其使用方便(隐式的加减锁),并且由于synchronized是JVM层面的实现,在之后的JDK还有对其优化的空间。基于链表的一个队列,此队列包装了线程节点,所有获取锁失败的线程都被包装为队列节点进入AQS中排队获取锁。
2025-02-06 16:28:51
431
原创 Solr简介
另一种是基于最大匹配的分词器,如IK ,Jeasy,庖丁,优点是可以自定义词库,增加新词,缺点是分出来的垃圾词较多。下面给出两种分词器的安装方法,任选其一即可,推荐第一种,因为smartcn就在solr发行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.2.0.jar,首选在solrconfig.xml中加一句引用analysis-extras的配置,这样我们自己加入的分词器才会引到的solr中.
2025-02-06 16:26:59
666
原创 Paxos 算法详解
像 Raft 算法就是 Multi-Paxos 的一个变种,其简化了 Multi-Paxos 的思想,变得更容易被理解以及工程实现,实际项目中可以优先考虑 Raft 算法。Paxos 算法是第一个被证明完备的分布式系统共识算法。更具体点来说,Raft 是 Multi-Paxos 的一个变种,其简化了 Multi-Paxos 的思想,变得更容易被理解以及工程实现。Basic Paxos 算法的仅能就单个值达成共识,为了能够对一系列的值达成共识,我们需要用到 Multi Paxos 思想。
2025-01-26 15:44:41
725
原创 Spring cloud
什么是微服务 微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间相互协调、互相配合,为用户提供最终价值。另外,应避免统一的、集中 咕泡科技出品,严禁商用 式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行 构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也 可以使用不同的数据存储。、 什么是服务熔断?这样做,虽然水平下降,但好歹可用, 比直接挂掉强。
2025-01-22 19:19:44
319
原创 spring那些事
Resource 和@Autowired 都是做 bean 的注入时使用,其实@Resource 并不是Spring的注解,它的 包是 javax.annotation.Resource ,需要导入,但是 Spring 支持该注解的注入。@Resource 有两个重要的属性: name 和 type,而 Spring 将@Resource 注解的name属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。Spring DAO:对 JDBC 的抽象,简化了数据访问异常的处理;
2025-01-20 17:20:21
753
原创 CDN工作原理详解
基于成本、稳定性和易用性考虑,建议直接选择专业的云厂商(比如阿里云、腾讯云、华为云、青云)或者 CDN 厂商(比如网宿、蓝汛)提供的开箱即用的 CDN 服务。GSLB (Global Server Load Balance,全局负载均衡)是 CDN 的大脑,负责多个 CDN 节点之间相互协作,最常用的是基于 DNS 的 GSLB。的方式将源站的资源同步到 CDN 的节点中。如果不预热的话,你访问的资源可能不在 CDN 节点中,这个时候 CDN 节点将请求源站获取资源,这个过程是大家经常说的。
2025-01-07 19:31:58
621
原创 分布式锁介绍
我们需要用到分布式锁,这样的话,即使多个线程不在同一个 JVM 进程中也能获取到同一把锁,进而实现共享资源的互斥访问。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。从图中可以看出,这些独立的进程中的线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到分布式锁访问共享资源。
2024-12-27 19:52:27
782
原创 数据冷热分离详解
使用 TiDB 6.0 的数据放置功能,可以在同一个集群实现海量数据的冷热存储,将新的热数据存入 SSD,历史冷数据存入 HDD。如果你的公司有 DBA 的话,也可以让 DBA 进行冷数据的人工迁移,一次迁移完成冷数据到冷库。数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。热数据是指经常被访问和修改且需要快速访问的数据,冷数据是指不经常访问,对当前项目价值较低,但需要长期保存的数据。冷热数据到底如何区分呢?
2024-12-24 20:15:34
938
原创 读写分离和分库分表详解
读写分离对于提升数据库的并发非常有效,但是,同时也会引来一个问题:主库和从库的数据存在延迟,比如你写完主库之后,主库的数据同步到从库是需要时间的,这个时间差就导致了主库和从库的数据不一致性问题。一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。而且,并不一定是单表千万级数据量就要分表,毕竟每张表包含的字段不同,它们在不错的性能下能够存放的数据量也不同,还是要具体情况具体分析。这种方案虽然会增加主库的压力,但是,实现起来比较简单,也是我了解到的使用最多的一种方式。
2024-12-23 18:51:34
706
原创 分布式锁介绍
我们需要用到分布式锁,这样的话,即使多个线程不在同一个 JVM 进程中也能获取到同一把锁,进而实现共享资源的互斥访问。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。如果多个 JVM 进程共享同一份资源的话,使用本地锁就没办法实现资源的互斥访问了。从图中可以看出,这些独立的进程中的线程访问共享资源是互斥的,同一时刻只有一个线程可以获取到分布式锁访问共享资源。
2024-12-20 19:40:35
655
原创 Java 定时任务详解
上图的时间轮(ms -> s),第 1 层的时间精度为 1 ,第 2 层的时间精度为 20 ,第 3 层的时间精度为 400。Quartz、Elastic-Job、XXL-JOB 和 PowerJob 这几个是专门用来做分布式调度的框架,提供的分布式定时任务的功能更为完善和强大,更加适合执行周期性的定时任务。时间轮中的每个时间格代表了时间轮的基本时间跨度或者说时间精度,假如时间一秒走一个时间格的话,那么这个时间轮的最高精度就是 1 秒(也就是说 3 s 和 3.9s 会在同一个时间格中)。
2024-12-19 20:16:09
1217
原创 MyBatis常见面试题总结
第二种是使用 sql 列的别名功能,将列别名书写为对象属性名,比如 T_NAME AS NAME,对象属性名一般是 name,小写,但是列名不区分大小写,MyBatis 会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成 T_NAME AS NaMe,MyBatis 一样可以正常工作。这 4 种接口的插件,MyBatis 使用 JDK 的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行这 4 种接口对象的方法时,就会进入拦截方法,具体就是。Dao 接口就是人们常说的。
2024-12-18 20:31:05
520
原创 IoC & AOP详解
AOP 的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流、接口幂等等)从核心业务逻辑中分离出来,通过动态代理、字节码操作等技术,实现代码的复用和解耦,提高代码的可维护性和可扩展性。OOP 的目的是将业务逻辑按照对象的属性和行为进行封装,通过类、对象、继承、多态等概念,实现代码的模块化和层次化(也能实现代码的复用),提高代码的可读性和可维护性。以日志记录为例进行介绍,假如我们需要对某些方法进行统一格式的日志记录,没有使用 AOP 技术之前,我们需要挨个写日志记录的逻辑代码,全是重复的的逻辑。
2024-12-17 20:00:04
926
原创 Redis常见阻塞原因总结
所以,如果一下子释放了大量内存,空闲内存块链表操作时间就会增加,相应地就会造成 Redis 主线程的阻塞,如果主线程发生了阻塞,其他所有请求可能都会超时,超时越来越多,会造成 Redis 连接耗尽,产生各种异常。由于这些命令时间复杂度是 O(n),有时候也会全表扫描,随着 n 的增大,执行耗时也会越长,从而导致客户端阻塞。执行迁移时,两端的 Redis 均会进入时长不等的阻塞状态,对于小 Key,该时间可以忽略不计,但如果一旦 Key 的内存使用过大,严重的时候会触发集群内的故障转移,造成不必要的切换。
2024-12-16 18:40:29
860
原创 Redis 5 种基本数据类型详解
这 5 种数据类型是直接提供给用户使用的,是数据的保存形式,其底层实现主要依赖这 8 种数据结构:简单动态字符串(SDS)、LinkedList(双向链表)、Dict(哈希表/字典)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)。这个过程也就是求交集的过程。Redis 中的 Hash 是一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接修改这个对象中的某些字段的值。
2024-12-13 15:21:39
994
原创 Redis 生产问题(重要)
具体是这样做的:把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。缓存雪崩和缓存击穿比较像,但缓存雪崩导致的原因是缓存中的大量或者所有数据失效,缓存击穿导致的原因主要是某个热点数据不存在与缓存中(通常是因为缓存中的那份数据已经过期)。举个例子:秒杀进行过程中,缓存中的某个秒杀商品的数据突然过期,这就导致瞬时大量对该商品的请求直接落到数据库上,对数据库造成了巨大的压力。缓存穿透中,请求的 key 既不存在于缓存中,也不存在于数据库中。
2024-12-12 16:02:25
1215
原创 Redis 性能优化(重要)
当我们提到 Redis 中的原子操作时,主要指的是这个操作(比如事务、Lua 脚本)不会被其他操作(比如其他事务、Lua 脚本)打扰,并不能完全保证这个操作中的所有写命令要么都执行要么都不执行。当客户端发送命令请求的时候,需要先根据 key 通过上面的计算公示找到的对应的哈希槽,然后再查询哈希槽和节点的映射关系,即可找到目标 Redis 节点。命令是 Redis 提供的一种实时查看 Redis 的所有操作的方式,可以用于临时监控 Redis 实例的操作情况,包括读写、删除等操作。
2024-12-11 19:45:45
1097
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人