自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-03-01 17:19:35 83

原创 RocketMQ存储原理 CommitLog解析

RocketMQ作为消息队列中间件,肯定有消息存储的机制,毕竟提供高可靠的消息投递功能,at least once保证每条消息至少被消费一次。本文章会解析CommitLog的几个核心工作原理。

2022-10-20 22:39:27 1175 1

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

MySQL的各种join语句使用的连接算法,在没有索引和有索引的情况下分别使用什么算法以及优劣势是什么。Hash join如何提高连接速度。基于索引的连接能有多快?

2022-09-24 16:54:24 600

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

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

2022-09-01 17:24:12 680

原创 Hystrix源码分析

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

2022-08-24 17:49:13 1817

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

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

2022-08-16 19:00:50 1188

原创 Redis AOF源码分析

Redis的持久化分为RDB和AOF,各有优缺点。本篇文章会解析几个问题,帮助深入理解AOF机制的实现原理和细节。1.aof文件数据什么时候写入的?2.aof文件刷盘的真实执行过程3.aof文件重写执行过程(混合持久化怎么做的).........

2022-08-13 13:04:54 3434

原创 Redis 解析ZSet、ziplist、skiplist关键源码

Redis的几大数据结构之一的ZSet实现的就是Ordered Set有序集合,通常在实际业务开发中ZSet也是较为高频使用的数据结构,可以用来实现排行榜、有序队列等应用。ZSet本身根据以下2个变量控制底层数据结构的选用,底层有ziplist和dict+skiplist的实现方式。本篇文章会从源码和数据结构图的方式,解析ziplist、skiplist两大数据结构的关键实现。可以了解到ziplist为啥节省内存空间,skiplist为啥查找和插入、删除都是log(n)时间。.........

2022-08-05 15:09:29 1182

原创 Redis数据结构 Dict源码解析

解析Redis底层数据结构,哈希表的实现。redis本身就是一个大的好几个哈希表的结构体,分别用来保存所有k-v,带过期时间的k-v,监控事务的k-v。从源码角度解析哈希表的实现,以及渐进式rehash是怎么回事,它的优势和劣势是什么......

2022-08-02 23:58:27 241

原创 Redis网络多路IO复用以及底层原理

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

2022-08-02 17:53:43 375

原创 SpringBoot自动配置原理

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

2022-07-31 16:17:09 159

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

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

2022-07-31 15:08:19 673

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

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

2022-07-28 18:55:24 383

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

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

2022-07-28 17:23:30 537

原创 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 648

原创 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 217

原创 网络编程,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 113

原创 AbstractQueuedSynchronizer 工作原理 JDK8

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

2022-07-22 12:58:52 213

原创 FutureTask原理 JDK8

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

2022-07-21 18:04:18 649

原创 ReentrantLock原理 JDK8

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

2022-07-21 17:54:09 235

原创 volatile关键字的使用心得

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

2022-07-21 17:21:20 127

原创 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 91

原创 优雅关闭线程池

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

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

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

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

2022-07-17 17:37:35 131

原创 ConcurrentHashMap源码分析

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

2022-07-17 16:58:13 192

原创 ThreadLocal 源码 JDK8

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

2022-07-17 16:53:58 192

原创 位图,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 69

原创 HashMap源码分析

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

2022-07-17 16:44:28 172

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

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

2022-07-17 16:28:49 2063

原创 JDK动态代理学习

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

2022-07-17 16:08:07 146

原创 String对象和常量池 intern可以干点什么

有一个使用场景,缓存没有数据时异步查询DB数据,为了避免大流量查询DB,需要在JVM中保证一个活动只放一个线程去查,这样并发查询的数量,对于一个活动来说,就是JVM实例的数量,一般也就十几台就是十几个并发。还有就是HashCode,HashCode是判断两个对象是否完全相等的核心条件,另外,像Set、Map结构中的key值也需要用到HashCode来保证唯一性和一致性,因此不可变的HashCode才是安全可靠的。这个锁对象要求所有的活动id使用同一个,刚好符合String常量池。.........

2022-07-17 15:30:07 153

原创 打印异常栈信息的过程和影响

在我们自己实际案例中也有,转转卖场双十一压测时,发现一个接口耗时偏高500ms+,经排查是打印大量日志(一次打印2个屏幕的量)。回到输出异常信息的地方,看到s.lock(),s是System.err的包装类,System.err是一个PrintStream对象。在别人的优化案例中也提到了大量日志输出会增加服务压力,首先大量日志打印造成大量线程争抢PrintStream流的独占锁,线程需要调用线程栈信息。所以回到一开始的场景,avenger框架屏蔽RPC异常超时的接口的异常栈信息打印而是换成自定义异常打印。.

2022-07-17 15:11:44 803 3

空空如也

空空如也

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

TA关注的人

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