自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Raft算法(二):如何复制日志?

Raft协议的日志复制过程,如何解决主从之间数据不一致的情况

2025-01-20 22:39:20 30

转载 Raft算法(一):如何选举领导者?

分布式协议Raft算法选主过程介绍

2025-01-20 22:33:39 67

原创 大事务+定时任务=线上故障?

通过华润工作中的一个真实线上小故障介绍长事务的危害,以及如何定位分析问题。对长事务的解决手段有哪些。

2025-01-09 14:11:57 258

原创 高并发写利器-组提交,我的Spring组件实战

介绍高并发写的常用优化手段,解析MySQL组提交原理,基于批量顺序写理论实现组提交组件。对比组提交和单条提交的两种测试用例,进行压测得出组提交比单提交性能高出很多。

2025-01-04 20:10:04 693 1

原创 排查和解决JVM OOM实战

本文深入探讨Java虚拟机(JVM)中的内存区域布局及常见的内存溢出错误(OOM)类型,不仅限于堆内存,还包括元空间和直接内存等。通过沃尔玛支付中台的实战案例,详细解析了一次因内存泄漏导致的OOM事故排查过程。从问题表现、排查手段到最终解决方案,全面展示了如何运用jmap、MAT等工具定位内存泄漏点,并修复代码以避免类似问题再次发生。无论你是Java开发者还是系统运维人员,都能从中获得宝贵的经验和技巧,提升系统稳定性和性能。

2024-10-06 13:05:54 1210 2

原创 MySQL优化实战 解决CPU100%

深入排查并优化数据库CPU周期性打满问题的经历。问题表象为每小时整点03分数据库CPU使用率飙升,持续一分钟后恢复正常。首先排除了业务流量暴增的可能性,聚焦于定时任务。通过详细分析,发现任务状态修改的Job中,通过临时方案解决了问题,并讨论了进一步的优化空间。本文揭示了慢SQL对数据库性能的影响,以及如何通过日志分析和索引优化来解决问题。

2024-10-02 12:38:02 1684

原创 MySQL日志binlog和redo log区别

介绍MySQL WAL机制,介绍binlog的作用和实战会使用的配置参数。以及对比redo log的区别和用途,重点解析为什么binlog不能用于crash后的数据恢复,还需要redo log。

2024-09-17 16:19:10 520

原创 canal消费binlog异常排查

在生产上遇到了canal同步es数据突然中断的问题,初步查看是发现MQ没有继续发送消息同步数据了。随着排查深入发现是K8S的pod节点内存不够导致的驱逐pod,canal-server被重启,canal-client和server断开连接,消费线程遇到异常没有进行合适的处理,打了错误日志退出消亡。学习了canal原理,伪装成slave节点向master拉取binlog并转化为自定义的DML event给用户消费。还学习了canal通过zookeeper的强CA机制实现多节点的HA机制。

2024-09-17 15:04:10 1524

原创 K8S Docker搭建RocketMQ Dledger高可用集群

讲解RocketMQ最流行的3种集群部署模式以及它们之间的差异。带你用3台小机器结合K8S和Docker搭建一个高可用具备failover能力的生产集群。实现TPS 6000和百万消息收发的RocketMQ集群。

2024-08-04 10:31:58 1296 4

原创 深入分析MySQL假死故障

那是大半年前的一次线上DB故障。

2024-07-28 23:55:09 710

转载 通用的数据平滑迁移方案

数据迁移 平滑迁移 不停机 分库分表

2024-03-01 17:19:35 265

原创 RocketMQ存储原理 CommitLog解析

从源码深入解析RocketMQ的消息存储机制和主从同步机制。介绍CommitLog文件和消息序列化协议。深入浅出消息是如何写入内存然后同步到磁盘的。介绍两种刷盘策略:同步刷盘、异步刷盘。看完本篇文章轻松战胜面试官!

2022-10-20 22:39:27 1505

原创 MySQL各种join算法的优劣势

深入分析Join在MySQL中的底层实现原理以及MySQL的各种join语句使用的连接算法。在没有索引和有索引的情况下分别使用什么算法以及优劣势是什么。Hash join如何提高连接速度。基于索引的Join能有多快?到底在实际互联网业务开发中可以使用Join吗?

2022-09-24 16:54:24 820

原创 RocketMQ MappedFile 存储原理 文件预热原理

