自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 HsahMap 和 ConcurrentHashMap(1.8)

ConcurrentHashMapput()方法 final V putVal(K var1, V var2, boolean var3) { if (var1 != null && var2 != null) { 1 int var4 = spread(var1.hashCode()); int var5 = 0; ConcurrentHashMap.Node[] var6 = thi

2020-10-29 21:47:23 125

原创 SpringBoot整合Shiro,mybatis,thymeleaf学习笔记

1 理论Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。用户名密码身份认证流程授权流程授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的完整的身份认证和权限管理(基于URL的拦截)1.1 三个核心组件:Subject, SecurityManager 和 Realms.1.1.1Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅

2020-08-18 16:12:17 234

原创 RabbitMq笔记

基础操作rabbitmqctl stop_app : 关闭应用rabbitmqctl start_app : 启动应用rabbitmqctl status : 节点状态rabbitmqctl add_user username password : 添加用户rabbitmqctl list_users : 列出所有用户rabbitmqctl delete_user username :删除用户rabbitmqctl clear_permissions -p vhostpath username

2020-07-15 23:08:50 149

原创 前后端交互接口逻辑编排复盘

其中查询核心数据需要1.5s,查询非核心数据1和非核心数据2则都需要3s,故一次http请求则需要7.5s。如果查询非核心数据1或者非核心数据2失败,那么http请求也会被阻断,当前逻辑是不符合正常预期的。在上述优化之后的一把梭写法中,http请求的显示已经排除了非核心数据的影响。根据上述的结论,非核心的数据在页面上的显示维度应该具备一定的容错。在笔者工作中遇到的前后端交互的项目中,后端处理并返回数据,前端进行显示数据时,会有核心数据和非核心数据的区别。查询非核心数据1失败也不会阻断整个http的请求。

2024-01-16 15:18:26 367

原创 如何优雅的进行异步编排

该方法是对runAfterBoth()方法和thenCombine()方法的特点进行了折中,调用thenAcceptBoth()方法,第三个任务可以接收其合并过来的第一个任务、第二个任务的处理结果,但是第三个任务(合并任务)却不能返回结果。在进行传统的RPC调用时,同步RPC调用是一段相当耗时的过程。从方法的声明可以看出,thenRun()方法同thenApply()方法类似,不同的是前一个任务处理完成后,thenRun()并不会把计算的结果传给后一个任务,而且后一个任务也没有结果输出。

2024-01-15 17:42:58 1018

原创 设计模式复盘

设计模式实战复盘

2024-01-15 17:39:42 525

原创 本地缓存:Caffeine入门使用

Caffeine是一款基于jdk8实现的缓存工具,在设计上参考了google的Guava cach组件,可以理解为是一个Guava Cache的加强版本,性能也是在其基础上有了提升。来查看组件的源码 ,并且他还编写了ConcurrentLinkedHashMap工具类,也被用于缓存的底层数据结构,这个类就是Guava cache的基础。我们知道Guava cache是基于LRU算法实现的一种缓存工具,LRU算法的缺点是短暂持续性冷数据流量会导致热数据的淘汰,造成数据的污染。

2023-12-28 17:19:34 1093

原创 如何优雅的调用三方接口

在我毕业的第一年过程中,底层数据交互的对象一般都是自己的DB,基本上没有从第三方获取过数据,所以也没有封装过这部分的工具类。直到前段时间,新增的应用中需要大量获取三方数据,基本上没有DB发挥的余地。上面的代码写一次还好,两次也还行,三次有点冗余了。到最后应用中到处都是tra catch和异常日志,严重影响美观和代码的规范。最初是通过try catch 的普遍写法进行code,但是写久了之后就发现,每回都需要写try catch等异常捕获的代码,显得代码很冗余,也很费时费事,例如下面的代码。

2023-12-05 15:52:37 432

原创 InnoDB的数据存储结构

页a,页b,页c.....页n,这些页都可以不在物理结构上相连,只要通过双向链表关联即可。每一个数据页中的记录都会按照主键值从小到大的顺序组成一个单向链表,每一个数据页都会为存储在它里面的记录生成一个页目录,在通过主键值查找某一条记录时,可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。

2023-12-05 15:20:43 972

原创 线程池原理初探

混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这两个任务执行时间相差太大,则没必要进行分解。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。配置线程池有两点建议:第一,使用变量(如CPU的个数,连接池的大小)来动态配置线程池大小,这样做可以增加线程池的可伸缩性,即当CPU增加时,线程池的处理能力相应增加。

2023-12-05 15:12:11 866

原创 索引的数据结构

索引是存储引擎用于快速查找数据记录的一种数据结构,就好比一本书籍的目录部分,通过目录快速定位文章的页码,便可快速查找对应的文章。MySql也是一样的道理,进行数据查找的时候,首先看查询条件是否命中了某条索引,符合则通过索引查找相关数据,不符合则需要全表扫描,需要一条一条的查找记录,直到找到符合记录的数据为止。如上图所示,数据库在没有索引的情况下,数据分布在硬盘不同的位置上面,读取数据的时候,摆臂需要前后摆动读取不同位置的数据,这样很耗费时间。如果数据顺序摆放,那么数据1 - 6也需要按顺序读取,这样就相当于

2023-12-05 15:09:37 919

原创 观察者模式来啦

观察者模式本质上就两个关键的操作,观察者关心自己订阅的主题,主题数据有变化需要通知所有的观察者。

2023-12-05 14:12:50 749

原创 门面模式来啦

门面模式也叫外观模式在许多源码和实际案例中都有使用,例如后端代码框架MVC模式,slf4j源码使用等。

2023-10-31 15:54:21 83

原创 装饰器模式来啦

装饰器模式通过嵌套包装多个装饰器对象,可以实现多层次的功能增强。每个具体装饰器类都可以选择性地增加新的功能,同时保持对象接口的一致性。

2023-08-17 16:46:52 232

原创 桥接模式来啦

看图桥接模式本质上是两类不同对象的组合并完成同一个动作,其中把握好变化点(抽象类/接口)和变化点(抽象类/接口)的组合即可。例如斡旋造化神通是属于天道法则的变化点(因为天罡三十六神通都是参悟天道法则而成),手、枯藤也是属于神通载体的变化点(载体也可以是其他东西,例如树杈),然后对变化的进行组合和变化点的行为组合对了,你是女娲大神手捏的还是枯藤甩的👀。

2023-08-08 20:00:06 439

原创 适配器模式来啦

文章中一开始就说过代理模式和适配器模式是有相似的,get到了吗🤔代理模式和适配器模式(对象)都是以对象组合的方式进行代理和适配,不过不同的是代理相当于游戏中给游戏角色上外挂,只是对原有能力的增强。例如刺激战场的自动瞄准挂,原本角色就能开枪干人只是中不中的问题,加了外挂增强开枪干人的命中率并没有改变本质行为。适配模式则是本质上的改变,别人是开枪干人,结果你适配成开战斗机扫射。立秋 渐寒 添衣 勿病 安好。

2023-08-08 11:43:32 702 1

原创 代理模式来啦

静态代理对于这种,被代理的对象很固定,我们只需要去代理一个类或者若干固定的类,数量不是太多的时候,可以使用,而且其实效果比动态代理更好,因为动态代理就是在运行期间动态生成代理类,所以需要消耗的时间会更久一点。总结来说:目标类和代理类实现了相同的接口,在代理类中依赖了目标类,代理类的方法中调用了目标类的方法,并做了一些增强性的工作。动态代理指的是:在程序的执行过程中,使用jdk的反射机制,创建代理对象,并动态的指定代理的目标类。在出租房子的行为中,房东提供房源才是行为的基础,中介只是起到增强的行为。

2023-07-24 20:55:22 354

原创 构造者模式来啦

是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

2023-07-20 20:45:38 51

原创 单例模式来啦

这种做法与上面那种最无脑的同步做法相比就要好很多了,因为我们只是在当前实例为null,也就是实例还未创建时才进行同步,否则就直接返回,这样就节省了很多无谓的线程等待时间,值得注意的是在同步块中,我们再次判断了synchronizedSingleton是否为null,解释下为什么要这样做。上面的做法很简单,就是将整个获取实例的方法同步,这样在一个线程访问这个方法时,其它所有的线程都要处于挂起等待状态,倒是避免了刚才同步访问创造出多个实例的危险,但是,这样的设计实在是糟糕透了,这样会造成很多无谓的等待。

2023-07-12 17:20:12 531

原创 设计模式总纲

单例模式

2023-07-12 17:16:05 291

原创 Cannot resolve symbol ‘xxx‘

当前下载的依赖包里面有一个usa- common的依赖,这个依赖在当前依赖包里面定义的是1.8.23的版本,但是在之前的依赖包中,也有一个usa- common的依赖,这个依赖包在之前的依赖包中定义的版本是1.7.0,所以下载usa- common依赖时会发生冲突,那么Maven会以依赖路径短的作为当前下载的版本,也就是说,当前依赖的版本下载错了,应该是1.8.3,但是下载了1.7.0。2.1的方法如果还是不行,那么就把本地仓库中关于这个依赖的所有文件全部删除,然后重新下载。2.1 刷新Maven。

2022-12-22 14:29:40 500 1

原创 Variable used in lambda expression should be final or effectively final

在lambda表达式或匿名内部类中使用的外部变量应该加上final修饰符,因为java 8 新特性导致一些外部变量没有加final修饰符,依然可以在lambda表达式或匿名内部类中使用。在Java中,参数之间的传递是值传递,不管是实例变量还是数组,在传递的过程中传递的都是引用,并且引用并没修改(满足Lambda表达式访问外部变量一个非常重要的限制:就是变量不可变),所以当前实例变量的引用依然是隐式final修饰,在lambda表达式中修改的是引用指向的值,并没有修改引用。2、为什么外部变量加了修饰符。

2022-12-13 16:05:18 886

原创 Optional详解

Optional 就好像是一个包装类,可以把具体的数据封装到 Optional 对象内部,然后我们去使用 Optional 中封装好的方法操作封装进去的数据就可以非常优雅的避免空指针异常

2022-11-15 16:52:32 1122

原创 MetaQ(RocketMQ)

经典的Producer,Broker,Consumer消费模型,不同类型的消息以不同的Topic来区分。例如付款系统,在付款成功之后,正常做法是通知外围系统这个单子付款成功了,或者是外围系统定时来拉取付款结果,使用MQ后,付款系统可以在付款成功之后,将消息放到MQ里面,想知道这个结果的系统订阅这个主题的消息即可,非常方便,也不需要定时去拉取数据了。使用MQ,可以将需要处理的消息全部放入其中,系统按照最大处理能力,去获取消息进行消费,这样就可以将一瞬间过来的请求,分散到一段时间内进行处理,避免了系统的崩溃。.

2022-08-14 14:05:30 2189

原创 Notify

Notify

2022-08-07 17:09:20 674

原创 JWT详解

JWT详解

2022-04-18 11:13:15 3133

原创 一张图看懂finalize()执行流程

2022-04-06 15:47:53 247

原创 一张图看懂分库分表

2022-04-06 15:46:49 226

原创 一张图看懂线程池

线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。通过继承线程池并重写线程池的beforeExecute,afterExecute和terminated方法,我们可以在任务执行前,执行后和线程池关闭前干一些事情。largestPoolSize:线程池曾经创建过的最大线程数量。如等于线程池的最大大小,则表示线程池曾经满了。上面的流程分析让我们很直观的了解的线程池的工作原理,让我们再来看看源代码是如何实现的。通过线程池提供的参数进行监控。

2022-04-06 15:45:44 72

原创 设计模式实战案例

1 设计模式设计模式源码https://gitee.com/practice-pine/design-pattern/tree/master/src/main/java/com/lian/song/designPattern

2022-04-06 15:40:12 363

原创 一张图看懂Spring的生命周期

2022-03-17 09:52:34 321

原创 Spring事件监听

1 案例分析引用 : https://zhuanlan.zhihu.com/p/1011286721.1假设业务场景用户下单成功之后,平台需要发送短信通知下单成功最直观的写法public void order(){ // 下单成功 System.out.println("下单成功..."); // 发送短信 sendSms();}假设过了一个月之后,下单成功之后,还需要通知物流系统发货于是就需要修改原有代码public void order(){ // 下单成功

2022-03-17 09:48:48 309

原创 Spring事件监听原理

1 简述Spring的生命周期不论是Spring的监听机制原理还是Spring AOP的原理,都是依托于Spring的生命周期,所以要了解Spring的监听机制原理就需要先了解Spring的生命周期简述Spring生命周期1 创建类扫描器和注解解析器赋值给BeanFactory2 将传入的主配置类的信息封装成BeanDefinition放入BeanFactory的BeanDefinitionMap3 根据主配置的BeanDefinition去扫描所有的Bean类,并且将相应的类信息封装成BeanD

2022-03-17 09:46:55 1624

原创 一张图看懂java类加载

2022-02-20 20:23:27 212

原创 一张图看懂Java集合

2022-02-20 20:22:41 191

原创 一张图看懂JVM

2022-02-20 20:21:27 906

转载 如何上传自己的jar包到maven中央仓库(2021最新版)@gpg没有运行的问题

原文连接 : https://juejin.cn/post/6997794615000580127其中的一步是安装gpggpg 未运行的问题1 我在安装4.1 步骤的时候,gpg死活不能运行,试过网上所欲的方法,什么重新安装啊、安装目录不能有中文字符啊,都试了,还是不行,搞了我整整一天,最后,累了,毁灭吧,不弄了。不能运行的效果,给大家参观参观第一种 : 生成主键的时候,生成不了,说gpg 没有运行然后一看果然没有运行。2 过了一天之后,越想越气,我不能吃这个亏啊,md。然后上班的.

2022-01-29 16:52:52 94

原创 excel导入导出封装@拿来即用

excel-start1 介绍基于poi的excel导入和基于Jxls的excel导出的基础上进行封装,简化excel的导出和导入,只需要三步即可完成之前需要大量代码实现的功能。2 安装教程<dependency> <groupId>com.gitee.practice-pine</groupId> <artifactId>excel-start</artifactId> <version>1.0</versi

2022-01-25 10:12:11 655

原创 自定义注解 + AOP

appoint-api介绍需要在指定接口的前后处理一些与业务逻辑无关的事务,并且不会影响业务逻辑的运行。例如日志记录,性能监控,访问拦截、权限控制(基于Api的权限控制)等等。安装教程<dependency> <groupId>com.gitee.practice-pine</groupId> <artifactId>excel-start</artifactId> <version>1.0</version&

2022-01-25 10:07:42 109

原创 excel导出条数和显示的条数不一致(Mysql)

excel导出条数和显示的条数不一致(Mysql)1 问题我在写excel导出的时候,发现我导出的数据只有100条数据,但是前端分页显示器上面显示有203条,后来我把执行的SQL,放到Navicat里面执行发现显示条数和查询条数依然不一致。可以看到查询的条数只有100条但是统计条数的话有203条2 原因后来进过研究发现,MYSQL会默认查询条数,有的版本是100,有的版本是1000,必须有默认3 解决1 修改默认值,修改为适合的数值1.1 Navicat修改工具 - 》 选项 -》数

2021-12-28 17:13:34 1203 3

Docker入门

docker安装,常用命令,docker原理,容器数据卷,dockerfile,docker网络

2021-01-18

空空如也

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

TA关注的人

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