- 博客(34)
- 问答 (1)
- 收藏
- 关注
原创 分布式事务处理方案
Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。RM1:开启本地事务 -> 业务SQL + undo_log -> 获取记录全局锁 -> 提交本地事务 -> 上报给TC执行结果。由于为保证消息的可靠性引入本地消息表,并且定时异步扫描,所以在性能方面要比RocketMQ差,并且代码量会更大,设计更加复杂。接口,提供一个回查的接口。
2025-05-26 23:48:49
1013
原创 线程池配置经验总结
当最大线程数超过CPU核心线程数后直接表现就是提高CPU的负载,然后就是线程对内存的占用。没有放之四海皆准的完美配置,最佳参数需要通过监控和调优不断调整。当上下文切换次数超过核心数×10000/秒时性能下降。可以获取k8s限制后的CPU数。突发流量频繁的系统可适当延长。资源紧张的系统可缩短时间。通常设置为60秒左右。
2025-05-25 15:26:54
300
原创 CPU飚高处理经验总结
来 输出线程ID 44616 的16进制是 ae48,可以确定导致CPU飙高的原因就是 Thread-0 线程导致。CPU负载(CPU Load)和CPU使用率(CPU Utilization)是衡量系统性能的两个关键指标,它们既有区别又有联系,通常需要结合分析才能全面理解CPU的工作状态。:1/5/15分钟的平均负载(参考值:≤ CPU核心数)。:运行中的进程数(CPU繁忙的直接体现)。:I/O等待时间(高则可能磁盘瓶颈)。:僵尸进程数(若不为0需排查)。:用户态CPU时间(:空闲CPU百分比。
2025-05-24 15:15:27
280
原创 Redis 缓存使用的BigKey问题
BigKey指在 Redis 中存储的单个 Key 对应的 Value 过大String 类型:Value 长度 > 10KB。:元素数量 > 5,000 或总大小 > 10MB。
2025-05-23 21:48:40
599
原创 Redis 缓存使用的热点Key问题
方案适用场景优缺点本地缓存读多写少,允许短暂不一致简单高效,但需控制缓存时间Key 分片可水平拆分的统计类数据分散压力,但增加代码复杂度多级缓存高并发系统(如电商详情页)架构复杂,适合长期优化限流熔断突发流量(秒杀、大促)牺牲部分请求,保系统整体稳定监控发现:通过或 Prometheus 定位热点 Key;减少穿透:用本地缓存 + 永不过期策略;分散压力:分片存储或读写分离;兜底措施:限流熔断避免雪崩。根据业务特点灵活组合方案,才能有效解决热点 Key 问题!
2025-05-23 19:35:50
532
原创 MVCC多版本并发控制协议
MVCC 指的是一个数据的多个版本,使得读写操作没有冲突,快照读使MySQL为实现MVCC的一个非阻塞功能,提升数据库的并发性能。解决并发事、务访问中出现的脏读、不可重复读、幻读。
2025-04-13 01:09:21
780
原创 MySQL索引介绍
总结:数据库最大的性能损耗就在磁盘IO上,这也是Redis比MySQL快很多的最大原因。索引是依靠某些数据结构和算法来组织数据,尽最大可能去利用磁盘的的顺序IO,并减少IO的次数来优化数据库的访问速度。
2025-04-12 20:57:39
826
原创 Docker基础知识介绍
基础镜像 centos,Docker 绝大部分的基础镜像都是 scratch ,相当于Java 的 Object#把宿主机当前上下文的hello.txt拷贝到容器/usr/local/路径下#把java与tomcat添加到容器中#安装vim编辑器#设置工作访问时候的WORKDIR路径,登录落脚点#配置java与tomcat环境变量#容器运行时监听的端口#启动时运行tomcat。
2025-03-16 16:34:03
943
原创 Linux进程操作
我们还要解释一下缓冲(buffer)和缓存(cache)的区别: 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。-n 次数:指定 top 命令执行的次数。
2025-01-12 21:27:54
972
原创 JVM 垃圾回收算法
通过一系列称为“GC Roots”的根对象作为起始节点,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。收集器将Java堆划分出不同的区域,然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储,针对不同的区域安排与里面存储对象存亡特征相匹配的垃圾收集算法。
2024-07-17 17:37:54
1026
原创 JVM内存划分
直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,在JDK 1.4中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。ava堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms设定)。
2024-07-17 14:15:10
966
原创 类的加载机制详解
一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历以下几个阶段准备(Preparation):准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段,这时候进行内存分配的仅包括类变量,而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。这个时候的初始值指的是数据类型的默认值,不是我们编码定义的那个值。解析(Resolution):解析阶段是Java虚拟机将常量池内的符号引用替换为直接引用的过程。
2024-07-16 17:44:19
661
原创 volatile关键字详解
volatile 关键字在并发三特性中只有可见性和有序性,所以并不能保证并发的安全,并发安全还是得使用synchronized 关键字来保证。
2024-07-16 15:49:08
309
原创 万字长文带你认识DDD领域驱动
关于DDD领域驱动介绍的书内容大多都是概念,落地的架构代码实现派系众多,很多初学者不得其道,其实我们只要抓住以下最核心的问题在工作设计中去深入体会即可:DDD 第一个重要部分就是战略设计,战略设计就是业务分析、创建领域模型,通常有事件风暴、四色建模法等,这里文章提及比较少,自己可以学习相关方法,提升自己的业务分析建模能力DDD第二个重要部分就是战术设计,战术设计就是合理的代码分层、分包、利用战略设计的建模来创建聚合、实体,使业务代码稳定健壮。
2024-07-11 16:23:13
562
原创 线程池的使用
以下是线程池的构造方法源码,我们依次解释如果当前任务队列待执行任务数量小于核心线程池数量,执行器总是优先创建一个任务线程如果当前任务队列待执行任务数量大于核心线程池数量,执行器总是优先从线程池中取一个空闲线程如果当前任务队列待执行任务数量大于核心线程池数量,且线程池中无空闲任务线程,将会创建一个任务线程,直到超出maximumPoolSize,如果超时maximumPoolSize,则任务将会被拒绝。
2024-07-11 15:27:04
469
原创 JUC包中的各种同步器
park(): 阻塞当前线程,直到unpark方法被调用或当前线程被中断,park方法才会返回。parkNanos(long nanos): 同park方法,nanos表示最长阻塞超时时间,超时后park方法将自动返回。单位是纳秒 ,1秒 = 100010001000 纳秒parkUntil(long deadline): 同park()方法,deadline参数表示最长阻塞到某一个时间点,当到达这个时间点,park方法将自动返回。(该时间为从1970年到现在某一个时间点的毫秒数)
2024-07-10 18:24:20
944
原创 并发编程之AQS详解
使用了一个int成员变量state来表示同步锁状态,通过内置的FIFO(first-in-first-out)同步队列来控制获取共享资源的线程。内部state 和Node 内部类的属性都被volatile 关键字修饰,在修改state 和 阻塞队列时 都使用CAS机制循环添加,保证并发安全。所以可以说AQS就是利用volatile 和CAS的实现。线程的阻塞方法都是使用的unsafe类进行的。进入到队列后,线程的阻塞和唤醒是使用的。内置的三个修改同步状态的方法。接下来先看下关键源码。
2024-07-04 16:38:17
277
原创 并发编程中的Synchronized锁详解
重量级锁对象的实现,采用C++ 编写,在Synchronized 同步的对象的对象头MarkWord中指针指向这个真正的对象。第三部分:填充字符,因为虚拟机要求对象字节必须是8字节的整数倍,填充字符就是用于凑齐这个整数倍的。第二部分:实例变量存储的是对象的属性信息,包括父类的属性信息,按照4字节对齐。Synchronized 的锁存在锁对象的对象头MarkWord中。第一部分:对象头,主要包括。由图中可用得出两个结论。
2024-07-04 15:45:43
643
原创 Spring中的事务同步管理器
Spring 中的事务同步管理器是一个非常重要的扩展点,它允许开发者参与到 Spring 管理的事务生命周期中的特定阶段,从而能够在事务开始前、事务结束(提交或回滚)前后执行自定义的操作。这个接口主要用来实现事务相关的同步行为,帮助开发者实现在事务边界上进行资源清理、刷新缓存、发送通知等操作。//提交状态//回滚状态//状态未知,比如事务提交或者回滚的过程中发生了异常,那么事务的状态是未知的。
2024-07-02 17:23:43
621
原创 Spring 中的各种拦截器
在本文旨在梳理Web项目开发过程的各拦截器用法场景,以及它们之间的区别与联系,方便我们在请求到达的各个环节进行拦截处理。
2024-05-10 17:55:55
1835
2
原创 Java中的泛型
1. 泛型类的使用(接口和类一样)1.1. 子类也是泛型类,子类和父类的泛型类型要一致。public class FoodPlate<T> extends Plate<T> { private T food; @Override public T getFood() { return food; }}1.2. 子类不是泛型类,父类要明确泛型的数据类型。public class FoodPlate extends Plat
2024-05-08 22:40:52
339
空空如也
MyEclipse 配置 JVM内存 小白提问,求大神指点!
2017-08-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人