自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 静态内部类和 内部类区别

静态内部类与非静态内部类(成员内部类)的区别在于,静态内部类不需要依赖外部类的实例而可以被实例化。静态内部类通常用于封装与外部类紧密相关的一组静态方法或常量。

2023-10-28 16:47:51 105

原创 @RequiredArgsConstructor用法

在我们写controller或者Service层的时候,需要注入很多的mapper接口或者另外的service接口,这时候就会写很多的@Autowired注解,代码看起来很乱lombok提供了一个注解:@RequiredArgsConstructor(onConstructor =@_(@Autowired))写在类上可以代替@Autowired注解,需要注意的是在注入时需要用final定义,或者使用@notnull注解...

2021-10-14 10:12:46 34354 4

原创 idea 每次刷新maven 拉取最新的SNAPSHOT包

idea勾上这个,每次刷新maven都会拉取最新的SNAPSHOT包,默认是一天拉取一次,已知的同学请忽略此消息。

2021-08-18 15:29:56 4073

原创 SpringBoot Logback 日志文件地址 多环境配置

起因最近看了一下自己负责的项目的日志配置,发现了一些问题1.日志文件都是放在当前项目目录下2.windows和linux的日志配置文件没法区分所以我打算解决一下这个问题,让查看日志更加方便基础知识logback slf4j log4j 的区别log4j :是log for java的简称,也是以前 (大概算2017以前)吧,主流的日志记录工具SLF4J:(Simple Logging Facade for Java,即Java简单日志记录接口集)是一个日志的接口规范,简单来说他就是一个类似适

2021-08-06 18:16:12 1624

原创 IntelliJ IDEA 查找 替换 使用正则表达式

全局查找表达式: A.*?B(“.“表示任意字符,“?”表示匹配0个或多个)特殊符号要用\转义替换使用正则表达式匹配字符串,并对匹配的内容进行捕获,.*匹配provided或者test,()定位捕获位置,如下:<!-- <scope>(.*)</scope>-->替换内容,如下:<scope>$1</scope>1执行replace all,就可以完成所有位置取消注释,同样注释多个位置也可以使用相同的操作。...

2021-07-27 16:43:16 2559

原创 spring cloud 整合 consul+openfeign

目标最近发现公司在一些新项目中用到了Spring cloud 相关技术栈,而恰好我对这一块不是很熟,所以打算自己搭建一下环境来熟悉一下springcloud开发体系。Spring Cloud 和 Spring Boot版本选择由于spring cloud 是以一系列 组件的集合,并且都基于springBoot,所以我们搭建 spring cloud体系时,需要注意 两件事情注意springBoot的版本和spring Cloud版本匹配访问 https://start.spring.io/ac

2021-07-06 11:34:28 882

原创 ObjectMapper.readValue 时间转换错误 转换时间时间被自动+8小时

ObjectMapper json 转换时间时间被自动+8小时ObjectMapper.readValue;解决方法:@JsonFormat注解中的timezone属性设置为:@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

2021-07-05 17:18:55 1439

原创 Mysql 5.7解压版 安装

前言最近电脑换了 ,又得重新安装mysql ,每次都找教程太麻烦了,这次直接写一个吧. 做个免安装版的教程,直接解压配置安装下载地址版本:MySQL 社区版(也就是我们常用的白嫖版) 5.7.23(随便选的)官网地址 老是 要oracle 账号 太麻烦我这里找的华为云镜像(虽然也需要账号,但是他下载速度最快)https://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/阿里云:他在维护搜狐镜像:(不用账号,速度有点慢)http://mi

2021-07-02 10:36:02 102

原创 Swagger2 及knife4j使用

Swagger2 及knife4j使用最近项目中用到了 Swagger2 和knife4j作为接口文档。所以自己简单搭建了一套环境学习下,总体体验下来,这个框架很方便也很简单易用。Swagger2 和 Swagger-uispringFox官方推荐的是Swagger2 和 Swagger-ui配套使用maven依赖<dependencies> <dependency> <groupId>io.springfox</groupId&

2021-06-24 14:40:47 1745

原创 idea find栏 多窗口打开

