自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

菜鸟日常

关注技术,乐于分享!

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

原创 Java 线程池参数含义以及常见设定策略

概述概述线程池构造方法中的参数含义、以及常见的设置线程池参数的办法。参数含义ThreadPoolExecutor 总共包含 4 个构造方法,最终调用的是以下方法,参数含义如下:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, T

2021-08-07 17:53:52 471

原创 Apache HttpClient 超时时间区别与验证

概述HttpClient 有 3 个超时时间设置,通过配置 RequestConfig 即可配置请求的超时时间,各个参数的作用如下:connectTimeout:请求连接超时时间,超时会抛出 org.apache.http.conn.ConnectTimeoutException: Connect to 127.0.0.1:8083 [/127.0.0.1] failed: connect timed out异常。例如请求本地不存在的一个服务:http://127.0.0.1:8083soc

2021-08-06 19:07:39 2123

原创 正向代理反向代理联系与区别

正向代理客户端通过代理服务器访问受限的服务器,此时代理服务器作为客户端的代理,向服务器发起请求。作用:突破访问限制,通过代理方式访问被封的网站隐藏客户端真实 IP反向代理代理服务器接收客户端请求,分发到内部服务器,响应内部服务器的结果给客户端与正向代理不同的是,此时代理服务器是作为内部服务器的代理,客户端不知道真正调用的哪个服务器。作用:负载均衡,将请求分散到内部的各个服务器中保证内部服务器安全,客户端只知道代理服务器的地址,不知道内部服务器的地址联系都需要代理服务器进

2021-08-05 17:06:04 216

原创 分布式微服务架构下的事务一致性解决方案

CAP 原则CAP 原则是 Consistency (一致性)、Availability (可用性) 和 Partition-tolerance (分区容错性) 的缩写,它是分布式系统中的平衡理论。一致性要求所有节点每次读操作都能保证获取最新数据。可用性要求,系统提供的服务必须处于可用状态,对于用户的请求能够在有限的时间内返回结果。分区容错性要求被分区的节点在遇到网络分区故障时候,仍然需要正常对外提供服务。事实上,任何系统只可同时满足其中两个,无法三者兼顾,即所有分布式系统只能满足 CP 或者 A

2021-08-04 18:03:05 452

原创 自己手写一个 Spring Boot Starter

starter 有什么作用?Spring Boot Starter 的 POM 文件中,引入了各种 jar 文件,当你想拥有某个功能的时候,引入 starter 即可。比如常见的 starter 有 spring-boot-starter-web、spring-boot-starter-test、spring-boot-starter-jdbc,将这些 starter 添加到 POM 文件中,就拥有了对应了能力。自定义 starter <dependency> <

2021-08-02 14:20:53 271

原创 HTTPS 加密过程

HTTPSSSL(Secure Sockets Layer),有 v2 和 v3 两个版本,SSL 发展到 v3 时已经证明了它自身是一个非常好的安全通信协议,于是互联网工程组 IETF 在 1999 年把它改名为 TLS(传输层安全,Transport Layer Security),正式标准化,版本号从 1.0 重新算起,所以 TLS1.0 实际上就是 SSLv3.1。TLS 由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密

2021-07-30 18:07:23 99

原创 DNS 解析过程

概述DNS 全称 Domain Name System,域名系统,他能够将人类可读的域名转换为机器可读的 IP 地址,上述转换过程就是域名解析。解析过程浏览器输入:www.baidu.com检查浏览器缓存、Host 文件映射关系请求本地 DNS 服务器(LDNS),查看是否有缓存;若没有缓存则请求 13 台根域名服务器(Root Server)根域名服务器将返回主域名服务器(gTLD Server,国际顶尖域名服务器,如 .com .cn)的地址本地域名服务器(LDNS)通过迭代的方式请求

2021-07-30 18:05:51 106

原创 缺失的第一个正数

概述给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1:输入:nums = [1,2,0]输出:3示例 2:输入:nums = [3,4,-1,1]输出:2示例 3:输入:nums = [7,8,9,11,12]输出:1提示:1 <= nums.length <= 5 * 105-231 <= nums[i] <= 231 - 1思路不通过方案