RocketMQ使用MappedFile对象管理磁盘CommitLog、ConsumerQueue文件,使用mmap函数减少数据在用户态和内核态间的拷贝次数和上下文切换。并且对高并发的发送MSG场景使用文件预热和提前创建文件,来避免发送消息时的性能抖动...

2022-09-01 17:24:12 940

原创 Hystrix源码分析

Hystrix是分布式系统中用来做服务隔离的框架。它有限流、降级、熔断的功能,用来做依赖服务的隔离,比如订单服务响应时间很高时或者挂掉,本服务限制请求数或者对订单服务的接口降级保证本服务的稳定性。我们会通过源码分析:Hystrix的基本属性配置、熔断器和线程池的初始化、command的执行流程、熔断器如何工作、command超时监控的原理。看完这篇文章,会对Hystrix原理有更深刻理解。

2022-08-24 17:49:13 2215

原创 MySQL死锁 预防分析解决死锁

​本篇文章根据官网文档的例子,学习死锁是如何发生的,以及如何预防和解决死锁。死锁发生的例子MySQL的死锁检测降低和处理死锁

2022-08-16 19:00:50 1455

原创 Redis AOF源码分析

文章会从Redis源码硬核解析AOF的持久化原理。对面试和工作功力增长不少。1.aof文件数据什么时候写入的?2.aof文件刷盘的真实执行过程。3.aof文件重写执行过程(混合持久化怎么做的)

2022-08-13 13:04:54 3603

原创 深入源码分析Redis ZSet、ziplist、skiplist数据结构

深入Redis源码学习底层数据结构:ZSet、Ziplist、SkipList。本篇文章会从源码和数据结构图的方式,解析ziplist、skiplist两大数据结构的关键实现。

2022-08-05 15:09:29 1295

原创 深入源码分析Redis Dict数据结构

翻看Redis源码,解析Redis底层数据结构,哈希表的实现。Dict是Redis中最高频使用的数据结构,没有之一。Key-Value对也是基于Dict实现。甚至Redis本身就是一个大的好几个哈希表的结构体,分别用来保存所有k-v,带过期时间的k-v,监控事务的k-v。从源码角度解析哈希表的实现,以及渐进式rehash是怎么回事,它的优势和劣势是什么......

2022-08-02 23:58:27 326

原创 深入分析Redis网络多路IO复用以及底层原理

老早听说过Redis是单线程,但指的是什么单线程,为什么单线程,底层实现原理是什么?单线程指的是Redis中处理网络请求的模块是单线程处理的,并非指整一个Redis软件都是单线程,肯定有其它线程做其它事情。比如命令的执行等... 执行命令的线程称为worker thread(工作线程)也是一个线程,因为Redis的命令都是读写基于内存的操作,速度非常快,单线程足以应付内存读写,如果引入多线程读写内存先不说效率是否提升,但是会涉及并发安全问题。...

2022-08-02 17:53:43 487

原创 SpringBoot自动配置原理

debug源码看看SpringBoot如何自动装配的从一开始启动类因为注解了@SpringBootApplication就被当做配置类,传递到配置类处理器ConfigurationClassPostProcessor。调用CongigurationClassParser.parse()开始作为入口,开始解析启动类包下的托管bean,通过@ComponentScan扫描指定路径的托管bean,以及自动装配的核心AutoConfigurationSelectorImport。实际的解析配置类的工作是Con.

2022-07-31 16:17:09 215

原创 Spring事务原理 如何增强、回滚、提交

Spring的事务机制提供两种应用方式:声明式事务和编程事务。声明式事务包括xml配置文件和@Transactional注解。在实际项目开发中用注解是最多的,所以这里也以声明式事务为例讲解。不过两种事务的底层逻辑大多一致。整个事务生效的工作原理应分为两大部分:1.让事务方法所在的类生成代理对象,是在哪里做的?什么时候做的?2.代理对象的事务方法如何生效的,涉及开启事务,回滚,提交。解答两个大问题前,先了解xml中如何让spring开启事务管理机制。...

2022-07-31 15:08:19 877

原创 Spring AOP原理 应用增强创建代理

​经过上篇的长篇大论分析Spring AOP原理 收集切面和实例化增强器_Alan CGH的博客-优快云博客,我们知道了Spring是如何收集切面类并把其中的增强方法封装成增强器的。然后筛选出适用于bean的增强器数组返回。其实上一篇写的太过细节了,本篇不会再深入细节,重点放在逻辑流程上。整个AOP代理对象的工作入口发生于AbstractAutoProxyCreator类,它同时是InstantiationAwareBeanPostProcessor,在bean的加载过程中的bean实例化前......