问题:在使用idea时,我们经常会用到查找上级调用方法,但是idea 默认只展示当前find结果,如下图:这样我们要找历史的结果,就不太好操作。解决办法:在右侧 设置图标->view options->Open results in New Tab.这样就可以保留历史find结果了...

2021-05-14 19:39:17 1516

原创 《30天自制操作系统》笔记 第1 2天

前言​ 从大学学习计算机开始算起,有7,8 年了,学了很多语言 ,也学了很多框架,虽然我们用他们开发了很多应用,但是当我们深入他们的底层时会发现最终是调用操作系统(linux)中的实现,比如:java中 AQS 的unsafed.park(),又或者 NIO中 poll epoll的实现。所以现在挺希望僚机操作系统相关原理,看那种原理书,有显得太累,所以选了这本《30天自制操作系统》,开个专题完成这里面的主要知识。第一天和所有的语言一样完成,输出hello word工具:virtual box

2021-04-30 18:20:52 98 1

原创 dubbo SpringMVC 统一异常处理

https://zhuanlan.zhihu.com/p/111947357前言在一般的项目中,我们总是会遇到各种各样的异常,如果每次都用try-catch就太麻烦了,所以我们的系统中需要一种统一的异常处理,幸好这种问题早就有了解决方案。下面来了解一下SpringMVC 和 dubbo的解决方案SpringMVC 统一异常处理这里使用最简单的@ControllerAdvice和@ExceptionHandler来实现@ControllerAdvicepublic class MyExceptio

2021-04-25 17:18:41 415

原创 redis集群如何扩容在线扩容的?

问题由来我们知道redis的集群有16384个槽,集群中的每个节点会对应一部分的槽key通过CRC16校验后对16384取模,来放置到槽中。但是在生产中,我们集群的大小是需要调整的。那他是怎么进行扩容的呢?添加节点对一个包含7000、7001、7002三个节点的集群来说,我们可以向这个集群添加一个IP为127.0.0.1,端口号为7003的节点(节点7003):– cluster meet 127.0.0.1 7003重新分片然后执行 cluster nodes,这样redis cluster

2021-04-16 16:04:33 1415

原创 mysql原理:mysql存储结构 和 b+树有什么关系?

我们都知道mysql的innodb变长字段长度列表 :如果 列长度消除255字节 用1字节表示 ,若大于 255字节,用2字节表示。(因为varchar 最大长度为2^16次方 65535)Null标志位:1个字节,有该行的某列是否null值。如果有null值,则该列所在的位将由0变为1。记录头信息:固定占5字节(40位)delete flag 第3位 该行是否已被删除。heapno:13位 索引堆中 该记录的排序记录next_record:16位 页中下一条记录的相对位置record.

2021-04-08 14:16:31 223

原创 new String(“123“)会创建几个对象

解释1.如果字符串常量池中有"123",则不会创建,如果没有则会创建2.同时在堆中创建"123"这个对象深入理解字符串常量池中的“123”public class StringTest { public static void main(String[] args) { String s = "1"; }}结论:常量池中的 "23"是在编译期就已经指定了证明:使用jclasslib查看发现代码中 “1”指定为#2继续追踪可以发现在 class文件的

2021-03-31 16:11:33 154

原创 策略模式探究(二)多个门禁对接使用策略模式

业务背景我们系统集成许多门禁厂商,对客户提供统一的远程开门,钥匙授权等功能,这种涉及到多个系统对接的就特别适合使用策略模式。那我抽离了我们的代码,以这样一个场景《门禁厂商推送钥匙授权》来完成本片文章。带着问题看文章首先我先上一篇文章的问题放在前面,接下来的内容有这两个问题的解答一.在实际的场景中,策略模式的方法,传入的参数不是简单的参数,可能更加复杂,且可能完全不同,如何保证参数的传递?二.在实际的场景中,策略模式的方法,如果要和数据库进行交互,那在方法中应使用service的方法,还是DAO的方

2021-03-24 23:15:17 445

原创 策略模式探究(一)系统推送平台使用策略模式

