- 博客(90)
- 资源 (9)
- 收藏
- 关注
原创 问题-Guava Lists.transform遍历完数组后数据丢失
1. 现象在调用Guava Lists.transform进行转换 & 封装对象时,获得transform返回的数组对象后,随后进行遍历并对数组元素属性进行赋值,当遍历结束后数组对象会出现赋值丢失。public static void main(String[] args) { List<BookA> list = new ArrayList<>(); list.add(new BookA()); Li...
2021-10-24 19:46:14 418
原创 Mysql-执行流程
1. 介绍1.1 查询1.1.1 查询缓存 MySQL 拿到一个查询请求后先会在查询缓存中看看是否执行过此语句,之前执行的语句会以 key-value 的形式缓存在内存中,key 是缓存的语句,value 是查询的结果。如果命中缓存则直接将结果返回,如果没有命中则继续执行后面。查询缓存默认是关闭的,Mysql8.0直接删除查询缓存。1.1.2 解析器生成解析树(1)词法解析 关于解析完生成的解析树类似下图,我以’select name from user_...
2021-08-06 14:55:09 110
原创 JVM-CPU100%
1. 介绍1.1 排查步骤 查消耗cpu最高的进程PID 根据PID查出消耗cpu最高的线程号 根据线程号查出对应的java线程,进行处理 1.2 Linuxtop -c:显示进程运行信息列表。按下P,进程按照cpu使用率排序 top -Hp「pid」:显示一个进程的线程运行信息列表。按下P,进程按照cpu使用率排序 printf "%x\n" 「pid」:线程号是10进制,在堆栈信息中,线程号是16进制,因此可以先通过命令转换为16进制 jstack 「pid」
2021-07-22 16:51:41 4264
原创 并发-AbstractQueuedSynchronizer
1. 介绍1.1 简介队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。队列同步器相当于synchronized的高级特性,带来了更好的灵活性。1.2 原理ConcurrentHashMap加锁是锁住链表或者红黑树的首节点来提高并发性能,而不是锁住所有节点。队列同步器差不多类似,保证同步器内首尾节点相关操作的并发安全,例如使用CAS添加尾节点。.
2021-06-09 15:21:51 91
原创 并发-ThreadLocal
1. 介绍1.1 作用ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。1.2 原理每个线程创建时会拥有一个Thread对象,该线程首次调用ThreaLocal.set()方法时,会创建ThreadLocalMap(这不同于HashMap,该Map由一个数组组成),利用线性检测(根据初始key的hashcode值确定元素在table数组中的位置,如果发现这个位置上已经有其他key值的元素被占用,则利用固定的算法寻找一定步长的下个
2021-06-07 17:07:48 134
原创 网络-HTTP
1. 介绍HTTP连接 = TCP握手,HTTPS连接 = TCP握手 + SSL握手。1.1 SSL握手HTTPS如何保证数据传输的安全性,即通过RSA非对称加密。但是非对称加密加解密太慢,因此通过非对称加密方式向服务端和客户端两方确认对称加密信息(为什么一开始不用对称加密:如果服务端和客户端一开始使用对称加密很容易被中间人获取到,可能直接可以通过本地客户端获取对称加密信息从而破解其它人的数据信息)。1.1.1 SSL基本过程(1) 客户端向服务器端索要并验证公钥。客户端向服务器索
2021-06-04 14:23:20 299
原创 网络-TCP
1. 介绍1.1 TCP/IP 模型1.2 三次握手(1)第一次握手:Client 进入 SYN_SENT 状态,发送一个 SYN 帧来主动打开传输通道,该帧的 SYN 标志位被设置为1,同时会带上 Client 分配好的 SN 序列号,该 SN 是根据时间产生的一个随机值,通常情况下每间隔 4ms 会加 1。除此之外,SYN 帧还会带一个 MSS(最大报文段长度)可选项的值,表示客户端发送出去的最大数据块的长度。(2)第二次握手:Server 端在收到SYN 帧之后,会进入SYN_
2021-06-03 16:05:17 152
原创 流量回放-SandboxRepeater
1. 介绍1.1 简介SandboxRepeater是一套流量回放工具,开源的应该基本不更新了,阿里收费的项目正在出,还在公测阶段。目前开源出来的流量回放框架有滴滴的Rdebub和阿里的SandboxRepeater等,不过其它像滴滴的这套是PHP框架,除非完美适配,不然的话SpringBoot项目如果要使用也只能基于SandboxRepeater修改。1.2 架构插件Plugin 控制台界面Console1.3 如何启动Sandbox Repeater客户端2. 源码2..
2021-06-01 15:47:42 1990
原创 Sandbox
1. 介绍2. 源码3. FAQ4. 参考资料【开源测试工具[jvm-sandbox-repeater 学习笔记][入门使用篇]】
2021-05-31 16:50:20 368
原创 分布式-多级缓存
1. 介绍1.1 简介JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。1.2 特性通过统一的API访问Cache系统 通过注解实现声明式的方法缓存,支持TTL和两级缓存 通过注解创建并配置Cache实例 针对所有Cache实例和方法缓存的自动统计 Key的生成策略和Value的序列化策略是可以
2021-05-19 16:43:07 1578
原创 设计模式-练习题
1. A系统以固定请求格式通知B系统,B系统根据不同的意图自定义回复内容,回复内容按照固定格式返回给A系统,但是回复内容可以是多种形式的,例如文本形式、音频形式,不同的形式需要设置的字段名属性值不同。A:策略模式 + 工厂模式...
2021-05-11 15:20:03 370
原创 Spring-本地可以发送邮件,服务器无法发送邮件问题
1. 问题背景1.1 Maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.6.RELEASE</version>
2021-05-08 15:24:24 1346 1
原创 Netty-IO模型
1. 介绍1.1 JAVA读写原理1.1.1 内核空间和用户空间用户空间:是非特权区域,在该区域执行的代码不能直接访问硬件设备,常规进程就在本区域执行,JVM就是常规进程,所以JVM进程驻守在用户空间 内核空间:是操作系统所在区域,有特别的权利:能与设备控制器通讯,控制着用户区域进程的运行状态等等,最重要的是,所有I/O都直接或间接的通过内核空间(内核空间是所有线程共享)。1.1.2 普通IO操作当进程请求一个I/O操作,它会执行一个系统(open() , read() , writ
2021-04-25 20:15:31 188
原创 分布式事务-Seata
1. 介绍2. 源码3. 实战4. FAQ5. 参考资料【springboot集成分布式事务Seata】【Seata中文官网】
2021-04-18 23:32:04 2080 1
原创 分布式事务-基础
1. 介绍1.1 什么是SeataSeata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式。1.2 事务模式1.2.1 AT1.2.2 TCC1.2.3 SAGA1.2.4 XA2. 源码3. 实战4. FAQ5. 参考资料【springboot集成分布式事务Seata】【Seata中文官网】...
2021-04-15 11:46:25 180
原创 Mysql-汉字编码问题
1. 介绍1.1 问题描述SELECT count(*) FROM live_play WHERE is_deleted = 0 and player like "⼩小可新"; 和 SELECT count(*) FROM live_play WHERE is_deleted = 0 and player like "小小可新"; Sql一样,但是查询出来的结果却不一样,一个显示3,一个显示0。显示3的中文是数据库直接复制出来的,显示0的是手打的汉子1.2 问题定位数据库 & 表 &.
2021-04-15 10:53:41 328
原创 MAC-IDEA控制台如何使用git补全功能
1. 介绍2. 实战(1)安装git-completion.zsh(2)~/.bash_profile设置以下内容路径需要对应修改。[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"(3)~/.zshrc添加如下内容source ~/.bash_profile(4)修改权限由于不断提示 “I..
2021-04-07 12:55:20 992
转载 Spring-Bean生命周期
1. 介绍如上图所示,Bean 的生命周期还是比较复杂的,下面来对上图每一个步骤做文字描述: Spring启动,查找并加载需要被Spring管理的bean,进行Bean的实例化 Bean实例化后对将Bean的引入和值注入到Bean的属性中 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory(
2021-04-05 23:03:48 99
原创 Spring-AOP原理
1. 介绍1.1 什么是AOPAOP (Aspect Orient Programming),直译过来就是面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面。从该图可以很形象地看出,所谓切面,相当于应用对象间的横切点,我们可以将其单独抽象为单独的模块。1.2 为什么需要AOP想象下面的场景,开发中在多个模块间有某段重复的代码,我们通常是怎么处理的?显然,没有人会靠“复制粘贴”吧。在传.
2021-04-04 22:27:47 160
原创 Es-相同条件搜索不一致问题
1. Es两次相同条件搜索结果不一样?前提:副分片存在一个。重建索引的时候,有时候会复现,有时候不会。一开始怀疑是不是重建索引的时候,增量数据处理的有问题。因为目前的操作是如果有增量数据,则重建完索引后更新这部分数据,然后再刷新下。但是多次实验后,没有复现,可能是因为忘记了一开始的ID导致的,因为复现的时候没有操作到关键的数据。后续如果再出现这个问题可以先干掉副本,再还原成一个副本,这样主副就能一致了。参考资料:【es同一次搜索请求获得不同结果】...
2021-03-29 15:11:39 1086
原创 Spring-Bean循环依赖
1. 介绍1.1 什么是Bean循环依赖两个或则两个以上的对象互相依赖对方,最终形成闭环。例如 A 对象依赖 B 对象,B 对象也依赖 A 对象。1.2 会有什么问题对象的创建过程会产生死循环,类似如下1.3 Spring是如何解决的通过三级缓存提前暴露对象来解决。 一级缓存存的是成品对象(实例化和初始化都完成了的),我们应用中使用的对象就是一级缓存; 二级缓存中存的是半成品(实例化,但是还未初始化),用来解决对象创建过程中的循环依赖问题; 三级缓.
2021-03-05 15:52:50 2122
原创 Spring-bean定义
1. 介绍1.1 为什么使用beanDefinition对spring bean进行建模由于普通的Class对象无法完成bean的抽象,例如bean的作用域、是否懒加载等,故而需要beanDefinition来抽象这些信息,以便于Spring能完美的实例化一个bean。1.2 Spring如何实现bean定义Spring设计了一个BeanDefinition的类用来存储类的类型、名字、构造方法等等。Spring定义了BeanDefinition后置处理器(BeanDefinitionR.
2021-02-26 15:26:38 250
原创 设计模式-设计原则
1. 介绍1.1 概览SOLID是五个设计原则开头字母的缩写,其本身就有“稳定的”寓意,寓意是“遵从SOLID原则可以建立稳定、灵活、健壮的系统”。五个原则分别如下: Single Reponsibility Principle(SRP):单一职责原则 Open Close Principle(OCP):开闭原则 Liskov Substitution Principle(LSP):里氏替换原则 Interface Segregation Principle(IS
2021-02-22 14:27:59 86
原创 基础-CAP理论
1. 介绍1.1 定义CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer's theorem),是加州大学伯克利分校的计算机科学家--埃里克·布鲁尔(Eric Brewer),在 2000 年的 ACM PODC 上提出的一个猜 想。2002 年,麻省理工学院的赛斯·吉尔伯特(Seth Gilbert)和南希·林奇(Nancy Lynch) 发表了布鲁尔猜想的证明,使之成为分布式计算领域公认的一个定理。CAP 定理,指的是在一个分布式系统(指互相连接并共享数据节点的集合)中,
2021-02-19 14:13:21 272 1
原创 JVM-垃圾收集器
1. 介绍1.1 为什么需要垃圾收集器堆中存放着正在运行的JAVA程序所创建的所有对象,例如使用new指令创建对象。但是没有明确代码来释放它们,垃圾收集就是自动释放不再被程序使用的对象的过程。1.2 如何判断垃圾对象引用计数法缺点:循环引用问题可达性分析法GCroot结点开始向下搜索,路径称为引用链,当对象没有任何一条引用链链接的时候,就认为这个对象是垃圾,并进行回收。如果在“GC roots”和一个对象之间没有可达路径,则称该对象是不可达的。要注意的是,不可达对象不等价于可回收对象
2021-01-28 17:45:20 152
原创 运维-MAC安装OmniGraffle
1. 介绍MAC画图工具,类似Vision作用2. 参考资料【OmniGraffle Pro 7 for Mac】
2021-01-28 11:28:47 284
原创 Apollo-配置如何热更新
1. 背景一般情况下,可以不加这个配置热更新。但是如果遇到动态数据维护在配置中的话,热更新还是比较方便的,例如在配置中维护黑白名单数据等等,这样测试环境不用每次都叫测试进行重启。2. 介绍2.1 基础架构用户在配置中心对配置进行修改并发布。 配置中心通知Apollo客户端有配置更新。 Apollo客户端从配置中心拉取最新的配置、更新本地配置并通知到应用。2.2 结构模块看到这里,整个架构看起来就比较清晰了。接下来从上往下简单介绍一下:Portal服务:提供Web界面供.
2021-01-27 23:47:04 5661
原创 Mysql-锁
1. 背景2. 介绍2.1 存储引擎的区别MyISAM 和 MEMORY 存储引擎:采用的是表级锁(table-level locking) BDB 存储引擎:采用的是页面锁(page-level locking),但也支持表级锁 InnoDB 存储引擎:既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。现在基本上都是用的InnoDB存储引擎。2.2 InnoDB中锁的类型InnoDB存储引擎中实现了如下两种标准的行级锁:共享锁(S Loc
2021-01-07 14:53:49 218
原创 限流-令牌桶
1. 背景1.1 为什么需要限流大量正常用户高频访问导致服务器宕机 恶意用户高频访问导致服务器宕机 网页爬虫 ,对于这些情况我们需要对用户的访问进行限流访问2. 介绍目前主流的限流算法:令牌、漏桶、滑动窗口。Nginx和阿里的 Sentinel 都实现了漏桶算法,Springcloud Gateway和Guava Ratelimiter实现了令牌桶2.1 令牌2.2 漏桶2.3 滑动窗口3. 源码4. 实战5. FAQ6. 参考资料【Sentinel学.
2021-01-05 16:37:34 281
原创 限流-滑动窗口
1. 背景1.1 为什么需要限流大量正常用户高频访问导致服务器宕机 恶意用户高频访问导致服务器宕机 网页爬虫 ,对于这些情况我们需要对用户的访问进行限流访问2. 介绍目前主流的限流算法:令牌、漏桶、滑动窗口。Nginx都实现了漏桶算法,Springcloud Gateway和Guava Ratelimiter实现了令牌桶,阿里的 Sentinel实现了滑动窗口。2.1 滑动窗口2.1.1 为什么引入滑动窗口固定窗口可能遇到的问题 限流不均匀 两倍的配置速率问题
2021-01-04 17:25:52 4154
原创 并发-同步屏障CyclicBarrier
1. 背景2. 介绍CyclicBarrier字面意思就是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情就是让一组线程到达一个屏障后(也可叫同步点)时被阻塞,直到最后一个线程到达线程时,屏障才会开门,所有被屏障拦截的线程才会继续进行。3. 源码3.1 可重入锁实现CyclicBarrier private int dowait(boolean timed, long nanos) throws InterruptedException, Brok.
2020-12-28 22:09:26 124
JavaEE开发的颠覆者 Spring Boot实战+源码案例
2018-08-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人