2021-07-22 22:57:48 106

原创 MySQL 的日志种类学习

undo logbinlogredo logBinlog格式• statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。• row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter

2021-07-18 15:09:12 73

原创 Spring 声明事物注解 Transactional 相关属性学习

1. 声明范围可以选择在以下几处地方声明 @Transactional在实现类上面声明,类里面定义的所有方法都被事物管理在实现方法上面声明,仅该方法被事物管理注意:在接口(接口类、方法)上面声明 Transactional 时,若代理对象是基于子类的代理,那么该注解将失效。最佳实践就是在实现类的具体方法上面增加 Transactional 注解。2. 传播行为 Propagation事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。REQUIRE

2021-07-17 17:03:20 172

原创 Spring AOP 实现原理分析

123

2021-07-17 12:57:39 114

原创 Spring Bean 加载解决循环依赖源码分析

概述首先从 Spring Bean 的加载流程了解到 Bean 的加载涉及到 获取 Bean 定义,实例化、属性填充、初始化过程。在初始化阶段 ,Spring 对 Aware、BeanPostProcessor 等扩展点进行了实现,对 Bean 进行增强。在初始化期间,有将 Bean 放到三级缓存,然后到二级缓存,最后初始化完成放到一级缓存的过程,具体可以看看上篇文章。Spring Bean 加载过程生命周期源码分析下面开始学习 Bean 解决循环依赖的过程。样例代码包含 3 个类,启动类 S

2021-07-17 11:30:19 247 1

原创 查找数组中第 K 大的数