2022-07-28 18:55:24 476

原创 Spring AOP原理 收集切面和实例化增强器

文章解析以下内容,Spring AOP原理:1、框架如何搜集到所有切面类2、如何解析切面类中的切点规则3、如何去匹配所有被任意切点命中的bean4、如何运用通知增强目标方法

2022-07-28 17:23:30 699

原创 Spring IOC原理 Bean实例化、依赖注入和循环依赖解决

IOC Inverse Object Control 对象控制反转。Spring框架的最大特性,分离对象的维护控制工作,帮助工程师专注业务逻辑的实现。整个Spring体系甚至其它整合的框架都是基于IOC容器实现,因为都需要Spring管托Bean。本章要叙述Bean加载过程,IOC的实现原理就是Bean的加载过程。会涉及到:1.Bean的实例化2.循环依赖的解决3.依赖属性的注入4.对Bean应用前置、后置处理器,Aware接口5.衔接AOP的入口,对Bean应用动态代理......

2022-07-27 18:30:10 857

原创 Spring IOC原理 Bean标签解析和Definition封装

IOC Inversion of Control 控制反转,关键实现是DI Dependency Injection,就必然涉及到有一个容器保存系统中所有托管的bean。那么Spring是如何找到这些托管的bean呢?关键有以下几步:1.读取xml配置文件转换成Resource(现在流行的SpringBoot是另一套体系,但底层应该还是脱离不了Spring)2.利用XAS框将Resource解析成Document对象,方便对各种标签的解析提取3.解析Document对象,封装成BeanDefinit

2022-07-25 23:25:19 306

原创 网络编程,BIO到NIO,从Java代码角度理解

BIO Blocking IO在Java中 java.io 包下就是同步阻塞式IO,代表有InputStream OutputStream Reader Writer等,核心思想是面向流编程。NIO Non Blocking IOjava.nio 包下的新IO模型,为了解决传统IO带来的同步阻塞低效问题。但是今天不讲文件流的IO,今天面向的是网络IO,从这个角度理解下BIO到NIO的发展,以及操作系统底层epoll技术在Java的实现。...

2022-07-22 13:18:45 170

原创 AbstractQueuedSynchronizer 工作原理 JDK8

AbstractQueuedSynchronizer 是Java中有名的同步队列器,提供同步锁支持,包括共享同步锁,排它同步锁。还支持尝试获取锁机制(毫秒值),如果线程不能立即获取锁,还提供阻塞等待唤醒机制。ReentrantLock的Sync NonSync就是由AQS实现的。acquire(int arg) 是AQS对外提供的获取独占锁的重要方法,实际获取锁的逻辑交给用户的自定义同步器实现,获取锁失败后的阻塞队列逻辑则由AQS实现。.........

2022-07-22 12:58:52 318

原创 FutureTask原理 JDK8

FutureTask类是并发编程的一个代表异步计算任务类,提供异步计算任务的封装以及异步计算结果的返回。本身实现Runnable接口,可以直接提交给线程池执行。不过更多应该是配合Callable使用,因为要用到Callable.call()返回的结果封装在自己的outcome变量。那为什么有了Callable还要用这个类?因为它提供了获取异步计算结果的机制,如果任务没执行完会阻塞获取线程等待任务结束。省去了工程师自己管理的流程。本文基于JDK 8源码分析。FutureTask已经不依赖A.

2022-07-21 18:04:18 833

原创 ReentrantLock原理 JDK8

ReentrantLock (简称RS)是区别于 synchronized 的一种锁技术,特性有 等价于 synchronized 的 lock、可重入锁、公平锁与非公平锁、读锁与写锁、Condition对象等等......RS应该在同步性能上与synchronized 到底孰优孰劣,未知。不过由于 RS基于 volatile 变量 state 实现锁的机制,而 synchronized 是基于JVM的 mointer 对象实现的锁机制(偏向锁、轻锁不再考虑范围内)。各位可以自己推敲或试验下。...

2022-07-21 17:54:09 312

原创 volatile关键字的使用心得

在读一篇文章的时候,作者对volatile的使用场景就生动解释了它的使用误区:不要在依靠volatile变量现有值的情况下对其自身做修改其实就是不要拿volatile变量做多步骤的操作就是了。volatile变量单纯的读或写操作是可以的,例如:volatile int count = 1;单纯的写操作,直接将value赋值给count,不用读取count变量。这种操作相等于带锁的原子操作,因为其本身就是不可再分割的最小操作了。...

