- 博客(157)
- 收藏
- 关注
原创 【数据结构-红黑树】
红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree, BST),它在普通二叉查找树的基础上增加了一些额外的约束条件,以确保树的平衡性,从而保证在最坏情况下插入、删除和查找操作的时间复杂度为 O(logn)。
2025-02-11 13:50:28
895
原创 【Lock中的Condition分析】
在 Java 中,Lock 和 Condition 是并发编程中用于实现线程同步的重要工具,它们提供了比传统 synchronized 更灵活的线程控制能力。Lock 提供了显式的锁操作,而 Condition 则允许线程在某些条件不满足时挂起,并在条件满足时被唤醒。以下是一个使用 Lock 和 Condition 实现生产者-消费者模型的示例代码。这个示例展示了如何通过 Lock 和 Condition 来协调生产者和消费者的行为。
2025-01-23 13:53:28
982
原创 【支付架构业务架构】
3.判断当前的商户配置的结算是D0还是D1,如果是D0,请求计费系统根据配置的商户费率,计算出手续费,一般的商户手续费千分之六来收取,手续费为0.03元,商户应该收到的金额为4.97元,如果为D1结算,先不计算手续费,第二天凌晨统一结算。7.如果为D1账户类型,我们在D+1的凌晨进行清结算,计算出手续费和商户的应得金额,通过日终翻账将商户的应得金额转入现金账户,手续费转入内部收益账户。2.业务侧收到的一笔请求,先进行基本的数据校验,保证业务校验逻辑通过后,将数据落入订单表中,业务校验失败,返回交易失败。
2025-01-14 14:02:46
832
原创 【SpringAop实现切片注解】
Spring AOP(Aspect-Oriented Programming)是 Spring 框架中的一项功能,旨在通过切面(Aspect)将横切关注点(Cross-Cutting Concerns)与业务逻辑解耦,从而使代码更加模块化和易维护。Spring AOP(Aspect-Oriented Programming)是 Spring 框架中的一项功能,旨在通过切面(Aspect)将横切关注点(Cross-Cutting Concerns)与业务逻辑解耦,从而使代码更加模块化和易维护。
2025-01-10 16:36:13
934
原创 【Sharding-Jdbc总结】
Sharding-JDBC 是 Apache ShardingSphere 的一个模块,它是一个 轻量级的 Java 数据访问框架,通过增强 JDBC 驱动实现了分库分表、分布式事务、读写分离和数据加密等功能。它适用于任何基于 JDBC 的应用程序。
2025-01-03 14:12:42
687
原创 【spring-cloud-gateway总结】
在微服务架构中,gateway网关是一个服务,它作为系统的唯一入口点,处理所有的客户端请求,然后将这些请求路由到适当的服务。提供了几个关键功能:1.请求路由:根据请求的URL路径和其他参数,将请求路由到正确的后端服务。2.负载均衡:在多个服务实例之间分配流量,以提高可用性和可扩展性。3.认证和授权:检查用户是否有权访问特定的服务。4.限流:控制访问后端服务的请求速率,以防止过载。5.监控:收集关于API使用情况的统计数据,用于分析和计费。
2024-12-22 20:37:25
530
原创 【SpringBoot-事件监听】
2. 创建监听器3. 发布事件注意事项1.确保事件发布者和监听器处于同一个Spring应用程序上下文中。2.事件发布是异步的,所以事件处理方法不应该有关于执行时间的假设。3.事件监听器方法可以声明抛出异常,这些异常会被Spring捕获并记录。
2024-12-11 21:24:15
326
原创 【Open-Fegin使用介绍】
OpenFeign 是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加容易。OpenFeign 旨在整合Ribbon和Nacos,为微服务架构中的服务间调用提供声明式的REST客户端。它使得编写服务客户端变得简单,就像编写本地接口一样。以下是OpenFeign的一些关键特性:1.声明式REST客户端:OpenFeign允许你通过定义一个接口并使用注解来声明服务调用,而不是编写客户端的实现代码。
2024-12-04 21:36:15
669
原创 【Spring Security框架解析】
Spring Security是一个功能强大且高度可定制的Java安全框架,用于保护基于Spring的应用程序。它提供了全面的安全服务,包括认证(Authentication)、授权(Authorization)、防止CSRF等。认证(Authentication)认证是确认用户身份的过程。Spring Security支持多种认证机制,如表单登录、HTTP基本认证、OAuth2、LDAP等。授权(Authorization)授权是确定用户是否有权限访问特定资源的过程。
2024-12-02 20:54:50
1063
原创 【Naocs-04源码分析-服务健康检查】
Nacos中临时实例基于心跳上报方式维持活性,基本的健康检查流程基本如下:Nacos客户端会维护一个定时任务,每隔5秒发送一次心跳请求,以确保自己处于活跃状态。Nacos服务端在15秒内如果没收到客户端的心跳请求,会将该实例设置为不健康,在30秒内没收到心跳,会将这个临时实例摘除。可以看出定时任务的执行间隔就是配置的metadata中的数据preserved.heart.beat.interval,与上面提到配置heart-beat-interval本质是一回事,默认是5秒。
2024-11-21 16:17:00
727
原创 【Lambda表达式与Stream API】
Lambda表达式(也称为λ表达式)是Java 8中引入的一种新特性,它允许你以简洁的语法编写匿名函数。Lambda表达式主要用于实现没有名称的内联函数,它们可以作为参数传递给方法,或者作为返回值。(参数列表)->{Lambda体}测试案例:新起一个线程打印hello world字段//非lambda表达式写法@Override).start();//lambda表达式写法}).start();函数式接口可以有一个或多个默认方法和静态方法,但只能有一个抽象方法。
2024-11-21 11:25:12
1035
原创 【Mysql主从复制总结】
MySQL的主从复制(Master-Slave Replication)是一种数据库复制技术,用于将一个数据库服务器(主服务器,Master)上的数据更改同步到一个或多个其他数据库服务器(从服务器,Slave)上。这种技术可以用于多种目的,包括数据备份、负载均衡、高可用性、读写分离等。以下是主从复制的一些关键点:1.数据备份和高可用性:主从复制可以用于创建数据的热备份,即在从服务器上实时复制主服务器的数据,以防止主服务器发生故障时数据丢失。
2024-11-18 16:27:26
839
原创 【mybaties-plus多数据源配置】
随着项目规模的扩大,单一数据源已无法满足复杂业务需求,多数据源(动态数据源)应运而生。本文将介绍两种 MyBatis-Plus 的多数据源扩展插件:开源生态的 dynamic-datasource和mybatis-mate。
2024-11-12 21:48:21
515
原创 【mybaties-plus配置自动路由月表】
InnerInterceptor 是 MyBatis Plus 提供的一个拦截器接口,它允许开发者在 MyBatis 的执行过程中插入自定义逻辑。这个接口是 MyBatis 插件机制的一部分,可以用来拦截和修改 SQL 语句、处理事务、日志记录等。接口处理:在 StatementHandler 准备 SQL 语句之前调用。可以在这里修改 SQL 语句或者执行一些前置处理。在 StatementHandler 准备 SQL 语句之后调用。
2024-11-10 20:51:52
822
原创 【xxl-job总结】
XXL-JOB是一个轻量级分布式任务调度平台,它的核心设计目标是开发迅速、学习简单、轻量级、易扩展。1.简单易用:XXL-JOB提供了友好的Web界面,使得用户可以通过简单的操作完成任务的创建、编辑、删除和查询。2.动态管理:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效。3.调度中心高可用(HA):调度采用中心式设计,支持集群部署,可保证调度中心的高可用性。4.执行器高可用(HA):任务分布式执行,执行器支持集群部署,可保证任务执行的高可用性。
2024-11-05 21:44:09
912
原创 【Nacos-03集群内数据同步讲解】
当服务启动时,如果是Follower节点接收到请求,则会自动将请求转发给Leader节点,Leader节点完成实际的注册登记工作后,会向其他Follower节点发起“同步注册日志”的指令,以确保所有节点的数据一致性,Distro算法是集群中的一台机器收到接收到写请求并处理后,它会异步地将数据变更复制到其他节点,这样可以减少对写操作的延迟影响 ,来保证最终一致性,因此Nacos的临时节点保证AP,持久节点保证CP。这意味着在不同的地理位置,Nacos节点之间需要同步数据,以确保服务的连续性和数据的一致性。
2024-10-27 21:14:19
1261
1
原创 【延时队列的实现方式】
DelayQueue是一个BlockingQueue(无界阻塞)队列,它本质就是封装了一个PriorityQueue(优先队列),PriorityQueue内部使用完全二叉堆(不知道的自行了解哈)来实现队列元素排序,我们在向DelayQueue队列中添加元素时,会给元素一个Delay(延迟时间)作为排序条件,队列中最小的元素会优先放在队首。Redis的数据结构Zset,同样可以实现延迟队列的效果,主要利用它的score属性,redis通过score来为集合中的成员进行从小到大的排序。
2024-09-25 21:24:31
1127
原创 【JAVA集合总结-贰】
AtomicInteger 是 Java java.util.concurrent.atomic 包中的一个类,它提供了一种线程安全的方式来操作整数。AtomicInteger 利用底层的硬件原子指令(如 Compare-And-Swap,即 CAS 指令)来保证操作的原子性,从而避免了使用同步锁带来的性能开销。AtomicInteger 是 Java java.util.concurrent.atomic 包中的一个类,它提供了一种线程安全的方式来操作整数。
2024-09-24 21:28:09
1119
原创 【JAVA集合总结-壹】
伪共享(False Sharing)是多线程系统中一个常见的性能问题,它发生在多个线程对位于同一缓存行中的不同变量进行操作时。由于缓存行是缓存系统中数据存储的最小单位,当多个线程修改同一缓存行中的变量,即使这些变量是独立的,也会导致缓存行在处理器之间频繁地无效和同步,从而引发性能下降。伪共享的影响伪共享会导致CPU缓存的利用率降低,增加线程同步的开销,并降低程序的可扩展性。在多核处理器系统中,如果多个线程在竞争同一缓存行,它们可能无法充分利用多核处理器的并行处理能力。避免伪共享的策略。
2024-09-22 20:50:19
1039
原创 【Mysql-索引总结】
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
2024-09-20 14:44:22
894
原创 【限流算法】
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
2024-09-18 21:32:17
463
原创 【RocketMq消费者Rebalance总结-3】
Rebalance机制,即再均衡机制,是RocketMQ中一个重要的功能。当一个Topic下的多个队列(或称之为分区)需要在同一个消费者组下的多个消费者实例之间进行重新分配时,就会触发Rebalance机制。该机制的本意是为了提升消息的并行处理能力。举例来说,如果一个Topic下有5个队列,在只有1个消费者的情况下,那么这个消费者将负责处理这5个队列的消息。如果此时我们增加一个消费者,那么可以通过Rebalance机制,给其中一个消费者分配2个队列,给另一个分配3个队列,从而提升消息的并行处理能力。
2024-09-01 16:58:22
1017
原创 【分布式架构幂等性总结】
用户上车后刷码支付扣款成功,如果用户再次点击按钮刷卡并扣款成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。在执行操作之前,检查请求是否已经被处理过,例如,通过查找数据库中的记录或检查缓存中的标记。分布式缓存中的节点可能会重复接收到相同的更新请求,需要保证操作的幂等性以避免数据不一致。在多线程或多进程环境中,为了避免并发导致的数据不一致问题,需要保证操作的幂等性。在使用缓存系统时,为了保证缓存与数据库之间的一致性,缓存更新操作需要是幂等的。
2024-08-27 21:46:39
874
原创 【秒杀系统架构图】
秒杀系统一般出现正在电商平台中,秒杀系统需要支持高并发,保持一致性和高可用的特点:高性能。秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。本专栏将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。一致性。秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性。高可用。
2024-08-20 21:17:33
500
原创 【ThreadLocal总结】
remove方法会将ThreadLocal为null对应的value设置为null,同时会把对应的Entry对象也设置为null,并且会将所有ThreadLocal对应的value为null的Entry对象设置为null,这样就去除了强引用,便于后续的GC进行自动垃圾回收,也就避免了内存泄露的问题。此时,我们可以看到,Entry对象中的Key,也就是ThreadLocal对象可以被GC自动回收,但是对应的value还在被引用,所以,value是不能被GC自动回收的,这种情况下就会存在内存泄露的风险。
2024-08-06 21:25:16
794
原创 【SpringCloud-Seata源码分析3】
seata后台服务时对事务进行的异步提交,首先来分析一下我们后端服务的入口DefaultCoordinator#doglobalCommit方法。前面两篇我们分析了seata的TC初始化和TM,RM初始化,并且事务准备阶段源码及业务Sql执行,下面我们分析事务的提交源码。AT模式将事务状态改为异步提交AsyncCommitting,然后定时运行线程池1s轮训运行一次。服务端的事务回滚是从GlobalRollbackRequest方法进入的。获取所有的一步提交状态的事务,并加上排他锁。
2024-06-24 21:30:03
618
4
原创 【SpringCloud-Seata源码分析2】
我们分支事务的开始需要从PreparedStatementProxy#executeUpdate中去看。第一篇我们将全局事务启动,以及开启源码分析完成了,现在我们需要看一下分支事务注册。我们首先看一下分支事务服务端注册的入口DefaultCoordinator#判断出当前的业务Sql是什么类型,我们需要选择不同的执行器。我们的核心分支事务注册代码。组装请求数据,发送后端。创建封装分支事务的信息。excute()执行。
2024-06-22 21:24:59
359
原创 【SpringCloud-Seata客户端源码分析01】
这通常用于在bean的属性全部设置完毕后需要进行的一些自定义初始化工作,例如验证属性或建立资源连接。在SeataAutoConfiguration我们找到对应注入的类GlobalTransactionScanner,通过名称我们应该推算出,他应该是对应@GlobalTransaction进行扫描,然后注入到容器。继承的InitializingBean的afterPropertiesSet方法中实现InitializingBean接口的使用。TM和RM底层都是用的Netty进行的通讯。
2024-06-18 21:37:10
492
4
原创 【服务的主从切换实现原理】
主从服务架构是一种常见的分布式系统设计模式,常用于提高系统的性能、可用性和扩展性。在这种架构中,系统中的节点被分为两类:主节点(Master)和从节点(Slave)。
2024-06-11 14:10:35
1438
原创 【服务实现读写分离】
服务读写分离(Service Read-Write Splitting)是一种常见的数据库架构设计模式,旨在提高系统的性能和可扩展性。通过将读操作和写操作分离到不同的数据库实例上,可以减轻单个数据库实例的负载,提高整体系统的响应速度和可靠性。核心思想写操作:所有的写操作(插入、更新、删除)都发送到主数据库(Master)。读操作:所有的读操作(查询)都发送到从数据库(Slave)。主要步骤主从复制:配置一个主数据库和一个或多个从数据库,从数据库实时同步主数据库的数据更新。
2024-06-10 08:56:39
996
1
原创 【基于Redis的分布式限流】
基于 Redis 的分布式服务限流是一种常用的策略,用于控制和限制对某个服务的访问频率,以防止过载。使用 Redis 可以有效地实现分布式环境下的限流。用redis来判断当前的流量,这里区分单机或者集群。切面的实现,需要了解AOP代理。
2024-06-05 17:50:00
366
2
原创 【Nacos源码分析02-服务配置】
服务配置中心介绍首先我们来看一下,微服务架构下关于配置文件的一些问题:配置中心的思路是:首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。1.导入依赖2.配置nacos-config:1)不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件;2)在boots
2024-06-05 15:29:56
682
原创 【Nacos源码分析01-服务注册与集群间数据是同步】
在processTasks()方法中,首先获取处理类,如果获取不到,则使用默认的处理类。对于Delete操作,由DistroSyncDeleteTask处理,对于Change操作,由DistroSyncChangeTask处理,这里我们从DistroSyncChangeTask来看。对于Delete操作,由DistroSyncDeleteTask处理,对于Change操作,由DistroSyncChangeTask处理,这里我们从DistroSyncChangeTask来看。
2024-05-31 22:06:34
1113
原创 【BindingResult注解参数校验总结】
BindingResult 是 Spring 框架中用于处理表单验证结果的一个接口,常用于在处理表单提交时捕获和处理验证错误。当你在 Spring MVC 控制器方法中使用 @Valid 注解对表单对象进行验证时,可以通过 BindingResult 接收验证结果并处理错误。
2024-05-29 21:22:33
537
原创 【主流分布式算法总结】
当一个候选者成为领导者时,它会增加当前任期的编号,并在该任期内保持领导者身份。Raft集群通过Leader与客户端进行交互,Leader不断处理写请求与发送心跳给Follower,Follower在收到Leader的心跳后,其超时时间会重置,即重新开始倒计时。6.安全性和一致性:RAFT确保在系统中只有一个领导者,并且所有节点都按相同的顺序应用相同的日志条目,从而确保了系统的一致性和安全性。而我们的业务中,一般一致性、可用性、分区容错性,三个满足两个,一般算法就是以CA和AP两个选择性,进行选择。
2024-05-28 21:02:14
1155
原创 【常用的队列总结】
在 Java 中,队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO)的原则管理元素。队列通常用于在数据集合中添加元素,并按照它们被添加的顺序移除元素。Java 提供了丰富的队列实现,可以满足不同场景下的需求。LinkedList 是 Java 中实现了 List 接口的类,它基于双向链表数据结构实现了列表的操作。除了实现了 List 接口之外,LinkedList 还实现了 Queue 接口,因此也可以用作队列。
2024-05-27 16:43:51
760
2
原创 【模版方法设计模式】
模版方法设计模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。4.依赖倒置:依赖于抽象,而非具体实现,即面向接口编程(如方法参数,类属性使用接口声明,这样可接收任何子类)。3.里氏替换原则:子类可扩展新方法,但不可修改父类已有方法(父类已提供了具体实现的方法)。这种设计模式的主要目的是让某些方法的具体实现推迟到子类中去完成,提供一种代码复用的机制。基本操作方法可以是抽象的(需要子类实现)或具体的(提供默认实现)。
2024-05-26 17:52:49
577
原创 【手写大跟堆详解】
大根堆(Max Heap)是一种特殊的二叉树结构,它满足以下两个条件:1.完全二叉树:大根堆是一棵完全二叉树,即除了最后一层外,其余每一层的节点都是满的,最后一层的节点都集中在最左边。2.堆性质:每个节点的值都大于或等于其子节点的值。大根堆的典型操作包括插入,获取root节点的最大值。
2024-05-23 21:09:30
1430
原创 【LRU算法讲解】
LRU(Least Recently Used,最近最少使用)是一种常用的缓存淘汰算法,用于管理缓存中的数据。该算法的核心思想是根据数据的访问模式,淘汰最近最少被访问的数据,以便为新的数据让出空间。具体而言,LRU算法维护一个有序的数据结构,通常是一个双向链表,同时也使用哈希表来实现快速查找。当数据被访问时,如果该数据已经在缓存中,则将其移动到链表的头部(表示最近被访问),保持最新访问的数据都在链表头部。
2024-05-21 21:49:26
860
原创 【Sentinel源码分析】
图中将窗口划为5份,每个小窗口中的数字表示在这个窗口中请求数,所以通过观察上图,可知在当前时间快(200毫秒)允许通过的请求数应该是70而不是200(只要超过70就会被限流),因为我们最终统计请求数时是需要把当前窗口的值进行累加,进而得到当前请求数来判断是不是需要进行限流。Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
2024-05-19 21:27:59
1063
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人