自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蒋蒋

生如蝼蚁当立鸿鹄之志,命如纸薄应有不屈之心。

  • 博客(134)
  • 资源 (4)
  • 收藏
  • 关注

原创 Spring属性间循环依赖抛BeanCurrentlyInCreationException

Spring属性间循环依赖抛BeanCurrentlyInCreationException背景场景重现问题分析总结背景大家都知道Spring解决不了构造之间的循环依赖,但是可以解决属性间的循环依赖。举个简单例子:@Servicepublic class AAService { @Autowired private BBService bbService; void printAA(String value){ System.out.println("AA pri

2021-08-25 14:38:01 636 2

原创 Mysql索引优化导致死锁问题

MySQL索引优化导致死锁问题的原因和解决方式

2024-02-27 15:36:42 864

原创 分布式事务

分布式事务什么是分布式事务事务特性分布式事务实现方式AT模式2PC:二阶段提交3PC:三阶段提交TCC模式Saga模式XA模式什么是分布式事务分布式事务就是在分布式系统中实现事务功能的操作,它是由多个本地事务组成的一个大事务。事务特性我们知道事务有4个非常重要的特性,即我们常说的(ACID)。Atomicity(原子性):是说事务是一个不可分割的整体,所有操作要么全做,要么全不做;只要事务中有一个操作出错,回滚到事务开始前的状态的话,那么之前已经执行的所有操作都是无效的,都应该回滚到开始前的

2021-09-08 16:32:21 300

原创 数据结构:跳跃表

跳跃表为什么跳跃表?有序表的搜索跳表跳表的搜索跳表的插入K值的大小跳表实现前一段时间在看《Redis的设计与实现》,发现Redis中的ZSet数据类型就是采用跳跃表实现的(zSkipList)。后来看到levelDB中也使用了跳跃表。另外Skip List是在有序链表的基础上进行了扩展,解决了有序链表结构查找特定值困难的问题,查找特定值的时间复杂度O(logn),他是一种可以代替平衡树的数据结构。为什么跳跃表?目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等

2021-08-26 15:09:52 301

原创 Dubbo源码:SPI使用和原理

Dubbo源码:SPI使用和原理SPI简介SPI示例SPI源码分析Dubbo SPI 扩展能力分析SPI简介SPI是 Service Provider Interface,是一种服务发现机制,主要用于框架中,框架定义好接口,不同的使用者有不同的需求,因此需要有不同的实现,而 SPI 就通过定义一个特定的位置,存放这些实现,在运行的时候去加载这些实现。Java SPI 约定在 Classpath 下的 META-INF/services/目录里创建一个以接口命名的文件,然后文件里面记录的是这个接口提供的

2021-08-24 16:38:50 159

原创 Mybatis插件原理

Mybatis插件原理插件简介插件的使用源码分析总结插件简介MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实是拦截器的功能,实现方式就是在拦截器的责任链中添加一个Interceptor。MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushStatements, commit, rollback,getTransaction, close, i

2021-08-11 11:27:20 186 1

原创 Mybatis SQL数量限制插件

Mybatis SQL数量限制插件插件背景插件功能支持灵活配置插件支持个别特殊方法插件效果不生效插件代码总结插件背景起因是一次线上事故,现有项目对数据库的操作依赖编码者自己的行为规范,有可能出现考虑不当对全表进行查询,数据量极大的情况会引发频繁GC带来一系列的问题为了避免该问题,基于mybatis开发一个插件,默认限制查询的条数,默认开启该功能,默认1000条。插件功能支持灵活配置插件可以通过配置application.properties文件中的配置,灵活控制插件,如果有接入动态配置中心,同样

2021-08-10 14:49:10 1360

原创 TCP三次握手四次挥手

前言最近在看网络方面的知识,对于TCP的三次握手和四次挥手,一直感觉不是很理解,在知乎上了这篇文章,感觉挺好的,所以转一下。知乎原文链接很久很久以前,还没有互联网,大家通信主要靠写信。小扎和小美是高中同学,互相有好感,大学两个人去了不同的城市上学。小扎在大学感到了空虚寂寞冷,鼓起勇气写信向小美表白。小扎寄出去信后,心里一直很紧张,又怕万一地址不对,信寄不到怎么办呢? 小美收到小扎的信后,按耐不住心中的惊喜,这个小扎终于开窍了啊。于是马上回了一封信,小美也担心小扎收不到信,提醒小扎收到信后马

2021-07-28 17:30:51 83

原创 MySQL 普通索引和唯一索引的区别

MySQL 普通索引和唯一索引的区别查询操作更新操作索引不管是工作还是找工作都是必须要掌握的一个知识,下面来学习一下普通索引和唯一索引的区别。当然在使用上就能体验出来,唯一索引也是索引功能和普通索引一样,只是在插入的时候会校验数据的唯一性。这两类索引在查询能力上是没差别的,主要是对更新性能的影响。建议尽量选择普通索引。查询操作普通索引查找到第一个满足条件的记录后,继续向后遍历,直到第一个不满足条件的记录。唯一索引由于索引定义了唯一性,查找到第一个满足条件的记录后,直接停止继续检索。普通索引

2021-07-22 15:31:35 239

原创 RocketMQ顺序消息和保证顺序原理

RocketMQ顺序消息和保证顺序原理简介RocketMQ顺序消息实现顺序消息1.消息同步发送2.重新选择器3.消费者端顺序消息原理简介顺序消息作为MQ的一个很重要的功能,一定要只能它是怎么使用的,并且要知道它设计思路如何?下面就根据优秀的RocketMQ源码来看下它是怎么实现消息顺序的。RocketMQ顺序消息首先你要知道RocketMQ的存储模型,根据Broker的存储模型可以知道,一个topic的消息队列是维护在多个Broker的多个queue队列中,所以如果要保证多个Broker的多个que

2021-07-15 17:53:04 1332 1

原创 RocketMQ存储模型

RocketMQ存储模型简介存储模型CommitLogConsumerQueueIndexFile总结简介RocketMQ有Producer、Consumer、NameSrv、Broker四个部分。其中Broker用于存储消息,维护消息队列和订阅关系,是RocketMQ四个部分中最重要的一个部分,并且RocketMQ的高性能就是依赖于Broker模块的底层存储模型实现的。所以搞清楚Broker的存储模型是学习RocketMQ最重要的一步。存储模型下图就是RocketMQ消息和一些配置的磁盘文件目录:

2021-07-09 15:23:12 307

原创 Redis原理笔记

Redis原理数据类型底层数据结构数据结构StringListHashZSetSet数据对象数据库过期键删除策略RDB持久化AOF持久化学习《Redis设计与实现》的一些关键点笔记。点击下载:《Redis设计与实现》提取码: 2hur数据类型底层数据结构数据结构动态字符串(sds )链表(list)字典(dict)跳跃表(skipList)整数集合(intSet)压缩列表(zipList)StringString ->sdsListList -> list-&gt

2021-06-24 17:06:22 152

原创 Arthas神器:定位线上问题和反编译内存class文件

Arthas神器简介安装选择进程dashboardthread反编译内存中class文件简介Arthas(阿尔萨斯)是Alibaba开源的Java诊断工具,可以在很多复杂场景下快速定位问题。Arthas主要可以帮助我们解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下

2021-05-30 16:35:06 1450

原创 Dubbo源码:集群容错

Dubbo源码:集群容错大致流程FailoverClusterInvoker:失败切换FailbackClusterInvoker:失败恢复FailfastClusterInvoker:快速失败FailsafeClusterInvoker:失败安全ForkingClusterInvoker:并行调用多个服务提供者BroadcastClusterInvoker:会逐个调用每个服务提供者大致流程消费者在生成代理对象后,调用RPC服务的方法,会执行代理对象的方法,因为创建代理对象的时候会传入一个Invocat

2021-05-26 16:27:24 110 2

原创 Spring源码:事务

前言首先,上一篇我大致分析了一下AOP的实现原理:Spring源码:AOP我们都知道Spring的事务是基于AOP实现的,所以要明白事务的话首先要了解AOP的原理。下面我们就看看一些事务的基础知识吧!事务隔离级别Spring事务隔离级别比数据库事务隔离级别多一个defaultDEFAULT (默认)这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。READ_UNCOMMITTED (读未提交)

2021-04-25 19:21:13 122

原创 Mysql:主从复制和读写分离

Mysql:主从复制和读写分离主从复制条件首先要完成主从复制,至少要有两台机器,一主一从。master和slave建立主从关系。可以通过配置来设置。# 创建从数据库的masterbackup用户和权限mysql> grant replication slave on *.* to masterbackup@'192.168.17.%' identified by '123456';## 从数据库连接masterchange master to master_host='192.16

2021-04-23 15:34:17 83

原创 Spring源码:AOP

Spring源码:AOPAOP开启AOP生成AOP代理对象调用代理后对象方法AOP开启AOP@EnableAspectJAutoProxy这个注解里会用@Import导入AspectJAutoProxyRegistrar,这个registrar其实它主要的功能就是注册AnnotationAwareAspectJAutoProxyCreator这个类。这个类是一个BeanPostProcessor。@Target(ElementType.TYPE)@Retention(RetentionPol

2021-04-20 18:11:44 116

原创 MYSQL:MVCC

MVCCMVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,可以实现对数据库的并发访问。MVCC带来的好处是?多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的事务ID,为每个修改保存一个版本,版本与事务ID关联,读操作只读该事务开始前的数据库的快照。 所以MVCC可以为数据库解决以下问题在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据

2021-04-19 18:07:59 130

原创 项目问题:线程池使用FutureTask得不到抛出的错误

线程池使用FutureTask得不到抛出的错误一、使用Threadpublic static void main(String[] args) { Test test = new Test(); FutureTask futureTask = new FutureTask<>(test); Thread thread = new Thread(futureTask); thread.start(); try {

2021-04-18 16:35:06 1189 2

原创 项目问题:log.info()导致CPU飙升

项目问题:log.info()导致CPU飙升在做需求的时候

2021-04-18 15:52:38 2157 2

原创 SpringAop源码解析

SpringAop源码解析下面的源码解析是使用的5.3.4版本的注解式开发。@EnableAspectJAutoProxy我们都知道注解式开发只需要在配置类上添加@EnableAspectJAutoProxy注解就能开启我们AOP功能,那下面的分析就以它为切入点分析AOP源码。源码:@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Import({AspectJAutoProxyRegistra

2021-04-13 18:12:43 77

原创 二叉树

二叉树定义private static class Node<E> { E element; Node<E> left; Node<E> right; Node<E> parent; public Node(E element, Node<E> parent) { this.element = element; this.parent = parent; } public boolean isLeaf() { ret

2021-04-11 13:57:34 87

原创 BlockingQueue实现源码

1. 前言BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,它们的区别主要体

2021-04-09 16:14:41 163

原创 五种IO模型

从TCP发送数据的流程说起要深入的理解各种IO模型,那么必须先了解下产生各种IO的原因是什么,要知道这其中的本质问题那么我们就必须要知一条消息是如何从过一个人发送到另外一个人的;以两个应用程序通讯为例,我们来了解一下当“A”向"B" 发送一条消息,简单来说会经过如下流程:第一步:应用A把消息发送到 TCP发送缓冲区。第二步: TCP发送缓冲区再把消息发送出去,经过网络传递后,消息会发送到B服务器的TCP接收缓冲区。第三步:B再从TCP接收缓冲区去读取属于自己的数据。根据上图我们基本上了解消息发

2021-04-09 14:57:55 109

原创 JDK8系列之LongAdder解析

JDK8系列之LongAdder解析前言源码解析longValue()increment()总结前言最近公司的项目在陆续升级jdk8,正好想起之前有人问我的jdk8中新增的LongAdder类和AtomicLong的区别,就忍不住想探究一番。源码解析首先看一下类的定义public class LongAdder extends Striped64 implements Serializable然后来看一下类的属性和方法这里让我困惑的一个问题是LongAdder中没有类似于AtomicLon

2021-04-07 14:38:33 104

原创 Java数据脱敏框架

数据脱敏框架可以解决脱敏实体对象的循环依赖(控制遍历的深度),和实体相互引用的脱敏。实现定义敏感类型/** * 敏感数据类型 * @author jiangwenjie * @date 2021/1/26 */public enum EnumSensitiveType { /** * 标志这个是一个需要脱敏的实体类 */ ENITTY_CLASS, /** * 中文名 */ CHINESE_NAME, /**

2021-02-05 16:17:34 1745 3

原创 【ElasticSearch】查询优化

【ElasticSearch】查询优化前言优化方案File Cache数据预热冷热分离业务设计查询语句查询Fetch Source优化调整filter过滤顺序索引时间精度优化索引优化,合理使用keyword类型reIndex索引禁止深分页查询前言最近做了一个需求当天申请数量限制的一个需求,需要查询用户当天的数据,因为数据规模还是蛮大的,而且每天的访问量就是主业务主流程的量,所以考虑从es中查询,但是压测之后发现耗时400~600ms,这坑定不能接受,所以就有了下面的优化之路。优化方案File Cac

2020-12-30 16:43:30 1572 1

原创 有用开源项目

商城H5的商城+后台管理:https://github.com/jiangdoc/r-mall

2020-12-02 11:48:47 58 1

原创 @Conditional、ConditionalOnClass和ConditionalOnBean注解

Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。本章大纲:(1)例子说明(2)编码思路(3)编写条件类WindowCondition和LinuxCondition(4)编写接口CmdService以及两个实现类(5)编写配置类,根据条件进行注入不同的类(6)编写测试代码(7)Spring提供的Condition(8)题外话:怎么在Condition中获取application.properties的配置项接下里看下具体的内容:

2020-11-25 14:59:36 825 3

原创 Spring Boot Actuator简介+自定义

Spring Boot Actuator:配置使用Spring Boot Actuator简介Demo添加依赖添加配置启动应用详细配置暴露Endpoint启用Endpoint内置EndpointmetricsPrometheus端点实现原理Spring Boot Actuator简介Spring Boot Actuator是帮助我们监控和管理Spring Boot应用的一个程序。比如健康检查、审计、统计和HTTP追踪等。这些监控数据我们可以通过HTTP或者JMX轻松获取到。Actuator同时还可以与

2020-11-20 10:55:49 1183 2

原创 彻底搞定Mysql索引

彻底搞定Mysql索引1. 聚簇索引2. 二级索引以前写过一篇关于Mysql的文章,但是只是介绍一下索引的用法,也总结了一些mysql索引类型的区别,但是总是感觉不够详尽,也没有详细了解我们创建一个索引Mysql的存储引擎到底做了什么?下面就通过这篇文章,把Mysql索引一网打尽。首先要知道Mysql的磁盘存储方式,如果不懂的话,那你需要先看下我的另一篇文章:MySQL磁盘存储1. 聚簇索引2. 二级索引...

2020-09-08 19:34:44 492 2

原创 MySQL的磁盘存储

MySQL服务器上负责对表中数据的读取和写入工作的部分是存储引擎,而服务器又支持不同类型的存储引擎,比如InnoDB、MyISAM、Memory啥的,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,真实数据在不同存储引擎中存放的格式一般是不同的,甚至有的存储引擎比如Memory都不用磁盘来存储数据,也就是说关闭服务器后表中的数据就消失了。由于InnoDB是MySQL默认的存储引擎,也是我们最常用到的存储引擎,我们也没有那么多时间去把各个存储引擎的内部实现都看一遍,所以本集要唠叨的是使用InnoDB作

2020-09-08 19:33:55 1335

原创 Springboot启动流程

Springboot启动流程开始目录构造ConfigurableApplicationContext 对象实例推断当前应用类型现在大部分公司都在使用springboot开方项目,由于springboot的开发步骤简单方便,大部人都会使用,但是对于springboot的启动流程大部分初级开发人员并没有了解多少,下面就会以这篇文章稍微细致的分析下springboot的启动流程。开始下面一个非常简单常用的例子开始:@SpringBootApplicationpublic class TestApplic

2020-09-02 17:51:34 97

原创 SpringBoot启动流程:创建Environment

Environment组成首先,Environment是Spring3.1才提供的一个接口。它是对当前运行的应用程序的环境的抽象,下面我们了解一下它的组成。先看下uml类图:Environment由两部分组成1)profilesprofile中文直译是"概述"、“简介”、"轮廓"的意思,但在使用spring开发应用程序的时候,我们对profile的认识更亲切的是用在划分多环境的时候。通常,我们会将profile划分成如:开发、测试、预生产、生产环境。每个环境会有有些bean不同、配置不同等。每

2020-09-02 16:06:56 839

原创 Springboot启动流程:SpringApplication.run()方法核心逻辑

在上一篇文章【构造SpringApplication实例对象】中我们分析了SpringApplication的构造方法,但是SpringApplication.run()需要返回ConfigurableApplicationContext对象实例,所以下面来一起看下run()中的逻辑。run方法的代码有点长我们将抛弃掉一些比较次要的内容:public ConfigurableApplicationContext run(String... args) { // 声明一个Context容器

2020-09-02 16:04:33 946

原创 Springboot启动流程:构造SpringApplication实例对象

Springboot启动流程:构造ConfigurableApplicationContext对象推断当前应用类型设置初始化器、监听器推断当前main方法所在的主类总结springboot项目从一个main方法开始,main方法将会调用SpringApplication的run方法开始springboot的启动流程。所以,本文即从构造SpringApplication对象开始。下面来一起看下run():public static ConfigurableApplicationContext run(C

2020-09-02 10:58:42 376

原创 CountDownLatch源码解析

CountDownLatch源码解析在学习CountDownLatch之前,首先需要对AbstractQueuedSynchronizer也就是AQS有一定的理解。如果对AQS不是太熟悉的可以看下我的另一篇文章:下面我们也会先从AQS说起,如果已经对AQS的源码已经有了一定的理解,可以跳过前面AQS部分。...

2020-08-26 17:15:12 202

原创 ReentrantLock源码解析

ReentrantLock源码解析acquireReentrantLock的原理图ReentrantLock就是使用AQS而实现的一把锁,可以通过构造函数设置为公平锁和非公平锁。它有一个内部类用作同步器是Sync,Sync是继承了AQS的一个子类,并且公平锁(FairSync类)和非公平锁(NonFairSync类)是继承了Sync的两个子类如下图。ReentrantLock的原理是:假设有一个线程A来尝试获取锁,它会先CAS修改state的值,从0修改到1,如果修改成功,那就说明获取锁成功,设置加锁

2020-08-26 17:12:53 200

原创 Future源码解析

Future源码解析FutureDemo执行任务分析获取结果分析Future简单来说就是利用线程达到异步的效果,同时还可以获取子线程的返回值。比如当做一定运算的时候,运算过程可能比较耗时,有时会去查数据库,或是繁重的计算,比如压缩、加密等,在这种情况下,如果我们一直在原地等待方法返回,显然是不明智的,整体程序的运行效率会大大降低。我们可以把运算的过程放到子线程去执行,再通过 Future 去控制子线程执行的计算过程,最后获取到计算结果。这样一来就可以把整个程序的运行效率提高,是一种异步的思想。De

2020-08-04 11:57:47 647

原创 Nginx面试题及答案

Nginx是什么?Nginx (engine x) 是一个由c语音编写的高性能的HTTP和反向代理web服务器可以用来做什么?1、 http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。2、 虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。基于端口的,不同的端口基于域名的,不同域名3、 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多..

2020-07-15 16:49:05 1753

反编译工具包三件套.rar

android反编译三件套:apktool 、dex2jar、jd-gui :在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看。下面是我参考了一些文章后简单的教程详解。

2020-01-01

rpc-example.rar

Java实现的RPC框架,主要用到的技术有: 1. 动态代理:jdk的动态代理。 2. 序列化和反序列化:java的序列化。 3.网络通信:socket通信(BIO方式)。 4. 反射、注解

2019-07-15

仿网易云音乐的微信小程序

仿网易云音乐的微信小程序,可看图片介绍:https://blog.csdn.net/jiang18238032891/article/details/89574844

2019-04-26

2018最新省市区乡镇Mysql数据库

2018/10/31最新的省市区乡镇的Mysql数据源码,是四张表,分别为provice、city、county、town,注意是mysql数据库

2019-03-16

空空如也

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

TA关注的人

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