- 博客(117)
- 问答 (2)
- 收藏
- 关注
原创 深入理解 Java 线程池
线程池出现的背景:为了解决线程创建与销毁的高成本、资源竞争和调度复杂性问题。Java 常见线程池种类:FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPoolExecutor 以及 ForkJoinPool。官方推荐使用 ThreadPoolExecutor:因为它提供了灵活配置、透明内部实现和完善的异常处理,而 Spring 的 TaskExecutor 则是其封装版,便于与容器集成。核心参数与内部结构。
2025-03-17 20:40:19
668
原创 面试官:你在项目里使用过工厂模式吗?
工厂模式的解决方式创建对象逻辑复杂把对象创建交给工厂,调用方不用管细节新增消息发送方式需要修改大量代码只需新增实现类,工厂注册即可,扩展方便调用方与实现类耦合严重通过接口+工厂解耦,调用方只依赖接口代码冗长难维护工厂集中管理创建,易于维护// 新增方法,返回具体类型,如 "sms"、"email"getType 用来标识发送器的类型,供工厂自动识别。问题传统工厂模式Spring 结合改进后新增消息类型需要修改工厂注册逻辑仅新增实现类,自动识别耦合度高低扩展性较差极强。
2025-03-17 18:34:58
1074
原创 深入理解分布式锁机制
核心思路:通过 Redis 的原子命令和 Lua 脚本实现互斥锁,确保同一时刻只有一个客户端能持有锁。高级特性:重入机制允许同一线程多次获取同一锁;看门狗机制自动续期防止锁意外过期。扩展性:Redisson 提供多种锁模型(如公平锁、联锁等),满足不同分布式场景下的需求。这样,Redisson 的分布式锁既利用了 Redis 高性能、低延迟的特点,又通过一些机制(如重入、自动续期)提升了在复杂分布式系统中的可靠性和易用性。👉自动续期(看门狗机制)会不会让死锁无法释放?
2025-03-17 17:28:53
1044
原创 深入浅出分布式事务原理
2PC:两阶段提交阶段一(准备阶段):协调者让所有参与者准备事务(执行但不提交,预留资源)。每个参与者返回准备成功或失败。阶段二(提交阶段):所有参与者都准备成功:协调者通知提交。有任一失败:协调者通知所有参与者回滚。这是标准的数据库层面的实现(XA)AT 模式基于本地事务 + Undo 日志:每个分支事务在本地执行时,就像普通数据库操作一样,直接提交,但会自动生成 Undo 日志来记录数据修改前的状态。最终一致性:全局事务协调器(TC)在各个分支事务都执行完后,再统一决定全局确认成功或回
2025-03-16 12:15:37
651
原创 深入浅出:Spring事务传播和失效问题,小白也能理解。
事务传播行为的选择,需要根据具体的业务逻辑和对事务边界控制的需求来决定。是最常见的默认选择,而其他传播行为则用于更细粒度或特殊要求的场景中。确保正确的代理调用:将事务方法设为 public,避免同类内部调用导致代理失效。正确处理异常:不要在事务方法内部捕获所有异常,确保异常能够传播,以触发事务回滚。检查数据源配置:关闭自动提交,确保事务管理器与数据源的配置一致。关注传播属性:根据业务需求正确配置事务的传播行为,避免上下文丢失。在复杂调用场景下传递事务上下文。
2025-03-16 11:06:31
955
原创 小白也能理解MVCC多版本并发控制原理
MVCC(多版本并发控制)主要目的是在高并发环境下,实现读操作的非阻塞,确保每个事务看到一个一致性快照,同时避免大量的锁竞争。
2025-03-16 10:39:21
783
原创 深入浅出 Spring Bean 生命周期:从实例化到初始化全过程详解
我们将详细剖析 Spring Bean 生命周期的每一个步骤,并重点讲解初始化阶段的工作原理,结合 @PostConstruct、InitializingBean 和 init-method 等技术,为你揭开 Spring Bean 生命周期的神秘面纱。
2025-02-16 15:53:54
791
原创 **深入浅出:Java 五大 I/O 模式详解,提升你的高并发性能**
在现代高并发和大规模应用中,I/O(输入/输出)性能的优化是提升系统响应速度和处理能力的关键。本文深入探讨了 Java 中的五大常见 I/O 模式:**阻塞 I/O、非阻塞 I/O、I/O 多路复用、异步 I/O 和直接 I/O**。每种模式都有其独特的优势与应用场景,从基础的阻塞模式到高效的异步 I/O,这些技术决定了系统在处理海量请求时的响应速度和资源利用率。了解并掌握这些 I/O 模式,不仅有助于提升单线程或多线程程序的性能,还能够为你在高并发、大数据量处理、实时系统等场景中做出更明智的技术选择。
2025-02-16 11:53:13
1107
原创 Sa-Token大坑:关于Sa-Token跨域问题解决后导致token无效,Cookie丢失的问题
这两天用sa-token做业务发现,如果使用前端ajax请求到认证中心的话,会导致跨域问题,而跨域问题解决后悔导致认证中心的token失效了,我debug了。同理,如果认证中心重定向回来,token也可能丢失,所以我们将token放在重定向地址里作为参数,就不会丢失了.如果不懂代码怎么回事,可以去Sa-Token学习学习,也可以去我发的**
2023-06-22 15:41:30
8291
3
原创 Sa-Token整合OAuth2实现单点登录
今天春天太苦了!!先后经历了失恋,然后住院,春招也就找了半个月,幸亏秋招的时候有公司捞我了,不然今年要失业了!!!话不多说,步入正题,单点登录这个问题我很久之前有研究过,但是使用SpringSecurity写的,只感觉很离谱,要的配置实在是太多了,这个月公司提前配置,要整这个东西,我用SpringSecurity这个Oauth2实现单点登录又做了一次,但这次死活不行,前后弄了一个多星期,真离谱!!后来发现了Sa-token的这款工具,发现挺好用的,查了查,好像说比Shiro和SpringSecurity
2023-06-21 13:54:38
4613
1
原创 基于SpringBoot+WebSocket的聊天小项目,计算机网络课程实践基于TCP协议的即时通讯系统,实现网页聊天,群聊,好友列表,好友持久化
基于SpringBoot+WebSocket的聊天小项目,计算机网络课程实践项目,实现网页聊天,群聊,好友列表,好友持久化
2022-06-27 21:56:32
983
原创 并查集是什么?你还在为其烦恼?其实就是一个连通图的问题,理解起来没有那么困难
并查集,一种特殊的数据结构(它的逻辑结构本质也是一颗“树”,有唯一的根节点,任意数的子节点),它的特殊在于它只定义了两种数据操作(查找和合并)。这是用来解决连通性问题,查找(find):就是查找任意两个节点是否连通,就是是否有共同的祖先(节点找它的父节点的过程,一层一层地找)。合并(union):把两个不同集合的节点合并在一起。刚开始看到并查集这个词的时候,以为它是一个算法。其实也可以说是一个算法(对树问题的一种特殊操作方式),只不过这个算法的代码实现通常要定义两个函数:find()和union()我定义了
2022-06-09 08:30:00
177
原创 B+超强树,带你知晓MySQL的底层是怎样的结构
该树和B+树最大的区别在于,该树所有节点都存放数据.学习之前,先弄清楚B树的特点:B树在节点存储元素要知道的规则是: 连续存放元素一直要存到该节点最多能存放的数量为止,一旦超出了元素存放上限,先模拟出该存放的位置,然后将中间那个元素提升,如上图所示.当我们为一个节点放满四个元素的时候,再放入53,因为是五阶树,再存放就不能存放了,只能先模拟存放在41和97之间,之后将该节点中间元素提升,也就是41,再讲剩下的节点分为该41节点的左子节点和右子节点.B+树和B-树有两个区别: 非叶子节点只存放索引,通过该索
2022-06-08 09:45:00
278
原创 图解分析红黑树,理解都不是事,直接白话文讲述
讲到红黑树,就得引出AVL思想了,该思想诞生的原因主要由以下的问题: 我们在利用二叉树的时候,一般都要规定其一些特性,比如左节点必须小于根节点,右节点必须大于根节点,这样的树就叫做二叉排序树,这个二叉排序树在查找上效率是o(logn)而一般的数组直接遍历的话是o(n),但这只是二叉排序树的一般情况,如果传过来的数值本身就是有序的比如:123456,这样的数列要搞成二叉排序树的话,全都是在父节点的右子节点,因此退化成了链表,二叉排序树便失去了意义.所以,我们希望在进行二叉查找树实现的时候,通过一些规则来让树的
2022-06-07 09:45:00
173
原创 堆是也可以看成一种树结构,规定根节点必须大于或小于左右子节点,但左右子节点的大小顺序没有规定
堆不算是一种数据结构,只是一类数据结构的统称,通常用完全二叉树来实现堆.完全二叉树即除了叶子节点外,必须存在左右孩子节点的树.不完全二叉树是除了叶子节点外,存在一个或多个节不完全存在左右孩子节点.在前面小编提到过一笔,树不一定要用向链表那样的结构去实现的,我们完全可以用数组,用数组的好处是,可以快速遍历,根据某个节点,我们可以快速获取其父节点或者子节点,请看下图数组存储树的结构:如果一个节点的位置是k,那么其父节点的位置是k/2,其左子节点为k/2,右子节点为k/2+1.其次,树的根节点一定要大于左右子节点
2022-06-06 10:00:00
905
1
原创 基于java实现的二叉树经典的增删改问题,通俗易懂,适合入门
二叉树是一种很简单的结构,根节点延伸出左子节点和右子节点.这些子节点又有自己的子节点,自己当成子节点的根节点,不断延伸,可以无穷无尽.二叉树的作用有很多,比如在一些数据的查找上设计得很巧妙,我们规定左节点存放的值小于根节点,右节点存放的值大于根节点,这样子在进行查找的时候,就可以让该传入的值直接与最开始的根节点进行比较,从判断去哪个子节点寻找,不用遍历所有节点.二叉树的遍历又分为前序遍历,中序遍历,后序遍历,这些遍历往往会让人很乱,且看小编给你分析得头头是道.前序遍历就是以根节点为起点,然后开始遍历其左子
2022-06-05 09:30:00
601
原创 MySQL死锁问题如何解决?背诵版
MySQL的死锁:两个或两个以上的事务因为互相竞争对方的资源而导致循环等待的现象成为死锁.如何解决死锁:可以使用show engine inoodb status语句去查看sql语句状态.然后根据对应的死锁sql找到占用的锁.比如说: 事务A占用了a表的锁,事务B占用了b表的锁,如果此刻事务A要求占用b表的锁就得让事务b去释放b表的锁,但如果这个时候事务b也要求占用事务a的锁,就得要求事务a去释放占用a表的锁,这样子大家都循环等待,就造成了死锁.这个时候我们应该顺序让他们去占用锁,让事务ab顺序占用
2022-06-04 18:29:00
317
原创 二分查找算法,经典剖析,你还觉得查找算法难?
这是非常经典的查找算法,其规定数组的元素一定是有序的,因为我们要根据元素的大小进行一个折半,从而达到缩小遍历范围的目的.比如上图,如果小编要找67,就可以先找到中间位置第三位,为5(从0开始),然后判断67是否比5大,如果比5大说明一定在5右边,然后又开始在5右边折半,找到89,发现该数字比67大,然后在89左边折半(此时注意是以67为起点),便找到了67.优化: 二分查找主要...
2022-06-04 10:45:00
250
原创 经典图论,深度优先和广度优先,拓扑,Prim和Krukal,该来温习啦
图在生活被广泛应用,你平常听到的深度优先和广度优先算法都要建立图的基础之上.图的相关概念很简单,这里先不给出复述,等到小编讲述到例子,一下子就豁然开朗了.我们代码中如何存储一个图呢?其实有常用的两种方式一种是使用领接矩阵,也就是一个二维数组,数组下标是图点的表示,a[i][j]=1就表示i点和j点连通,若是为0表示不连通.另一种是邻接表,也就是用一个一维数组表示这些图点,然后每个位置又链接出一个队列或者链表,该链存储的是与该点直接连通的点.(是直接连通,而不是间接连通,比如a-b-c,a和b是直接连通)
2022-06-03 13:30:00
697
原创 八大排序算法详细分析,通俗易懂,基于Java实现
排序其实是一种算法,分为内部排序和外部排序,所谓内部排序是指在内存中进行排序,外部排序则需要借助一些外部的空间进行排序,比如磁盘文件.我们一般学习的是内部排序,面试问的最多的也是内部排序.内部排序的顺序图:时间复杂度表:时间的平均复杂度越低,性能整体上越好.比如o(n2)和o(nlogn),如果你知道这两个曲线的雏形就会了解,当n越大,n2就会便会变化得很快,而且是往大的方向增长.而后者的logn就不一样了,n越大,值会趋于平缓,时间复杂...
2022-06-03 08:41:08
860
原创 Zookepper===>动物管理员系统
概述顾名思义,表示动物管理员。我们将多个服务器看成不同的动物,而Zookeeper就是一个管理员,用来观察这些动物的状态,而我们客户端每次在进行观赏动物之前,都要跟管理员交互,一旦管理员发现有死亡动物,便会通知想观赏该动物的客户。当然这只是一个普通的比喻,实际上,ZK是由一个领导者和多个从者组成的集群。1)在该集群中,如果存在半数或超过半数以上的节点死亡,该集群便不能工作。2)集群全局数据是一致,即每个节点保存的数据都是一致的,但这不影响服务器的压力。3)数据更新支持原子性,数据读取.
2022-06-01 08:30:00
7864
原创 RabbitMQ 中小型企业MQ的不二选择,入门级别教程,适合初学者
文章目录Erlang语言安装(rpm版,建议)Rabbitmq安装(rpm版,推荐)卸载Erlang语言的安装(压缩包版本,不建议)Rabbitmq安装(压缩包版,不建议)安装web管理页面Hello World生产者代码消费者代码工作队列消息应答概念类别例子生产者消费者测试持久化队列持久化消息持久化不公平分发预取值确认发布单个确认发布批量确认异步确认发布临时队列交换机扇出交换机,路由key相同生产者消费者注意测试直接交换机,路由key不同主题交换机死信队列消费者生产者结果其他延迟队列Springboot整
2022-05-30 12:15:00
1813
原创 ActiveMQ简单教程,适合初学者,学习笔记yyds
MQ概述消息中间件主要是为了解决解耦,削峰,异步的问题解耦:假如有一个中心系统,其他系统则需要从该中心系统获取数据,而一旦其他系统里有系统崩溃或者修改,该中心系统与之对应的接口可能也要修改.这样耦合性是非常高的.但如果中心系统将数据抽象到MQ中,俗称消息中间件,中间件便会通过发布订阅的机制让其他系统去消费,中心系统就不用管理其他系统是否出现问题的情况,若是其他系统出问题,直接取消与中间件的消费即可.削峰:假如突然间有大量的请求进来,系统可能一次性消化不过来,可以先堆积在MQ中,系统每次最多向MQ中.
2022-05-29 13:15:00
1838
原创 dubbo 阿里巴巴旗下的远程调用的RPC框架
分布式系统概述分布式系统是若干计算机独立的集合,这些计算机对用户来说就好像单个系统.分布式系统是未来的大趋势,但这种大趋势也必定带来管理的困难,所以duboo系统便应运而生,用来管理分布式系统的运作.RPC远程过程调用但分布式系统的管理中,怎样在服务器之间建立连接,是一个重要的问题.rpc简称远程过程调用,是一种技术的思想,而不是一种规范.在上面的过程中,我们可以看出,绝对RPC思想的效率一是通讯的效率二是RPC中序列化和反序列化的效率,这关于数据格式之间的传输,是xml传输.
2022-05-28 11:10:04
581
原创 SpringCloud 入门级别教程,初学者专用,有netiflex原版教程,更有SpringCloudAlibaba微服务教程
SpringCloud 入门级别教程,初学者专用,有netiflex原版教程,更有SpringCloudAlibaba微服务教程
2022-05-28 09:00:00
1341
原创 redis6 入门级教程,有整合案例,可以直接看整合案例,简单入门,直接上手
redis6教程,直接入门,有整合案例,非常简单,不懂的可以来看看
2022-05-26 09:30:00
1081
原创 Mybatis-plus终极入门教程,简单上手,适合初学者,快来看看吧
MybatisPlus很简单,简单!!比Mybatis简单多了,不用搞那么多xml文件的配置,直接与Springboot整合,那开发效率简直杠杠的
2022-05-25 11:57:05
1992
原创 SpringSecurity 入门级别教程,有前后端分离校验模式案例,SpringSecurityOAuth2整合GateWay操作
SpringSecurity入门级教程,有开发案例,整合OAtuh2,整合GateWay网关,实现前后端分离模式的校验
2022-05-25 11:21:07
2253
原创 SpringSecurity+GateWay网关+OAuth2鉴权,前后端分离模式,两种验证模式,入门级教程
说明SpringSecurityOAuth2单点登录昨天我发了一个单点登录版本的验证博客,到今天早上我再研究了一下,发现了一些问题:昨天那个单点登录是在每个模块的基础上做的,也就是说如果你想让每个模块都如认证中心认证,就要在每个模块里进行相关配置,这还不是最紧要的,你要想想,因为我们是通过注解的方式在对应的方法鉴权,这样的话就会导致我们每次访问这个方法的时候就要去认证中心请求一次,也就是鉴权一次,那么整个系统模块又多,路径又多,认证中心肯定是吃不消的啊.所以在这个基础上,就需要去将认证中心在第一次
2022-05-24 22:22:24
10074
4
原创 redistemplete请求spring security /oauth/token 报401错误,表示没有权限
/oauth/token这个路径就是为了获取认证中心的token System.out.println("函数进来了"); MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>(); paramsMap.put("grant_type", Collections.singletonList("password")); paramsMa
2022-05-22 22:30:58
2141
原创 SpringSecurityOAtu2+JWT实现微服务版本的单点登录
文章目录何为单点登录认证中心maven配置用户登录逻辑OAtuh2配置配置服务中心配置规则中心请求模块一些小问题何为单点登录单点登录通俗的话来讲在微服务当中,在一个服务登录后就能免去另一个服务的登录操作,所谓单点登录.就好像你在微博总网站里登录后,然后在微博里面的某一个模块点进去后,就发现这个模块竟然不用登录了,不是因为这个模块与主网站是一体的用一个SpringSecurity就可以搞定了,这里面的水深着呢!感兴趣更深这个SpringSecurity建议去看看图灵课堂的SpringSecurity,
2022-05-22 22:11:36
1138
1
原创 面试题: MySQL主从复制及产生问题,如何解决,背诵详细
什么是主从复制?主从复制就是用来建立一个或多个和主库一样的数据库,称为从库,然后可以在这两者之上进行一个读写分离,主库少写,从库多读的操作,这样就能大大缓解数据库的并发压力有什么用做数据的热备份,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的评率,提高单个机器的I/O性能。读写分离,使数据库能支持更大的并发。在线上环境中,一般都是读多写少,那么我们可以在主库中实现写
2022-05-18 22:07:12
1026
3
原创 Mybatis两级缓存,缓存原理介绍,面试题经典,可以完全背诵
文章目录一级缓存二级缓存原理背诵对比一级缓存一级缓存也叫本地缓存,在MyBatis中,一级缓存是在会话(SqlSession)层面实现的,这就说明一级缓存作用范围只能在同一个 SqlSession 中,跨 SqlSession 是无效的。默认开启一级缓存.二级缓存二级缓存是mapper级别的缓存,如果多个SqlSession公用一个mapper文件,那么大家的第一次查询后的数据都会放在二级缓存中.二级缓存范围更大.< setting name=“cacheEnabled” value=“t
2022-05-17 21:04:37
441
原创 Mybatis执行流程(原理,面试官问题),可以直接背诵,通俗易懂,全面
答: mybatis的执行流程主要分为两大流程,一是解析xml文件,二是进行相应sql执行.解析xml文件你可以这么回答: 在这个过程中,我们主要是为了获取SqlSession,利用sqlsession去执行相应的sql语句.首先,根据SqlSessionFactoryBuilder的build方法,获取一个DefaultSqlSesionFactory对象,那么在build方法里会对xml文件进行解析,最主要是会对mapper.xml文件里的sql语句进行解析封装成一个MappeStatement
2022-05-17 13:18:07
506
原创 在Spring中 Setter方式注入和构造器注入的区别,面试题背这个准没错,可以说的是最全的了,奉劝你还是别查了,没有一个比我这个说的好的,都在一顿抄
Setter方式要对应的bean拥有set方法,而构造器方式则要拥有对应的构造器setter方式更加直观,而构造器方式更加臃肿,因为需要将全部依赖设置进来.setter方式一般用在弱依赖关系上,如果没有对应依赖对象,主对象仍然可以执行,而构造器是强依赖关系,在new一个对象的时候,需要用到有参构造,有参构造是必须传入参数的,不然会报错.构造器依赖是官方推荐的时候依赖,除了刚才说的,能因为必须传输有参构造器里的参数,可以监测依赖不为空;其次我们可以将依赖对象赋值给final对象,使依赖不可变;还有,我.
2022-05-16 10:17:39
869
原创 Rabbitmq面试题总结,非常详细,杜绝标题党,不详细你打我,下次不写博客了
Rabbitmq面试题总结,非常详细,杜绝标题党,不详细你打我,下次不写博客了
2022-05-10 18:04:29
35799
8
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人