- 博客(114)
- 收藏
- 关注
原创 【设计模式】基于责任链模式的参数校验
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,可以通过将一系列处理器按顺序链接起来,使得每个处理器都有机会处理请求,从而实现请求的传递和处理。此处我们用一个创建订单的例子 在创建订单前进行各种的前置校验/*** 设置下一个校验器/*** 返回下一个校验器* @return/*** 校验* @throws OrderException 订单异常。
2025-07-05 14:17:06
637
原创 【分布式】自定义统一状态机流转设计
状态机用于描述一个系统在不同状态之间的转换和行为,是状态模式的一种具体应用。状态机是一种抽象的计算模型,它包含有限个状态和转换规则,用于描述系统在不同状态下如何响应输入以及在不同输入下如何进行状态转换。一个状态机通常包含以下几个要素:状态(States):代表系统可能处于的各种状态,例如 “已下单”、“已支付”、“已发货” 等。事件(Events):触发状态转换的事件,例如 “下单”、“支付”、“发货” 等。
2025-06-30 18:07:40
511
原创 【分布式】Redisson滑动窗口限流器原理
→ 1630000000000 → “\x3F\x9F\xC1\xB8\x00\x00\x00\x01” // 二进制格式:0.12345 (float) + 1 (int)→ 1630000001200 → “\x3F\x8B\xAE\x47\x00\x00\x00\x01” // 旧请求被清理,仅保留最新请求。1630000000100 → “\x3F\xAD\xF7\xB2\x00\x00\x00\x02” // 保持不变。ARGV [1]: 1 (请求 1 个令牌)
2025-06-23 11:16:05
924
原创 【分布式】基于Dubbo实现对远程调用接口的封装
方法参数校验捕获处理业务异常封装返回结果记录完整的调用日志import cn//核心方法 拦截所有添加Facade注解的方法 @Around("@annotation(cn.hollis.nft.turbo.rpc.facade.Facade)") public Object facade(ProceedingJoinPoint pjp) throws Exception {
2025-06-20 17:27:20
565
原创 【分布式】基于Redisson实现对分布式锁的注解式封装
可以基于注解的方式给一个方法体添加分布式锁 并实现自动释放。配置一些加锁必须的参数说明。
2025-06-19 14:48:56
302
原创 【分布式】UUID和雪花算法
UUID(Universally Unique Identifier)即通用唯一识别码,是一种由数字和字母组成的 128 位标识符,其目的是在分布式系统中创建全局唯一的标识符,避免不同设备或系统在生成标识符时产生冲突。
2025-04-01 10:02:14
474
原创 【Redis】Redis持久化
在使用Redis作为缓存时,可以选择使用Redis的持久化功能来保证数据不会因服务器重启而丢失。RDB(快照)和AOF(追加式文件)
2024-05-20 22:24:20
1057
原创 【MySQL】MySQL事务日志
事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持 久性。UNDO LOG 称为 回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。
2024-05-19 21:31:35
926
原创 【MySQL】MVCC
MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的 并发控制。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。
2024-05-19 19:57:23
1003
原创 【Java】从0实现一个基于SpringBoot的个人博客系统
使⽤SSM框架实现⼀个简单的博客系统共5个⻚⾯⽤⼾登录博客发表⻚博客编辑⻚博客列表⻚博客详情⻚⽤⼾登录成功后, 可以查看所有⼈的博客. 点击 可以查看该博客的正⽂内容. 如果该博客作者为当前登录⽤⼾, 可以完成博客的修改和删除操作, 以及发表新博客页面预览用户登录博客详情博客列表博客发布。
2024-05-09 13:01:52
1693
2
原创 【Java】从0实现一个消息队列中间件
曾经我们学习过阻塞队列(BlockingQueue),我们说,阻塞队列最⼤的⽤途,就是⽤来实现⽣产者消费者模型.⽣产者消费者模型,存在诸多好处,是后端开发的常⽤编程⽅式.在实际的后端开发中,尤其是分布式系统⾥,跨主机之间使⽤⽣产者消费者模型,也是⾮常普遍的需求.因此,我们通常会把阻塞队列,封装成⼀个独⽴的服务器程序,并且赋予其更丰富的功能.这样的程序我们就称为消息队列(MessageQueue,MQ)市⾯上成熟的消息队列⾮常多.其中,RabbitMQ是⼀个⾮常知名,功能强⼤,⼴泛使⽤的消息队列.咱们就仿照R
2024-04-25 11:06:48
1465
1
原创 【RabbitMQ】RabbitMQ详解(二)
先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息 进行消费,但某些时候由于特定的原因导致 queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然就有了死信队列。上文中提到的问题,确实是一个问题,如果不能实现在消息粒度上的 TTL,并使其在设置的 TTL 时间及时死亡,就无法设计成一个通用的延时队列。
2023-12-23 23:43:41
1316
1
原创 【RabbitMQ】RabbitMQ详解(一)
RabbitMQ是一种开源的消息中间件软件,它实现了高度可靠的消息传递机制。它基于AMQP(Advanced Message Queuing Protocol)协议,可以在分布式系统中传递、存储和接收消息。RabbitMQ提供了一个可靠的消息队列系统,用于在应用程序之间进行异步通信。它的主要特点包括:消息队列:消息发送者将消息发布到队列中,然后接收者从队列中获取消息进行处理。可靠性:RabbitMQ使用持久化消息以确保消息不会丢失,并提供了消息确认机制来确保消息被正确接收。
2023-12-23 01:10:05
2783
原创 【Spring】Spring AOP
AOP(面向切面编程)是一种编程思想和技术,旨在将横切关注点与核心业务逻辑相分离,以提高代码的可维护性、可重用性和可扩展性。在传统的面向对象编程中,我们将功能模块封装成类,并通过对象的方法调用来实现特定的功能。但有些功能可能会跨越多个对象和方法,包括日志记录、安全控制、事务管理等,这些功能通常不属于核心业务逻辑,但需要在多个地方重复使用。AOP的核心思想是将这些横切关注点从业务逻辑中剥离出来,形成一个独立的模块,称为切面(Aspect)。
2023-12-15 22:01:23
1011
原创 【Spring】SpringBoot日志
为什么要学习⽇志⽇志对我们来说并不陌⽣, 从JavaSE部分, 我们就在使⽤ System.out.print 来打印⽇志了. 通过打印⽇志来发现和定位问题, 或者根据⽇志来分析程序的运⾏过程.在Spring的学习中, 也经常根据控制台的⽇志来分析和定位问题.随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.
2023-12-10 22:38:11
1987
1
原创 【Spring】Spring统一功能处理
拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执⾏预先设定的代码也就是说, 允许开发⼈员提前预定义⼀些逻辑, 在⽤⼾的请求响应前后执⾏. 也可以在⽤⼾请求前阻⽌其执⾏.在拦截器当中,开发⼈员可以在应⽤程序中做⼀些通⽤性的操作, ⽐如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录⽤⼾的信息. 如果有就可以放⾏, 如果没有就进⾏拦截.实现HandleInterceptor接口 重写方法@Component@Slf4j。
2023-12-10 22:37:08
1359
1
原创 【Mybatis】Mybatis操作数据库详解
MyBatis(前身为iBATIS)是一种Java持久层框架,用于简化数据库访问的开发。它提供了一种将SQL语句与Java代码解耦的方式,使得数据库操作更加灵活和易于维护。MyBatis的核心思想是通过XML或注解配置SQL映射关系,将SQL语句与Java方法进行关联。开发人员只需定义SQL语句,并将其映射到相应的Java方法上,MyBatis会自动执行SQL并将结果映射到Java对象中。
2023-11-24 13:31:58
946
原创 【Spring】SpringBoot配置文件
很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:• 项⽬的启动端⼝• 数据库的连接信息(包含⽤⼾名和密码的设置)• 第三⽅系统的调⽤密钥等信息• ⽤于发现和定位问题的普通⽇志和异常⽇志等.
2023-11-10 22:49:23
443
原创 【Spring】Spring IOC & DI
Spring是一个开源的轻量级Java开发框架,它提供了全面的基础设施支持和广泛的应用程序级特性,使得Java开发变得更加简单和高效。Spring框架的核心特点包括依赖注入(Dependency Injection)、面向切面编程(AOP)、容器、事务管理等。依赖注入允许开发人员将组件之间的依赖关系外部化,这样可以降低类之间的耦合度,使得代码更容易维护和测试。面向切面编程则允许开发人员定义横切关注点,比如日志、事务管理等,从而实现模块化的开发。
2023-11-10 17:05:36
482
原创 【Spring】SpringWebMVC入门
Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"SpringMVC".MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分• View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
2023-11-03 15:45:25
616
原创 【MySQL】存储引擎
InnoDB是MySQL的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。数据文件结构:表名.frm存储表结构,表名.ibd存储数据和索引对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引。MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较高 ,而且内存大小对性能有决定性的影响。
2023-10-22 17:48:35
319
原创 【MySQL】逻辑架构
所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在 文件系统 上,以 文件 的方式存在的,并完成与存储引擎的交互。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。
2023-10-22 17:30:37
970
1
原创 【JVM】JVM的垃圾回收机制
分代算法和上面讲的 3 种算法不同,分代算法是通过区域划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收。这就好比中国的一国两制方针一样,对于不同的情况和地域设置更符合当地的规则,从而实现更好的管理,这就时分代算法的设计思想。标记过程仍与"标记-清除"过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。因此在老年代一般不能使用复制算法。我们将这个堆分为新生代和老年代,新生代中保存年纪小的对象,老年代中存放年纪大的对象。
2023-10-16 10:42:44
618
原创 【Java】Servlet API
Servlet中的doxxx方法的目的就是根据请求计算得到响应,然后把数据设置到HttpServletResponse对象中,tomcat会把这个HttpservletResponse对象按照Http请求协议的格式转换成一个字符串,通过Socket写会给服务器。我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法.请求对象是服务器收到的内容,不应该修改,因此上面的方法都是读方法而不是写方法。每次收到请求的时候,调用service方法。
2023-09-22 23:42:04
161
原创 【Java】第一个Servlet程序
找到对应版本,我是用tomcat8,就需要3.1版本的api。在中央仓库中找到servlet api。复制这段代码,放在maven依赖中。使用maven工具来打包。
2023-09-18 12:08:55
202
原创 【Java】应用层协议HTTP和HTTPS
签名在一定程度上区分不同的数据,常见的生成签名的算法有MD5和SHA系列以MD5为例,它的特点是定长:无论多长的字符串,计算出来的MD5值都是固定长度(16字节或者32字节)分散:源字符串只要改变一点点,最终得到的MD5值都会差别很大不可逆:通过原字符串生成MD5很容易,但是通过MD5还原成源字符串理论上来说是不可能的所以我们认为,如果两个字符串的MD5值相同,就认为这两个字符串相同如何判定证书是否被篡改呢?假设我们传入字符串1,根据这个字符1计算出hash1。
2023-09-17 22:41:42
1122
原创 【Java】网络层协议IP协议
为了解决这个问题,引入了更大的IPv6(Internet Protocol version 6)地址空间,它采用128位二进制数表示,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334。扩展的地址空间:IPv6采用128位地址格式,相对于IPv4的32位地址,IPv6的地址空间大大扩展,理论上可以支持约340万亿亿亿亿(3.4×10^38)个不同的地址。节省公共IP地址:通过使用私有IP地址和NAT机制,多个设备可以共享少量的公共IP地址,从而避免了IP地址的浪费。
2023-09-10 10:16:02
263
原创 【Java】传输层协议TCP
ACK是0表示这是一个普通报文,此时只有32位序号是有效的,32位确认序号是无效的ACK是1表示这是一个应答报文,这个报文的序号和确认序号都是有效的。
2023-09-08 20:55:46
994
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