本案例是最基础的 策略模式使用案例,他是用在我们的推送平台的业务中,基本设计模式思路如下图:首先抽象 推送业务生成 推送平台处理接口 PushPlatformChooser,极光推送 和信鸽推送 实现具体的接口方法 。@Componentpublic class JPushSolver implements PushPlatformSolver { // 这里标明 推送平台 为Jpush,存放到容器和获取都是以此来进行区分 @Override public String sup

2021-03-24 23:11:23 177

原创 多线程交替打印 condition和semaphore

经常被问 多个线程如何交替打印?下面来两种方式Rentrantlock 的 conditionclass ShareResource { private int number = 1;// 控制线程谁开始运行 private Lock lock = new ReentrantLock(); private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition();

2021-03-20 16:37:15 229 2

原创 CyclicBarrier(循环栅栏)理解

CyclicBarrier使用最简单使用public class CyclicBarrierTest1 { static CyclicBarrier c = new CyclicBarrier(7,()->{ System.out.println("集齐七龙珠 召唤神龙"); }); public static void main(String[] args) { for (int i = 0; i < 7; i++) {

2021-03-20 14:58:45 175

原创 thread 中的interrupt到底是什么意思?

来源在AQS中非常费解的看到段代码 public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();} static void selfInterrupt() { Thread.currentThread().interrupt();}自然而然就

2021-03-19 18:18:04 514

原创 G1垃圾收集器

本文只是随手记录,不一定完全正确存储概念G1算法将堆划分为若干个区域(Region),但仍然属于 分代收集器。在G1中还有一种特殊的区域,叫Humongous区域。如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象。这些巨型对象,它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对象,那么G1会寻找连续的H分区来存储。为了能找到连续的H区,有时候不得不启动

2021-03-17 14:47:34 203

原创 CMS(concurrent Mark sweep)垃圾收集器

作用1.8 老年代默认垃圾收集器过程1) 初始标记(CMS initial mark)1.会stw ,首先标记 GC root 对象。哪些是GC root对象呢?1.方法区中常量引用的对象。2.方法区中 类静态变量引用的对象3.虚拟机栈(栈桢中的本地变量表)中的引用的对象 ;4.本地方法栈中JNI的引用的对象2) 并发标记(CMS concurrent mark)根据 初始标记对象 找出所有存活对象并发执行(3)预清理阶段(待详细研究)处理前一个阶段因为引用关系改变导致没有标记到

2021-03-17 10:46:43 317

原创 dubbo服务调用过程

大致流程1.customer会先调用代理类 ,获取 invoker 然后进行 过滤 如 有服务降级到话 就进行 mockinver。再通过spi进行负载均衡。2.得到invoker后进行 构造请求头。通过netty 或者 本地暴露进行调用3.服务端收到请求后,会丢给线程池。业务线程会根据 servicekey从 exporterMap 获取对应的invoker,调用真正的实现4.客户端收到结果后会根据request 获取存储的feature。完成服务调用dubbo中服务调用的三种方式(2.6的方

2021-03-16 17:09:02 977

原创 Dubbo的服务暴露过程理解

从流程上来说:1.检查配置 如果检查某些配置为空就默认创建,并组装成url2.暴露服务,分别暴露本地服务和 远程服务为什么要搞个本地暴露呢因为可能存在同一个 JVM 内部引用自身服务的情况,因此暴露的本地服务在内部调用的时候可以直接消费同一个 JVM 的服务避免了网络间的通信。是否可以修改?如何修改不进行本地暴露可以通过 dubbo.provider.scope = remote来禁止本地暴露远程服务 就是通过netty来配置远程服务调用3.将服务注册到注册中心从对象构建转换的

2021-03-16 11:16:57 188

原创 ThreadLocal为什么会导致内存溢出?

解释就是可以看到 一般定义的 static threadLocal在栈中,但是 每个线程是有一个ThreadLocalMap的。所以虽然 在entry中 Threadlocal是一个弱引用,但是只是相对于 static threadLocal是,而每个线程自己的map却是强引用着 entry的。所以 线程一直没被销毁 ,对象就不会被垃圾回收从而导致内存泄漏https://zhuanlan.zhihu.com/p/102571059由于Thread中包含变量ThreadLocalMap,因此Threa

2021-03-12 10:16:27 332

原创 微信服务商模式实现退款 总结

实现思路:通过微信服务商模式实现退款:官方文档:服务商分账接口https://pay.weixin.qq.com/wiki/doc/api/allocation_sl.php?chapter=24_3&index=3商户分账接口:https://pay.weixin.qq.com/wiki/doc/api/allocation.php?chapter=26_1问题 :https://developers.weixin.qq.com/community/pay/doc/0002848

2021-02-02 15:07:02 1611

原创 JVM之虚拟机栈(四)栈帧中的 方法返回地址和一些附加信息

方法返回地址(return address)存放调用了该B方法的上一级方法A(栈帧)的 pc寄存器 中的值 (即要执行的下一条指令的指令地址)。将指令地址返回给执行引擎去执行方法A的下一条指令。一个方法的结束,有两种方式:正常执行完成;正常调用完成。出现未处理的异常,非正常退出。异常调用完成无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置。方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈

2021-02-01 16:22:09 637

原创 JVM之虚拟机栈(三)栈帧中的 动态链接与方法调用机制

动态链接每一个栈帧当中都包含一个指向运行时常量池中该栈帧所属方法的引用(invokedynamic指令)在java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在class文件的常量池里比如:描述一个方法调用的另外的其它方法时,就是通过常量池中指向该方法的符号引用来表示,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。动态链接,就有静态链接,其概念都来自方法调用中的绑定;方法调用:静态链接:当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编

2021-02-01 16:21:55 512

原创 JVM之虚拟机栈(二)栈帧中的操作数栈

操作数栈是什么?1.主要用于保存计算过程到中间结果,同时作为计算过程中变量临时的存储空间2.操作数栈是数组,在代码编译过程中就已经确定了大小,保存在方法的code属性中,为max_stack可以通过jclasslib bytecode viewer 查看3.如果被调用到方法带有返回值得话,其返回值会被压入到当前栈帧的操作数栈中,并更新pc寄存器中下一条需要执行的字节码指令(这里就和pc寄存器关联起来了)和pc寄存器 、局部变量表等的关系总结:字节码指令是操作指令集,局部变量表是变量的存储器,

2021-02-01 15:00:14 291

原创 jvm之PC寄存器

Pc寄存器是什么?1.Pc寄存器是用来存储指向下一条指令的地址,然后由执行引擎读取PC寄存器中存储的下一条指令2.PC寄存器内存区域很小,它是当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。pc寄存器和虚拟机栈的关联是什么?如下图可以看到pc寄存器存储的是虚拟机栈帧中操作数栈的行号同时可以看到 PC寄存器中存储的就是操作数栈的指令地址,交由java的执行引擎执行1.使用PC寄存器存储字节码指令地址有什么用呢(为什么使用PC寄存器记录当前

2021-01-27 20:36:15 405

原创 springBoot整合mybatis druid P6Spy 打印可执行sql

最近开发环境的不打印执行sql,但是我又不知道是哪个地方配置错误,因为不是自己搭的,所以打算自己重新搭建一下springBoot整合mybatis。顺便记录一下。总共分为三个部分SpringBoot 集成mybatis新建项目idea 中选择 mybatis jdbc 2个 (下图的 mysql 可以不选)注意:我这里的项目 都是在test中运行的,所以没选web模块,因为没必要或者直接pom.xml中引入如下配置 <dependency>

2020-11-28 21:57:44 1757

原创 redis zset我之见

Zset案例先看一个最简单的zset案例alpha:3>zadd key 1 tom # 添加key"1"alpha:3>zadd key 2 yorick"1"alpha:3>zadd key 3 yorick # 这里事实上是 将yorick 的score 由2改为了3"0"alpha:3>zrange key 0 10 withscores #查询指定区间内的 成员,并连key 一起返回 1) "tom" 2) "1" 3) "yorick"

2020-11-23 18:56:05 79

原创 解决mysql select replace UUID()重复的问题

工作中经常会需要提交sql 修复数据,我们id是用的uuid,然后一般插入数据需要用到replace(UUID(),‘-’,‘’)函数,在这其中就会遇到一个问题:在我们测试环境,在批量生成id时,replace(UUID(),‘-’,‘’) 的结果会相同,如下图:可以看到 replace出来的FID是相同的解决方式使用 REPLACE(@id := UUID(), ‘-’, ‘’) 函数运行结果如下图:原因查了一些资料,发现replace(UUID(),‘-’,‘’) 重复的问题存在于 m

2020-11-20 11:00:50 3971 1

原创 redisson watchdog 使用和原理

redisson watchdog 使用和原理最近研究redisson分布式锁,有了一些收获特此记录一下首先redisson加锁的基本流程图如下:这里面我最难以理解的一点是 watchdog机制。找了很多资料,最后基本弄明白了 watchdog的使用和 原理。首先watchdog的具体思路是 加锁时,默认加锁 30秒,每10秒钟检查一次,如果存在就重新设置 过期时间为30秒。然后设置默认加锁时间的参数是 lockWatchdogTimeout(监控锁的看门狗超时,单位:毫秒)官方文档描述如下

2020-11-19 16:07:57 14808 10

原创 redisson RocketMQ秒杀下单实战总结

之前完成了一个秒杀下单系统的开发,现在总结一下,起因业务场景是社区电商, 疫情期间,社区准备了一批口罩,打算分批让用户抢购。那时我们还在过年,客户也没通知我们,然后我们这个小电商系统,在当晚就挂掉了。下面是我们当时的架构:类似下面稍微思考到这个架构的问题,用户下单时,redisson进行加锁时,会让其他线程等待。所以在并发大时,会导致tomcat连接数超限。后面查询日志也证明了如此,所以当时临时的解决方案是,重启+增加应用容器。总算勉强度过。后面我们紧急改造了我们的业务j流程,变成了下面这样:

2020-11-12 20:38:51 1245

原创 SpringBoot集成Redisson

SpringBoot集成Redission引用redission start这里使用最新版spring: redis: port: 6379 host: 172.20.176.216 password: WjcR2019# timeout: 3000 database: 3 配置redis数据源我这里是单机版,所以基本配置如下spring: redis: port: 6379 host: reids主机地址 p

2020-11-05 21:03:50 773

原创 git取消远程仓库关联 并重新关联分支命令

不小心将本地仓库与远程仓库取消关联了,然后将所有的分支重新关联起来,花费了一点时间特此记录 !查看本地仓库的关联情况git branch -vv删除与远程仓库的关联 和重新关联仓库git remote remove repository_namegit remote add origin https://****.git重新关联分支重新关联仓库后 不能自动重新关联分支,需要手动关联git branch --set-upstream-to=origin/remote_branch y

2020-10-16 14:43:34 2457

原创 redis原理之快照(rdb)原理

redis 的持久化有两种 一种就是rdb 另一种就是 aof首先 看看rdb的配置,在redis.conf中 (yum安装 的话默认在 /etc/redis.conf)中save 900 1save 300 10save 60 10000900秒内,如果超过1个key被修改,则发起快照保存300秒内,如果超过10个key被修改,则发起快照保存60秒内,如果1万个key被修改,则发起快照保存redis rdb的文件保存位置,也是在 redis.conf中dbfilename dum

2020-09-11 16:11:26 1037

原创 redis原理之io线程模型

众所周知 redis是单线程的,但是他的QPS(Query Per Second) 又很高,也就是很快!那么是为什么呢?纯内存访问这个许多人都清楚,redis 将所有数据放在内存中,内存的响应时长大约为 100 纳秒,这是 redis 的 QPS 过万的重要基础。非阻塞IO这个也是重要的原因,了解非阻塞IO之前我们先了解一下什么是阻塞IO。什么是阻塞式 IO当我们调用 Scoket 的读写方法,默认它们是阻塞的。read() 方法要传递进去一个参数 n,表示读取这么多字节后再返回,如果没有读够

2020-09-03 19:20:46 256

原创 mysql数据库事务的四大特性(ACID)

Atomicity(原子性)是指事务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。Consistency(一致性)事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败Isolation(隔离性):事务A和事务B之间具有隔离性Durability(持久性)是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)...

2020-08-31 14:50:13 142 1

Spring Cloud视频教学

Spring Cloud视频教学资料在线学习。

2017-10-24

空空如也

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

TA关注的人

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