概述给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4提示:1 <= k <= nums.length <= 104-104 <= nums[i] <= 104来源:力扣(LeetCode

2021-07-16 12:48:44 1375

原创 Spring Bean 加载过程生命周期源码分析

大撒大撒

2021-07-15 21:46:52 193

原创 计算第 N 个丑数

概述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:1 是丑数。n 不超过1690。https://leetcode-cn.com/problems/chou-shu-lcof/思路核心思路:计算后面的丑数,就是把前面已计算出的丑数 x2,x3,x5,然后取最小值得到。假设存在 3

2021-07-14 09:35:04 340

原创 有效的括号

概述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”输出:false示例 5:输入:s = “{[]}”输出:true来源:力扣(LeetCode)链接:

2021-07-13 14:52:02 62

原创 第三大的数

概述给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。输入:[1, 2]输出:2解释:第三大的数不存在, 所以返回最大的数 2 。输入:[2, 2, 3, 1]输出:1解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。提示:1 <= nums.length <= 104-2^31 <= nums[i] <= 2^31 - 1来源:

2021-07-10 22:20:05 107

原创 字符串相乘——大整数乘法

概述给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。输入: num1 = “2”, num2 = “3”输出: “6”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/multiply-strings著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路常规思路: 1234 * 456 = 1234 * 6 + 1234 * 50 + 1234

2021-07-10 21:49:26 1479

原创 MySQL explain 含义解析

id 表示一个查询中各个子查询的执行顺序,id相同执行顺序由上至下。 id不同,id值越大优先级越高,越先被执行。id为 null 时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。select_type 表示查询中每个 select 子句的类型:SIMPLE 不包含任何子查询或union等查询PRIMARY 包含子查询最外层查询就显示为 PRIMARYSUBQUERY 在select或 where字句中包含的查询DERIVED from字句中包含的...

2021-07-10 15:58:37 151

原创 Java 关键字 Synchronized 与锁优化机制

锁优化锁消除JIT 通过逃逸分析技术,发现 synchronized 锁对象,只有一个线程能加锁锁粗化JIT 发现代码中有偏向锁轻量级锁重量级锁自适应锁

2021-07-08 22:34:25 137 2

原创 数组全排列

概述给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/permutations著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路DFS 实现public class 全排列 {

2021-07-08 22:02:00 336

原创 常见的缓存中间件缓存击穿、缓存穿透、缓存雪崩问题与解决方案

概述面试中常常被问到 缓存击穿、缓存穿透、缓存雪崩 指什么以及对应的解决方案,下面进行详细总结:缓存穿透指查询一个不存在的数据,缓存中没有,数据库中也没有;解决方案:布隆过滤器,向布隆过滤器中添加一个元素 key 时,我们通过多个 hash 函数,算出对应的值,然后将这个值所在的方格置为 1。查询的时候也是计算 Hash 值,若有一个格子不为 1,那么说明元素肯定不在数组中。布隆过滤器可以判断某个数据一定不存在,但是无法判断一定存在。对空结果进行缓存返回缓存击穿指查询一个热点 k

2021-07-08 21:27:42 162

原创 Redis 跳跃表的实现

概述跳跃表 SkipList 是一种有序数据结构,通过在每个节点中维持多个指向其它节点的指针,达到快速访问节点的目的平均时间复杂度 O(logN),在大部分情况下,跳跃表的效率与平衡树相近,由于跳跃表实现的简易性,所以 Redis 使用跳表代替平衡树。为什么用跳跃表...

2021-07-08 20:36:57 261

原创 二叉树的锯齿形层序遍历

概述给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路其实就是层次遍历,与层次遍历不同的是每一层的遍历结果,是头插还是尾插的区别思路/** * Definition fo

2021-07-06 22:59:29 305 2

原创 找出数组中的多数元素

概述给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/majority-element著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路排序后取中间元素时间复杂度 O(nlogn)空间复杂度 O(logn),使用语言自带的排序算法的栈空间同归于尽法

2021-07-06 22:01:39 684

原创 Java 多线程关键字 ThreadLocal 学习

基于 JDK 1.8介绍线程局部变量使用场景对这个变量的操作,其它线程不可见,这样就避免的对共享变量的操作而造成的并发问题。怎么用声明:ThreadLocal threadLocal = new ThreadLocal<>(); T 表示泛型,表示支持放入任意形式的对象set get 方法:threadLocal.set(“123”);String temp = test.threadLocal.get();源码学习set 方法,每个 .

2021-07-02 09:54:18 133

原创 为什么枚举类是单例模式?

反射克隆序列化https://www.cnblogs.com/call-me-pengye/p/11214435.html

2021-06-30 10:44:05 2795 1

原创 Spring 中设计模式的应用

Spring 中用到的设计模式工厂方法工厂方法定义:父类定义了创建对象的接口,但是由子类来具体实现,工厂方法让类把实例化的动作推迟到了子类当中。例如实现了 FactoryBean 接口的类,Spring 可以利用 getObject() 方法返回实现了该接口的类的实例;AbstractFactoryBean 实现了 FactoryBean 接口,由子类去实现 createInstance 的逻辑public abstract class AbstractFactoryBean<T>

2021-06-29 20:42:06 108 2

原创 最长回文串

概述给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-palindrome著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。思路回文串要保证串中的字符出现次数为 2 的倍数,且最多只有一个奇数出现次数的字符。将字母

2021-06-27 20:44:10 122

原创 常见 TOP K 问题的解决思路

概述类似 TOP K 问题:1 亿 个数中找出最大的 100 个1 亿个浮点数,怎么找出第 5 大的数1T 的数据存储用户访问信息,机器内存只有 16 G,如何查出访问频率最高的前 1000 个用户思路堆排序若数据量比较小,机器内存空间较大,直接使用一个小根堆或者大根堆保存 TOP K 的数据,每次遍历的时候与堆的根元素进行比较,并调整堆中的元素。空间复杂度:O(1)时间复杂度:O(NlogK),N 为总数据量,K 为要求的前 K 个数的值分治 + 堆排序机器内存紧张,可以将大的数

2021-06-27 18:52:14 242

原创 打开转盘锁

题目介绍你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 target 代表可以

2021-06-25 23:03:01 195

原创 AtomicInteger 源码学习

123

2021-06-24 22:02:07 102 1

原创 二进制中1的个数

请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。利用已有工具类public class Solution { // you n

2021-06-23 20:44:48 90 1

原创 二进制手表

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。例如,下面的二进制手表读取 “3:25” 。给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。小时不会以零开头:例如,“01:00” 是无效的时间,正确的写法应该是 “1:00” 。分钟必须由两位数组成,可能会以零开头:例如,“10:2” 是无效的时

2021-06-21 21:44:52 621

原创 Spring Bean 生命周期以及源码分析

生命周期Bean 生命周期指的是单例模式下, Bean 的创建,应用,销魂的整个过程BeaFactory 读取 Bean 定义,生成实例setter 属性注入若 BeanNameAware 接口,执行 setBeanName 方法若 BeanFactoryAware 接口,执行 setBeanFactory 方法若实现 BeanPostProcessor 接口,执行 processBeforeInitialization执行 InitializingBean的afterPropertiesS

2021-06-20 22:30:25 134 1

原创 Mybatis-plus 集成到项目中报 NoClassDefFoundError 排查总结

最近项目接入 mybatis 的时候,程序死活起不来,提示 NoClassDefFoundError 错误。错误如下:Caused by: java.lang.NoClassDefFoundError: com/baomidou/mybatisplus/annotation/InterceptorIgnore at com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper.initSqlParserInfoCache(Intercep

2021-06-19 11:20:26 12368

原创 Redis 持久化实现 RDB 与 AOF

RDB数据生成 rdb 结尾的快照文件,采用二进制 + 数据压缩的方式写磁盘,体积小恢复快,适合全量复制。手动触发save,阻塞 Redis 服务器不能处理任何请求,禁止使用bgsave,创建子进程,让子进程创建快照;同一时刻只会有一个 bgsave 命令执行,避免产生竞态条件自动触发配置文件 save m n,m 秒内发生 n 次变化时,触发 bgsave;save m n 可以多行,主要满足一条即可触发。Redis的 save m n,是通过serverCron函数、dirty 计

2021-06-12 18:03:41 79 1

原创 Redis 字典的实现以及渐进式 Rehash 过程

Redis 字典Redis 字典 dict 用途有两个,首先实现数据库键空间(Key space),Redis 是一个保存键值对的数据库,数据库的键值对由字典保存,每个数据库都有一个对应的字典, 这个字典被称之为键空间(key space)。其次字典 dict 还作为 Hash 类型键的底层实现之一,当 Hash 类型的键使用 hashtable 编码时,也使用 dict 进行存储。Redis 采用链地址法解决 key hash 冲突问题,以头插的方式插入到冲突节点的前面。底层源码单机 Redi

2021-06-12 15:22:30 253 2

原创 NGINX 配置端口转发样例

多个 Springboot 项目运行在不同端口,通过不同路径转发到不同端口http://127.0.0.1:8081/index 访问 webAhttp://127.0.0.1:8082/index 访问 webBhttp://127.0.0.1:8083/index 访问 webC修改后:http://127.0.0.1/a/index 访问 webAhttp://127.0.0.1/b/index 访问 webBhttp://127.0.0.1/c/index 访问 webChttp {

2021-06-08 23:17:41 1028 1

原创 日志框架学习及Log4j 2 概念整理

日志框架分类日志框架按照功能可以分为日志接口、日志实现两部分。编写程序时,推荐使用日志接口的 API 进行方法调用,然后使用对应的日志实现框架打印日志。常用日志框架的使用方式为: Log4j2-api(接口) + Log4j2-core(实现)。SLF4J(接口)+ 其它日志框架实现。日志接口,日志的接口规范,它对用户提供了统一的日志接口,屏蔽了不同日志组件的差异。Apache Commons Logging Component,2014 年之后文档没有再更新SLF4J(Simple

2021-06-08 23:15:13 609

springboot+dubbo timeout retries 验证

springboot+dubbo timeout retries 验证 原文地址 https://blog.csdn.net/u013151053/article/details/116949588

2021-05-18

springboot集成Prometheus多标签计数器方案实现

springboot 2.X 项目集成 Prometheus ,计数器实现多标签累加,博客参考:https://blog.csdn.net/u013151053/article/details/108664709

2020-09-18

自己动手写Java虚拟机

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

2017-09-02

SSM框架搭建

把数据库改为自己的就行 逻辑照着对应的Demo写就行

2017-05-10

空空如也

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

TA关注的人

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