自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis常用数据结构及应用场景的吐血整理

1. String数据类型:字符串常用操作:SET key value 存入键值对, SET覆写旧值,无视类型MSET key value [key value ...] 批量存储字符串键值对SETNX key value 存入一个不存在的键值对,若key存在,不做任何操作GET key 根据key获取key对应的value值MGET key [key ...] 批量获取...

2020-03-22 13:27:24 1372

原创 Seata初试采坑

背景:公司采用dubbo的分布式服务,现在业务上遇到了分布式事物的问题,和同事讨论改过几个分布式的开源框架,最终采用了seata,seata的性能相对比较客观,但是回滚情境下,性能下降特别厉害,这个与seata的网络IO和数据IO多次交互相关。具体各种分布式事物管理的开源框架推荐一篇文章可以参考:“若干分布式事务框架”与“我的偏见”( 测试/分析),此处我们部署搭建是最新的1.1.0版本。采坑...

2020-03-13 15:14:54 9821 8

原创 【MySQL】MVCC机制

MVCC机制理解

2022-01-30 17:00:40 2141

原创 图解Spring循环依赖

1. 什么是循环依赖循环依赖就是循环引用,也就是两个或者两个以上的Bean相互持有对方,行程闭环。比如:对象A依赖对象B,对象B又依赖A。如下图:2.Spring中循环依赖代码演示@Servicepublic class ProductService { @Autowired private OrderService orderService;}@Servicepublic class OrderService { @Autowired private ProductServi

2021-08-10 20:14:39 406

原创 图解Spring Bean 的生命周期

前情提要-阅读源码的感受 :这一段时间花了些时间去学习源码,从自己的主观感受来讲,阅读源码是一个非常需要耐心和总结的一个过程,因为源码的逻辑复杂性和扩展性,对于一些同学的学习门槛就会提高不少,作为经历过来的人来讲,为了缓解那些想读源码,但是又没有很好思路的同学的痛苦,我意识到通过图解的方式尽可能帮助你们度过入门门槛。图解Spring生命周期1. Spring生命周期主体核心流程2、SpringBean生命周期源码导读图解...

2021-07-24 11:52:32 364

原创 Spring IOC 注解BeanDefinition加载详解

示例代码@ComponentScan("org.springframework.examples")public class AnnotationConfigApplicationContextTest { public static void main(String[] args) { AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationC

2021-07-20 20:07:46 566 6

原创 Spring Security Oauth2源码BUG认证并发用户身份信息混乱问题

1.背景:随着业务的增长,线上系统qps越来越高,起初市场同事和客户偶尔会反馈用户看到的信息出现的不是自己的信息,但是重新刷新之后就好了,当时我们就对这个问题进行分析,但是都是无疾而终,没有找到问题所在,随着用户增长的基数越来越大,出现这个问题的现象也就更加频繁,所以我们团队对于这个线上事故就非常重视,开始对于整个请求链路分析,我们用户端使用的是一款我们自研的客户端,当时我们分析出来可能存在的几个原因:同一个客户端,不同用户登录,本地缓存的token混乱。客户端因为某种特定场景下拿到了别人的toke

2021-04-15 21:57:13 1997 3

原创 Spring项目中干掉if-elese,写出优雅代码

1.背景:在项目经常会遇到因为不同的条件执行不同的方法,当类型比较多的情况下,代码维护起来比较痛苦,并且会有大量的if-else判断。这样不管是后期的需求迭代还是别人接手代码,那都是相当的自闭。。。2.反面教材:首先我们先看下面一段代码,这边采用大量的状态if else 判定 if ("AType".equals(tier)) { Map<String, Object> mapPar = new HashMap<String, Object>(); mapPar.put(

2020-12-27 19:37:29 362

原创 dmesg命令查看java程序突然挂掉的原因

背景:JAVA服务线上毫无征兆的直接crash掉,打开日志查看,日志文件毫无相关挂掉的信息,所以当时直接选择了重启,当时的猜测是:服务内存不足导致程序进程直接挂掉?查找原因后来学习查找到一个命令dmesg命令,这个命令还是非常强大的。dmesg命令行实用程序用于在Linux和其他类似Unix的操作系统中打印和控制内核环形缓冲区。对于检查内核启动消息和调试与硬件相关的问题很有用。可以在服务器执行命令:# 按时间格式显示dmesg -T# 显示跟java 有关的日志dmesg -T |.

2020-07-19 13:50:50 2889 1

原创 彻底掌握HashMap的源码实现

概述HashMap是 Key-Value 对映射的抽象接口,该映射不包括重复的键,即一个键对应一个值。在HashMap中,其会根据hash算法来计算key-value的存储位置并进行快速存取。HashMap允许key和value为null

2020-06-08 20:16:20 265

原创 线程并发redisson使用遇到的坑

背景因为业务上的一个购买需求,需要对库存进行行程保护,防止超卖的出现(我们不是电商公司),经过调研,最终选择使用Redission来进行控制。主要因为Redission丰富的API,开源框架,已经被广泛应用于实际生产环境。...

2020-06-01 23:00:01 11224 6

原创 Spring自定义argumentResolver参数解析器从原理到实战

背景在web程序中,一个HTTP请求进来时,会被容器处理进而转换成一个servlet请求。http请求所携带的数据,虽然是格式化的但是无类型;而java作为强类型语言,同时为了健壮性考虑,必然要有完善的类型约束。那么,将数据从servlet请求中转换到java中,一个很原始的方式是手动处理。幸好,Spring MVC通过以注解往函数添加额外信息的方式,使得上述的数据转换过程能够交由框架自动处理。从一个角度去看,Controller中的函数声明及注解定义了此HTTP请求的数据格式和类型,也即规定了对外部.

2020-05-16 11:01:27 2442

原创 SpringMybatisPlus+ DynamicDataSource自定义封装

背景:产品已经上线,目前为了更好的查看线上数据,所以计划开发一套boss运营系统,供内部人员使用,boss系统需要建自己的一套数据表数据结构,初期本来想跟业务表放在一起,但是思前想后,Boss系统表结构和业务数据放在一个数据库不是很合理,所以前期采用动态数据源选择来加载或者操作合法数据。实现过程:1.编写application.yml --> mybatisplus配置,mysql多数据源配置。spring: application: name: @spring.app.

2020-05-16 10:52:40 1222

原创 精读LinkedList源码

概述LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢,另外它还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可当做堆栈,队列和双向队列使用。链表的介绍1.单向链表单向链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点。链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一.

2020-05-13 10:09:19 223

原创 精读分析ArrayList源码

概述ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要进行扩容(如果不指定容量初始容量为10 ,扩容后容量为原来的1.5倍),期间会涉及已经有的数据复制到新的存储空间。所以当从ArrayList的中间位置插入或者删除元素时,需要对数据进行复制、移动、代价比较高。因此,它适合随机查找和遍历,...

2020-05-06 18:05:45 277

原创 高效率的集合交集(差集)处理方式

我们在业务上难免会遇到集合交集的处理,这边总结了几种方式比较,然后寻求最优的方式。当然如果集合数据比较少的情况下,选取的方式基本都能满足需求,但是如果在数据量比较大的情况下呢?如果选取的方式不好,那么效率就会及其的低下。下面我们就集中方式展开分析。ArrayList原生接口retainAll(c)方式 public static void main(String[] args) {...

2020-05-06 18:04:13 1825

原创 经典面试题-线程间的通信问题(各种解法)

问题两个线程,一个输出字母,一个输出数子,交替出现比如:1A2B3C4D5E6F…代码实战LockSupport方式public class LockSupportMethod { static Thread t1 = null; static Thread t2 = null; public static void main(Str...

2020-04-29 18:13:16 525

原创 BeanDefinition 在IOC的解析和注册(八)

上文我们介绍了BeanDefinition的资源加载过程分析,将我们定义好的Bean资源文件载入并转换成了Document对象,

2020-04-28 18:07:27 199

原创 IOC之BeanDefinition的加载(七)

1.概述对于IOC容器来说,BeanDefinition的加载相当于把定义的BeanDefinition在IOC容器中转化成一个Spring内部表示的数据结构的过程,IOC容器对Bean的管理和依赖注入功能的实现,是对其特有的BeanDefinition进行各种操作来完成的。这些BeanDefinition数据在IOC中是通过一个HashMap来保持和维护的。下面我们将通过DefaultLi...

2020-04-23 20:56:38 177

原创 BeanDefinition的Resource定位分析(六)

1.概述通过源码我们发现,资源的定位问题主要发生在容器初始化过程中完成的,FileSystemXmlApplicationContext、ClassPathXmlApplicationContext 在一个构造器函数中执行refresh()容器启动的过程中完成的,当然这边启动过程中容器会有大量的复杂的初始化操作,资源的定位只是其中的一小环节。下面我们就FileSystemXmlApplica...

2020-04-23 18:23:33 224

原创 IOC的初始化过程(五)

1.概述简单来说IOC容器的初始化过程是通过refresh()方法来启动的,这个方法表示IOC容器的正式启动。具体来说这个启动主要包含BeanDefinition的Resource定位、载入和注册三个过程。2.IOC启动流程说明第一个过程是Resource定位过程。 这个 Resource定位指的是BeanDefinition的资源定位(例如我们平时Spring项目中配置的各种xm...

2020-04-22 19:50:47 545

原创 BeanFactory基础容器的设计原理(四)

BeanFactory接口提供了使用IOC容器的规范,在这个基础上,Spring还提供了符合这个IOC容器接口的设计原理。下面我们就XmlBeanFactory的实现为例说明简单IOC容器的设计原理。...

2020-04-21 16:24:30 250

原创 彻底理解JVM垃圾回收-经典垃圾收集器(十)

垃圾收集器的整体概述经典垃圾收集器之间的关系图如下:上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用,图中收集器所在的区域,则表示它是属于新生代收集器或是老年代收集器。Serial收集器Seria收集器是最基础、最悠久的收集器。该收集器是一个单线程工作的收集器,但它的“单线程”的意义并不仅仅是说明它只会用一个处理器或者一个条收集线程去完成垃...

2020-04-16 10:37:38 387

原创 彻底理解JVM垃圾回收-重要概念理解(九)

根节点枚举固定可作为GC Roots的节点主要存在全局性引用(例如常量或者类静态属性)与执行上下文(例如栈帧中的本地变量表)中,尽管目标比较明确但是要高效查找这些节点并非易事。迄今为止,所有收集器的根节点枚举这一步都需要暂停用户线程的,毫无疑问枚举根节点需要面临”Stop the world“的困扰。现在可达性分析算法耗时最长的查找引用链的过程已经可以做到与用户线程一起并发(CMS),但根节...

2020-04-08 13:43:47 465 2

原创 彻底理解JVM垃圾回收-垃圾收集算法(八)

分代收集理论当前商业虚拟机的垃圾收集器大多数遵循了”分代收集“的理论进行设计的。遵循分代收集理论,Java的堆空间被划分为新生代(Yong Generation)和老年代(Old Generation)两个区域。在新生代中,每次垃圾收集时都能发现有大批的对象死去,而每次回收后存活的少量对象,将会逐步晋升到老年代中存放。标记-清除算法该算法分为两个阶段,”标记阶段“和”清除字段“:首先...

2020-04-03 19:01:12 233

原创 彻底理解JVM垃圾回收-基础概念理解(七)

引用计数法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器引用就减1;任何时刻计数器都为0的对象就是不可能再被使用的对象。客观的说引用计数算法实现简单,判定效率也很高,在大部分去情况下它都是一个不错的算法,但是在Java语言中没有选用引用计数法来管理内存,最主要的原因是它很难解决对象之间的相互循环引用的问题。如图:说明:图例中,Object0到O...

2020-03-31 17:12:09 181

原创 HotSpot虚拟机对象探秘(六)

对象的创建虚拟机遇到一条new指令时,受检检查这个指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有那么首先执行相应的类的加载过程。在类加载检查通过之后,接下来虚拟机需要为新生的对象分配内存。对象所需的内存大小在类加载完成之后便可完全确定,为对象分配内存的任务等同于把一块确定大小的内存从java堆中划分出来。假设Ja...

2020-03-29 16:48:19 234

原创 JVM内存模型(五)

JVM的运行时数据区内存结构模型程序计数器程序计数器(Program Counter Register),也有称作为PC寄存器。在汇编语言中,程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,...

2020-03-26 22:19:54 134

原创 Spring分布式锁的starter封装(Redisson)

由于业务权限服务,相同数据可能存在多人操作的情况,所以存在共享资源操作竞争问题,如果针对于业务单独去控制,成本比较高,具体控制还要耦合于业务中,如果使用不规范,很容易造成竞争死锁问题,所以次处分享一个基于AOP的分布式锁的start。欢迎一起探讨,对于增强改进的地方欢迎提供建议。此处利用aop的MethodInterceptor进行方法级别的拦截,并且配合注解使用完成整个流程。一、主要注解1...

2020-03-20 11:38:16 957

原创 Java字节码文件结构剖析-从JVM角度读字节码(四)

代码案例:public class MyTest1 { private int a = 1; public MyTest1() { } public int getA() { return this.a; } public void setA(int a) { this.a = a; }}执行命令...

2020-03-14 16:40:03 254

原创 Spring IOC容器的核心接口设计(三)

Spring IOC容器的接口设计下面针对图中的接口关系做一个详细的介绍从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory是一条主要的BeanFactory的设计路径,在这条接口设计路径中BeanFactory定义了基本的IOC容器的规范。在这个接口定义中,包括了getBean()这样的IOC容器的基本方法。而H...

2020-03-13 20:53:39 618 1

原创 类加载器的深入解析及重要特性剖析(三)

1.类加载器类加载器用来把类加载到Java虚拟机当中。从JDK1.2版本开始,类的加载过程采用双委托机制,这种机制能更好的保证Java平台的安全。在此委托机制中,除了Java虚拟机自带的根类加载器以外,其余的类加载器都有且仅有一个父加载器。当Java程序请求加载器Loader1加载类Sample,首先委托父类加载器加载,如果能加载则返回,否则由Loader1加载器加载Sample。2.类...

2020-02-27 11:54:00 263

原创 类加载器深入解析与阶段分解(二)

1.类加载在java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的。提供了更大的灵活性,增加了更多的可能性。2.Java虚拟机与程序的生命周期如下几种情况,虚拟机将结束生命周期:执行了System.exist()程序正常执行结束程序执行过程中遇到了异常或错误而异常终止由于操作系统出现错误而导致java虚拟机进程终止3.对象的生命周期(1) 加...

2020-02-18 12:34:41 149

原创 Spring 统一资源加载策略(二)

1.统一资源接口的子类结构WritableResource: 可写资源接口ByteArrayResource :二进制数组资源ClassPathResource:类路径下的资源,资源以相对路径的方式表示FileSystemResource:文件系统资源,资源以文件系统的方式表示如:D://data/beans.xmlServletContextPathResource:为访问Web容...

2020-01-20 18:07:01 1397

原创 Spring 的整体架构和环境搭建(一)

1.整体架构Spring是一个分层架构,它包含一些列的功能要素,并被分为大约20个模块,如图:这几个模块主要总结为如下几个部分:① Core ContaineCore Container (核心容器)包含有Beans、Core、Context和Expression Language。Core和Beans是框架的基础模块,控制IOC(控制反转)和DI(依赖注入)。Core模块主要包含S...

2020-01-19 18:03:58 374

原创 NGINX的配置问题

坑一 . 静态文件服务器时:location root和alias的区别:root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上:root的处理结果是:root路径+location路径alias的处理结果是:使用alias路径替换location路径alias是一个目录别名的定义,root则是最上层目录的定义。...

2020-01-17 14:29:04 138

原创 线上CPU100%的排查思路

假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。如何定位是哪个服务进程导致CPU过载.哪个线程导致CPU过载,哪段代码导致CPU过载?简要步骤如下:(1)找到最耗CPU的进程;(2)找到最耗CPU的线程;(3)查看堆栈,定位线程在干嘛,定位对应代码;步骤一、找到最耗CPU的进程工具:top方法:执行top -c,显示进程运行信息列表...

2020-01-17 14:25:30 255 1

原创 RocketMQ消息顺序发送和消费问题

事故现场分析:由于创新业务产品上线,运营产品想通过一些活动来刺激用户,采用注册邀请机制即可获取积分的相关活动。考虑到后续可能还有其他可能的活动来发放积分,所以设计的时候,采用mq消息模式发放积分,异步解耦,并能够保证数据的最终一致性。考虑到用户积分计算的时候可能存在并发操作的情况,想到两种解决方案:1.采用分布式锁的方式,计算用户积分,同一个用户操作时保持同步处理2.采用队列的先天优势,FI...

2020-01-17 14:24:29 883 3

原创 SpringBoot以jar启动The temporary upload location[xxxx]is not valid

场景还原:新项目为了满足运营人员使用搭建的Boss系统,采用了SpringBoot2.0,并以Jar包的形式启动,第一次上线测试,完全正常,由于春节时隔10几天没有人登录过,后来同事反应登录的时候就报错了,查看日志信息:message:Failed to parse multipart servlet request; nested exception is java.io.IOExcepti...

2020-01-17 14:22:39 215

原创 SpringBoot2.0之Security-Oauth2配置踩坑+源码分析

最近使用SpringBoot2.0新版构建项目,新版的SpringBoot相关依赖的jar很多包结构做了变更,相关依赖也有很多不同,本人负责公司的基础服务,相关登录认证,资源认证采用了开源的 Spring-Security-Oauth2来构建,但是构建过程中会遇到很多坑,所以做此记录。坑一:Spring boot 2.0.X引用的security 依赖是 spring security 5....

2020-01-17 14:11:46 1442

空空如也

空空如也

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

TA关注的人

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