自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(151)
  • 资源 (1)
  • 收藏
  • 关注

原创 IDEA搭建JDK源码学习环境(可添加注释、修改、debug)

IDEA搭建JDK源码学习环境(可添加注释、修改、debug) 工程详情见:https://github.com/wenpanwenpan/study-source-jdk1.8.0_281

2024-01-28 12:43:40 581

原创 如何加速spring/springboot应用启动速度

注解标注在某些需要在启动过程中异步初始化的方法上才能实现启动过程中异步执行。自动探测所有可异步初始化的功能待实现(因为要进行依赖关系分析,比如在执行异步初始化某个类时,该类依赖关系非常复杂,并且可能他所依赖的某些bean还为被spring 容器创建,那么此时就需要去创建依赖的bean,且分析依赖树。)使用单独线程异步执行的能力,加快 Spring 上下文加载过程,提高应用启动速度。注解标注到需要异步执行的初始化方法上即可实现应用启动过程中异步初始化。模块提供了通过配置的可选项,将 Bean 的初始化方法(

2023-07-30 16:43:48 935

原创 基于幂等表思想的幂等实践

极端情况下,如果插入幂等记录成功,并且正常执行了业务流程,此时更新幂等状态为success时出现异常(比如存储幂等记录的存储介质宕机了),此时是否需要处理该异常,还是说抛出异常中断流程?是否需要设定【最大的处理时间】,比如我们期望接口最大处理时间为1小时(也就是说幂等记录处理processing状态的时间最大为1h),如果超过这个时间,那么认为这不是一种正常的case,下次重试请求时应该尝试恢复业务执行。获取指定的业务key作为唯一的幂等键,构建幂等记录(此时幂等记录status为处理中(

2023-01-14 21:38:44 654 1

原创 springboot1.x和2.x将配置属性绑定到对象上

在基于springboot进行封装自定义框架或对某个开源框架进行二次改造时我们经常会涉及到将或者中配置的属性绑定到某个类对应的属性上

2022-12-03 21:18:29 755

原创 利用存储过程造测试数据

开发过程中我们往往会遇到需要向数据库插入几千或几万条数据以测试某个功能,或者为了复现生产的某个bug而需要在测试环境造大量的数据的需求,此时便可以通过存储过程来直接向数据库某张表里生成指定条数的测试数据!!!②、生成指定长度的随机数字的函数按照入参和,生成该区间的随机数字2.创建存储过程该存储过程中会调用上面的函数生成指定长度的随机字符串该存储过程在调用时根据传入的入参可以控制生成的数据条数3. 查看存储过程4. 调用存储过程5.删除存储过程6.问题创建函数,假如报错:

2022-12-03 21:03:24 662

原创 一台服务器最大能支持多少条TCP连接

来控制,默认大小是128,当两台机器离的非常近,但是建立连接的并发又非常高时,可能会导致半连接队列或全连接队列溢出,进而导致server端丢弃握手包。上面讨论的都是进建立连接的理想情况,在现实中如果有频繁的数据收发和处理(比如:压缩、加密等),那么一台服务器能支撑1000连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析,不能光靠理论值去算。,所以Linux系统基于安全角度考虑(比如:有用户进程恶意的打开无数的文件描述符,那不得把系统搞奔溃了),在多个位置都限制了可打开的。

2022-11-06 16:59:34 5959 3

原创 从内核角度看网络包发送流程

释放掉RingBuffer中的数组对skb的引用(注意:此时RingBuffer里的数组虽然放弃了对skb的引用,但是该skb并不会被立即清除,因为TCP有重传机制,必须要保证收到了对方的ack应答后再彻底删除该skb,如果没有收到对方的ack,那么传输层还可以重传该skb)通过上面的两种发送数据时拷贝的对比,可以看出sendfile相比与传统的方式,一次数据发送流程中,少了一次【CPU拷贝】,两次【态的切换】,在需要发送的数据较大的情况下,这里便是性能的提升点。能,sendfile就是这么干的。

2022-11-05 21:46:44 2445

原创 从内核角度看TCP三次握手

这里主要是介绍socket里的【全连接队列】和【半连接队列】结构,所以socket里的其他属性结构就不详细展示了(比如:发送队列,等待队列等),可以看到【全连接队列】和【半连接队列】在socket中的结构如下。如果在【第一次握手】的时候,server端收到client端的SYN包后,如果全连接队列满了或者半连接队列满了,那么该握手请求便会被server端【直接丢弃】,那么client端如何处理?理解了上面的listen和connect的作用后,我们便可以从内核角度整体的来看一下三次握手的过程了!

2022-11-05 19:35:37 896

原创 springboot中如何整合groovy实现一个轻量级规则引擎

当然你也可以项目启动好后通过来注册脚本,这里采用预先加载好脚本到Redis来演示对应的脚本都在目录下,自己按需设定脚本key即可[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sz13Srxu-1664720376722)(images/redis导入脚本配置.png)]

2022-10-02 22:23:02 4802 2

原创 用同一个GroovyClassLoader加载的Class真的无法回收吗

通过上面测试结果来看,由同一个对象加载到方法区的Class其实是被回收了的,方法区的内存占用也不会持续上升那么是不是说明由一个ClassLoader加载到方法区的Class可以在加载他的ClassLoader未被卸载前,自身可以被从方法区卸载呢?结论是否定的!!!由上面的分析可以看到,由同一个对象加载的Class,在加载他的ClassLoader没有被卸载前,自己竟然可以被卸载出方法区????这是啥原因呢?于是debug了一下源码!!!

2022-10-02 20:17:48 959

原创 spring的@Import注解会不会注入bean到容器

结论:正常情况下是会的,但是在某些特定的情况下并不会导入类到容器!!!然后在项目的主启动类或配置类上标注注解就可以实现某个功能的动态开关,看上去很优雅,但是有一次遇到一个问题,,比如上面的类如下,该类实现了接口二、问题解决经过我的验证,如果不实现接口,那么是可以正常被导入容器的所以问题出在实现接口上,我们只需要不实现该接口就行,如果非要实现接口,又想将自定义的类注入容器,那么可以在配置类中通过的方式来实现目前我遇到的@Import注解不能导入的类仅仅只有一种情况,特此记录!!!

2022-09-24 19:32:06 629

原创 java实现环形数组

java实现环形数组。

2022-07-30 13:33:10 1165

原创 feign调用丢失请求头问题解决及原理分析

注入一个自定义的接口的实现类到容器中openFeign发起调用前会先构建请求的Request,在构建request的时候就会拿到我们自定义的并执行,在自定义的RequestInterceptor实现类中便会从原有请求里拿到请求头信息,然后放入feign调用的request里注意如果是通过线程池或多线程进行发起feign调用,那么通过上述的添加实现类里通过获取原有请求里的请求头数据是获取不到的,这种情况怎么解决?其实也简单,最简单的方式就是在提交任务到线程池里的时候将请求头信息传递进去就可以了。.......

2022-07-25 16:41:57 2308

原创 使用ngrok做内网穿透

需要到刚才解压ngrok的目录下执行如下命令,后面的是官网上查看到的authtoken。然后你就可以在外网拿着这个域名来访问你本地的localhost8080端口了!由于这是免费的内网穿透,所以只允许同时绑定一个端口,无法同时绑定多个端口。需要到ngrok解压的目录下执行该命令,不然会无法识别ngrok命令。执行如下命令,建立一条和本机8080端口(可自己选择)的隧道。执行成功后,过1s钟便会出现如下界面。自己创建一个web工程,编写一个接口。先到官网查看你的authtoken。...

2022-07-24 19:08:11 665 1

原创 使用Redis + lua脚本实现分布式限流

4、application.yml文件中配置5、主启动类上开启限流功能使用显示开启限流功能三、使用测试1、使用限流注解直接在需要限流的接口上使用或便可以进行限流2、使用redisLimitHelper进行限流使用redisLimitHelper进行限流更加灵活3、使用示例具体使用详情见:基于lua脚本的分布式限流使用测试四、核心原理使用方式和原理都很简单,不过多赘述,这里贴出两个核心的lua脚本.........

2022-07-13 21:18:09 878 4

原创 java数据结构与算法之二叉树的最大宽度和最大深度问题

①、最大深度问题求二叉树的最大深度,最常见的无非两种方式第一种是,以【宽度优先遍历】统计树的层数,树有多少层,那么树就有多高第二种是,以【深度优先遍历】,以我们上面讲的【二叉树通用套路】,每个节点都可以向他的左右孩子要信息来求解深度优先求树的最大高度解法/** * 以深度优先,求二叉树的高度 */public static int height(TreeNode treeNode) { if (treeNode == null) { return 0; }

2022-03-23 15:35:21 742

原创 java数据结构与算法之翻转二叉树

该题本来不是一个具有代表性的题目,但是由于在面试中我多次被问到该题,所以做一个记录。题目描述给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。解法一(DFS)/** * dfs法翻转二叉树(后序遍历) */public TreeNode invertTree1(TreeNode root) { if (root == null) { return null; } invertTree1(root.left); invertT

2022-03-22 11:42:34 1260

原创 java数据结构与算法之最长无重复子串问题

①、问题描述给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。力扣第三题该题主要考察了对string的基础API的熟悉度对hash表的熟练使用双指针 + 滑动窗口思想②、代码展示本题的核心就是使用hash表的去重功能public class NoRepeatSubString { /** * 双指针解法(滑动窗口思想) */ public int lengthOfLongestSubstring3(String s) {

2022-03-21 22:25:48 1020

原创 java数据结构与算法之最近公共祖先问题

①、问题描述给你两个节点node1,node2,这两个节点都在树上,再给你一个节点head,head表示二叉树的头节点,请返回他们【最近的公共祖先】②、核心点分析如果我们能顺着某个node向上找到他的父亲节点就好了。如果能从某个节点开始向上找到他的parent节点,那么这个题就和单链表相交问题一样了,变得非常简单了所以,对于这种二叉树结构,我们只要知道【二叉树的头节点】,那么我们就可以【遍历】这棵二叉树。然后利用【HashMap结构】来存放每个节点的父子关系,这样的话,对于每一个节点,我们都可以找

2022-03-21 20:34:49 696

原创 java数据结构与算法之使用两个栈实现队列

题目要求要求使用两个栈来实现一个队列的功能实现addLast功能实现pollFirst功能实现peekFirst功能实现isEmpty功能代码实现/** * 使用两个栈来实现队列 */class MyQueue<T> { private Stack<T> stack1; private Stack<T> stack2; public MyQueue() { stack1 = new Stack<&g

2022-03-21 19:00:48 889

原创 java数据结构与算法之两数之和于三数之和问题

①、题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。②、力扣相关题目力扣第653题力扣第1题③、解题1、暴力解法暴力解法最为简单,也最容易想到,但是时间复杂度为O(n^2)/** * 双重循环法 */public static int[] f1(int[] n

2022-03-21 12:12:00 382

原创 java数据结构与算法之求所有子数组问题

求数组子数组的题目是很多类似题目的基础,所以一定要明白如何求一个数组的【所有子数组】注意:这里讨论的是求数组的【所有子数组】和下面的求数组的【所有连续子数组】问题区分开①、题目描述给你一个整数数组nums,求该数组的所有子数组比如:nums = [1,2,3]返回,[ [1,2,3], [1,2], [1,3], [1], [2], [3], [2,3], [] ]②、类似题目力扣第2044题力扣第898题力扣第560题③、代码核心就是使用递归去做决策,对于数组中的每个位.

2022-03-18 16:11:15 2085

原创 java数据结构与算法之连续子数组问题

①、问题描述给定一个数组nums,0 < nums.length < 1000,请找出该数组的所有子数组并返回!!!什么是连续子数组呢?比如原数组 nums = [1, 2, 3] 那么他的连续子数组有[1,2,3]、[1,2]、[1]、[2]、[3]、[2,3][1,3]则不是他的连续子数组②、类似题目力扣898题力扣795题力扣560题③、代码// 测试代码public static void main(String[] args) { int[] int

2022-03-18 11:10:53 2565

原创 java数据结构与算法之全排列问题

①、问题描述给你一个字符串str,返回这个字符串的全部排列,比如:str = “abc”返回,[abc , acb, bac, bca,cab,cba]注意:如果字符串str里有重复字符呢?要求返回的全排列集合里不能存在重复字符串,比如:str = “aa”返回,[aa]。而不是[aa, aa]②、解题思路这种求全排列的问题,最常见也是最容易想到的写法就是【暴力递归】注意如果str里有重复字符,那么递归时需要做【剪枝】操作来保证结果集里不会有重复字符串对于递归算法主要是

2022-03-16 21:07:47 1334

原创 JDK动态代理原理解析

1、回顾一下JDK动态代理的核心参数如果我们要为target类创建一个【JDK动态代理对象】,那么我们必须要传入如下三个核心参数加载target类的类加载器target类实现的接口InvocationHandler为什么必须要这三个参数呢?之前使用动态代理的时候都是直接按接口要求传这三个参数,但从来没想过为什么?下面仔细去探究一下2、实现一个简单的动态代理【JDK动态代理】的核心其实是借助【Proxy.newProxyInstance(ClassLoader loader,Class&lt

2022-03-14 16:52:31 4704

原创 手写一个线程池

实现了基本的线程池功能,比如提交不需要返回结果的任务提交需要返回值的任务自定义线程池各个参数线程池中的worker执行完任务后自动去队列里获取一个任务来执行自定义拒绝策略需要优化的功能更精细的并发控制根据线程池中worker的具体情况来判断是否要销毁当前worker当然,最正宗的还是要看 大哥李 开发的线程池①、自定义线程池public class MyThreadPool { /** * 线程池状态(默认0,正在运行,1线程池关闭中,2线程池终结)

2022-03-13 16:26:51 866

原创 java单例模式常见的几种写法

单例模式有多种写法,都有各自的优缺点,最常见的优缺点就是【懒汉和饿汉】的比较,以及是否线程安全懒汉模式,节约内存,只有使用到时才创建单例对象,可能会有线程安全问题饿汉模式,浪费内存,但可以由JVM类加载器去保证线程安全一、饿汉模式public class Singleton1 { /** * 饿汉式提前创建好单例对象(在类被主动使用时便会触发静态变量的初始化) */ private final static Singleton1 INSTANCE = new

2022-03-13 11:17:52 401

原创 java数据结构与算法之在有重复的有序数组中查找第一个等于target的索引下标

二分查找的题目,在面试中经常会被问到,但是仅仅只问二分法的话显得过于简单了很多面试官都会先给你一个【无重复值的有序数组】,然后叫你你写一个二分查找算法,看看你对二分查找是否熟悉如果你写出来了,然后继续问你,如果数组中有重复元素如何返回第一个和target相等的数的下标索引或最后一个和target相等的数的下标索引。并且要求你时间复杂度达到 O(logN)这题其实思路很简单,要求【时间复杂度达到 O(logN)】那就说明了必须是二分查找,关键在于一些边界条件的控制和自己的想法比如 力扣第34题p.

2022-03-11 22:59:12 911

原创 JVM空间分配担保流程

JVM空间分配担保流程在进行Minor GC之前,JVM首先会检查【老年代最大连续空闲空间】是否大于【当前新生代所有对象占用的总空间】如果是,那么说明此次的Minor GC是安全的,可以放心的进行Minor GC如果不是,则JVM会去查看HandlePromotionFailure参数的值是否为true(表示是否允许担保失败)如果不允许担保失败,则此时就会进行一次Full GC 以腾出老年代更多的空间如果允许担保失败,则此时JVM会去检查【老年代最大连续空闲空间】是否大于【历次晋升到老年代的对

2022-03-07 11:57:03 2352 1

原创 常见分布式事务解决方案

一、分布式事务开源框架方案市面上有很多开源的分布式事务框架,下面列举几个!!!seata,seata基本实现了最常用的各个场景的分布式事务解决方案,主要分为以下四种模式XA模式参考:Seata XA 模式缺点:需要数据库支持XA协议,长事务,持久占用资源,效率较低(分支事务需要在第二阶段执行后才进行提交或回滚)优点:强一致性保证,不会有分布式事务的脏读、脏写发生saga模式参考:SEATA Saga 模式Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中

2022-02-17 12:06:19 1492

原创 手写一个RPC框架

一、项目介绍①、项目基础介绍【 simple-rpc】是一款简单的rpc服务框架,主要用于学习造轮子!以便于透彻的理解RPC原理和过程,以及spring、springboot、netty中相关技术运用。【 simple-rpc】主要实现了两个版本【simple-rpc-like-feign分支】实现了类似于openfeign调用相关功能(openFeign底层通信是基于HTTP,一般是使用HttpClient等相关HTTP客户端发起的调用(这也是openfeign比较低效的原因之一)。在simpl

2022-01-25 14:19:54 997 1

原创 springboot自定义注解,项目启动时扫描注解类并注入容器

以下是核心流程的实现示例,如果需要更完整的实现,可参考:注意:需要切换到simple-rpc-like-feign分支https://gitee.com/mr_wenpan/basis-simple-rpc/blob/master/simple-rpc-starter/src/main/java/org/simple/rpc/starter/registrar/SimpleRpcClientsRegistrar.javahttps://gitee.com/mr_wenpan/basis-simple

2022-01-25 13:56:22 7110

原创 MongoDB多数据源实现

源代码:https://gitee.com/mr_wenpan/basis-enhance使用参考:TestMongoMutilSourceController一、功能介绍支持一个springboot应用程序中配置多个MongoDB数据源使用注解@EnableMongoMultiSource开启MongoDB多数据源功能启用与禁用,实现了动态可插拔功能。提供MongoMultiSourceClient来获取并操作某个指定的数据源对应每个MongoDB集合都支持自定义分片算法提供默认的一致性ha

2021-12-28 09:54:11 1813

原创 MySQL字符集是什么

一、什么是字符集字符集指的是某个范围字符的编码规则比如utf8字符集对于所有中文汉字采用3个字节来表示(编码),所以我们称utf8为一种字符集。这里的范围就是指所有的中文汉字编码规则就是指 都采用3个字节来表示一个汉字比如ASCII字符集对于所有英文字母采用1个字节来表示(编码),所以我们称ASCII为一种字符集。这里的范围就是指所有的英文字母编码规则就是指 都采用1个字节来表示一个字母二、MySQL客户端和MySQL服务端字符集是如何交互的1、前置知识MySQL客户端

2021-12-20 17:03:54 7190

原创 innodb冷热LRU链表原理

一、冷热LRU链表引入我们知道MySQL是将数据存放在磁盘上的并且以页的形式来管理这些磁盘上的数据。磁盘的读写涉及到很多io操作,所以磁盘的访问是一个很慢的操作。为了提高数据的读写效率innodb会将一些数据缓存到内存中(buffer pool),在访问数据的时候首先查找内存,如果内存中有则直接访问,如果内存中没有,则按照一定的规则将数据加载到内存中。但是内存一般是比较昂贵的,一般不会将所有的数据都缓存到内存中(buffer pool),我们希望将一些热点数据缓存到内存中,将内存中那些不经常访问的数据逐

2021-12-20 17:02:32 1230

原创 innodb行格式

一、基础知识记录innodb以页作为内存和磁盘交互的基本单位,innodb的页大小一般为16kb,也就是说一般情况下一次最少从磁盘读取16kb的内容到内存,一次最少把16kb的内容刷新到磁盘中。一个页里有包含了多条数据,那么每条数据的格式是什么样的呢?innodb一共有四种行格式,分别是:compact、redundant、dynamic、compressed,本文主要记录compact行格式,其他的行格式大同小异。二、Compact行格式1、问题引入为了方便的说明行格式各个部分的作用,以一张表

2021-12-20 16:59:05 1444

原创 NIO中如何使用虚引用管理堆外内存原理

虚引用是最弱的引用,弱到什么地步呢?也就是你定义了虚引用根本无法通过虚引用获取到这个对象,更别谈影响这个对象的生命周期了。在虚引用中唯一的作用就是用队列接收对象即将死亡的通知。1、虚引用的特点虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。无法通过虚引用来获取被虚引用对象引用的真实对象!!!!ReferenceQueue queue = new ReferenceQue

2021-11-11 11:37:34 1694 1

原创 innodb的buffer pool原理

说明:下文基于innodb存储引擎介绍!!!一、什么是buffer pool我们知道对于MySQL数据库,是将数据以页的方式存放在磁盘上的。我们也知道对于磁盘的操作是非常慢的,如果我们需要查询某些数据时CPU都是从磁盘上去将这些数据读取出来然后返回给我们,那么这种效率肯定是低的让人奔溃的。那么MySQL采用了什么手段来提高数据读取效率呢?这就是buffer pool技术。顾名思义buffer pool就是内存缓冲池的意思,也就是使用内存来提高CPU和磁盘的交互效率。在MySQL启动时就会向操作系统申

2021-11-07 13:13:09 901

原创 缓存和数据库一致性方案

一、先更新缓存再更新数据库方案假设线程一和线程二都要更新缓存和数据库(线程一将数据更新为a,线程二将数据更新为b)线程一先到达,然后线程一去更新了Redis缓存将缓存数据更新为a,然后准备更新数据库,此时由于某些原因(比如网络原因、程序发生GC等)导致线程一卡顿一下此时线程二到达,然后线程二完成对Redis缓存的更新和对数据库的更新,此时缓存中数据为b,数据库中的数据也为b然后线程一继续运行,接着去更新数据库,将数据库中的数据更新为a线程一和线程二都运行完毕。此时数据库和缓存的状态为:缓存中

2021-10-29 15:26:16 376 2

原创 如何设计一个能抗高并发的秒杀场景

说明:秒杀场景中有许多需要考虑的问题,这里只是将如何设计一个能抗高并发的秒杀设计的主流程进行分析!!!一、秒杀的特点商品库存总量固定先到先得,瞬时并发极大商品数量和库存数量有限二、如何设计秒杀场景秒杀开始前先将秒杀的商品和对应的库存预热到Redis中(商品code : 对应的库存)秒杀开始,大量用户开始点击按钮进行秒杀NGINX对用户请求进行过滤,通过执行lua脚本去Redis中扣减对应商品的库存(预减库存)如果库存扣减成功则继续放行请求到网关如果扣减库存失败,则直接返回个前端

2021-10-29 11:26:32 555

乐优商城项目.sql

乐优商城项目sql文件,可直接mysql中导入该sql文件执行一下即可。

2019-10-25

空空如也

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

TA关注的人

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