2022-07-21 17:21:20 163

原创 Thread类黑魔法原理

Thread类是Java中线程的抽象,是OS线程的一对一映射。Thread本身提供一些基础的并发控制API,利用它可以做基本的线程交互通信。将学习到 wait() notify() join() sleep() interrupt() 方法的原理Java中线程状态流转图可以看到Java的线程状态对比OS实际上是少了一个running的。JVM把running和ready状态合并成了runnable状态。可能由于Java属于上层应用通常不需要关注到线程当前的调度细分状态,设计者把运行中的状态

2022-07-21 17:14:17 136

原创 优雅关闭线程池

是在最后一个工作线程退出时会执行processWorkerExit,调用tryTerminate,先将状态推进到tyding,表示线程池正在清理中。shutdownNow方法将状态从running->stop,此时中断所有线程无论是否空闲还是工作中,抽出队列所有任务待返回给用户。shutdown方法将线程池状态从running->shutdown,这个状态下会拒绝所有提交的任务,直接调用拒绝策略。会开一个线程执行回调,并且等到钩子函数执行完毕JVM才会kill所有线程然后退出。会尝试中断所有空闲线程。...

2022-07-17 17:39:40 1008 3

原创 线程池工作原理 ThreadPoolExecutor源码解析

会详细的分析源码,并通过注释应该要理解:1、线程池如何执行用户提交的任务。2、线程池创建线程的工作流程。3、线程池如何复用线程。4、线程池如何保证空闲线程生存指定的时间后被销毁。5、线程池销毁的工作流程。6、动态修改corePoolSize...

2022-07-17 17:37:35 195

原创 ConcurrentHashMap源码分析

文章深入分析了get函数,put函数和remove函数,以及并发扩容过程。ConcurrentHashMap的一半精华在于并发扩容,多个线程是如何协作加速迁移哈希槽中的元素。

2022-07-17 16:58:13 237

原创 ThreadLocal 源码 JDK8

ThreadLocal的学习一开始是比较绕的,慢慢的看源码思考,后来就能习惯了。对于学习这个类的使用,我们必须搞清楚三者之间的关系:ThreadLocalThreadLocalMapThreadThreadLocalMap是作为一个内部静态类嵌套在ThreadLocal中的,而当它具象化时(也就是new了)它作为对象存在后,又会被Thread持有引用(地址或指针)。...

2022-07-17 16:53:58 280

原创 位图,BitSet分析

n%8n&7n模8意思取8的余数,将n分为8个一组,剩下不够8个的作为余数。一个数如果有8的余数必定会出现在低3位中,即1~7,都可以中低3位表示出来,所以在低3位留1,高位全0,与运算后就会保留下8的余数。n/8等于n被分成了多少组,159/8=19(向下取整)排第159的数字被分到第19组。n%8得到的余数代表n这个数字在那一组的组内排号,如159%8=19......7代表159在第19组中的第7个位置。...

2022-07-17 16:49:39 141

原创 HashMap源码分析

HashMap源码分析解读,JDK8版本。深刻理解put、get函数,扩容的过程以及哈希表为什么一定要以2的幂次方扩容,这样做有什么好处?

2022-07-17 16:44:28 226

原创 Cglib代理如何生成的及工作原理

Cglib是一个高效的动态代理方式,并且在SpringBoot中默认的代理实现方式。本片文章会分析Cglib是如何生成代理对象、代理对象如何执行相应的目标函数、及和jdk代理有什么区别。validatedClasses是静态容器,是对在系统中所有通过cglib创建的目标对象中是否有finalmethod的检查。因为Cglib代理在继承目标对象时要复写所有函数,不可以复写final修饰的函数。在构建代理对象时通过通知规则来配置。这个通知规则包含了通知器和通知方法。}......

2022-07-17 16:28:49 2517

原创 JDK动态代理学习

探索原理之前需要明白JDK动态代理如何使用,首先需要自定义一个调用处理器对象h,这个h将会是连接代理对象和目标对象的中间桥梁,它决定了调用目标对象之前需要做一些什么事情,调用什么方法等等...使用的时候像这样子,虽然InvocationHandler接口没有强制要求定义构造函数接收目标对象,但一般为了桥接目标对象肯定得拿到它的引用,除非你用代理类来做其他事情,不需要目标对象。......

2022-07-17 16:08:07 234

空空如也

空空如也

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

TA关注的人

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