自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 收藏
  • 关注

原创 Redis过期与淘汰策略详解

它依赖 maxmemory 的配置,并在内存不足时触发,根据选定的算法(LRU, LFU, Random, TTL)决定牺牲哪个键。注意 volatile-* 策略只考虑有 TTL 的键,如果内存不足时没有符合条件的键,这些策略的行为会退化成 noeviction(写入报错)。如果已过期,Redis 会立即删除这个键,然后返回 nil(或对应的空结果)给客户端,就像这个键从未存在过一样。只希望对设置了过期时间的键应用 LRU 淘汰,同时保留未设置过期时间的键(通常认为这些键更重要或永久有效)。

2025-08-02 13:34:37 995

原创 微服务拆分的核心原则与策略

服务间通信通过定义良好的、稳定的 API 进行(通常是 RESTful API、gRPC、异步消息等),避免直接数据库共享或紧密的内部调用。如果系统的某些部分有非常特殊的技术栈需求(例如,使用 Python 进行机器学习预测,使用 Golang 处理高并发网络连接,使用特定数据库处理图关系),可以考虑将其拆分成独立的微服务。在基础设施层处理服务间通信的复杂性(负载均衡、服务发现、熔断、重试、遥测、安全等),使业务代码更专注于业务逻辑。康威定律指出:“设计系统的组织,其产生的设计等同于组织间的沟通结构。

2025-07-28 23:19:36 1006

原创 MySQL索引使用B+树的原因,以及与B树的区别

特性B+树B树数据存储位置仅叶子节点存储完整数据记录(或指针)。所有节点都可能存储数据记录(或指针)。叶子节点链接叶子节点通过指针按顺序链接成链表。叶子节点之间没有链接。非叶子节点内容仅存储键值和指向子节点的指针(索引项)。存储键值、对应的数据记录(或指针)以及指向子节点的指针。查询稳定性所有查询都必须到达叶子节点,时间复杂度稳定 O(log n)。查询可能在非叶子节点结束,路径长度不一致。范围查询效率极高。通过叶子节点链表顺序扫描,I/O 高效。较低。

2025-07-27 17:08:48 1001

原创 Spring Boot 的 SPI 机制与实现方式

Spring Boot 的 SPI 机制 (SpringFactoriesLoader + spring.factories / spring/*.imports) 是其实现“开箱即用”和强大自动配置能力的基石。从 Spring Boot 2.7 开始,官方推荐使用新的 META-INF/spring/ 目录下的文件来取代部分 spring.factories 的功能,以实现更好的。一个文件只能对应一个接口的一种实现 (多实现需多文件)文件内容直接是单个实现类的全限定名 (一行一个)

2025-07-21 23:07:15 917

原创 MySQL数据库InnoDB引擎MVCC机制(多版本并发控制)

MVCC 能解决“快照读”(普通SELECT)的幻读(因为RR的快照不变),但解决不了“当前读”(SELECT ... FOR UPDATE/LOCK IN SHARE MODE)的幻读。存储数据修改前的历史版本(逻辑日志),通过DB_ROLL_PTR形成版本链。-DB_ROW_ID(6字节):隐藏自增行ID(无主键时生成聚簇索引)只读取已提交事务修改的版本(通过Read View过滤活跃事务)事务开启时创建的数据快照视图,决定该事务能看到哪些版本的数据。的数据(可能被其他已提交事务修改)。

2025-07-12 15:34:00 1853

原创 基于Redisson分布式锁的防超卖方案

对于超高并发场景(如秒杀),可结合Redis Lua脚本实现库存扣减,将库存信息放在Redis中,进一步减少数据库压力。本方案在常规积分兑换场景下已足够稳定可靠。在积分兑换红包系统中,高并发场景下可能出现多个用户同时兑换导致红包超发的问题。本方案使用Redisson分布式锁确保兑换操作的原子性,防止超兑。

2025-07-11 22:50:43 504

原创 单体架构、分布式架构、微服务架构的区别

理解单体架构、分布式架构和微服务架构的区别至关重要,它们代表了不同的系统组织哲学和适用场景。微服务架构本质上是分布式架构的一种特定、精细化的实现风格。微服务将独立部署和快速迭代发挥到极致,是 DevOps 的理想载体。早期的 Java EE 应用, 简单的 CMS 系统。微服务强制要求服务拥有自己的数据,是核心原则之一。(服务发现、配置中心、链路追踪、监控、容错等)(“双披萨团队”,拥有服务的端到端所有权)(服务可独立、快速、自动化发布,频率极高)微服务是分布式的,但分布式不一定是微服务。

2025-07-06 14:46:08 891

原创 分布式系统——CAP、ACID、BASE理论

两者没有绝对的优劣,选择取决于应用的具体需求。现代分布式系统设计,特别是微服务架构中,常常需要根据不同的业务模块和数据敏感性,混合使用 ACID 和 BASE 模型。ACID 和 BASE 是两种截然不同的数据库事务处理模型,代表了在。在故障时可能牺牲可用性以保证一致性 (CP)社交网络、电商非核心、实时分析、大规模系统。实现最终一致性逻辑复杂,需处理冲突。金融核心、交易支付、强一致关键业务。高可用性、高可伸缩性、容错性。强一致性 (即时一致性)强一致性、数据绝对正确。状态总是确定、一致的。

2025-07-06 12:06:21 631

原创 Java分布式锁的实现方案

锁超时时间 > 业务最大执行时间 + 时钟漂移补偿 + 网络延迟缓冲。TTL = (业务最大执行时间 × 2) + 网络延迟缓冲。使用临时顺序节点实现先来先服务的公平锁,避免"惊群效应"会话超时 > 业务最大执行时间 + 网络恢复时间。看门狗线程(Redisson)Session断开自动释放。高(需处理临时节点和监听)CP系统(优先保证一致性)强一致性(ZAB协议)金融交易、强一致性要求。中等(需要磁盘写入)中等(需处理多节点)较高(需要维持会话)高并发、允许偶尔失效。PEXPIRE 命令。

2025-07-06 10:12:01 1765

原创 Java多级缓存的实现

sequenceDiagram 应用->>数据库: 1. 写操作 应用->>Redis: 2. 立即删除Key 数据库-->>Canal: 3. 生成Binlog Canal->>Redis: 4. 延迟删除(防旧数据回填)读请求 → L1 → L2 → DB → 回填L2和L1。金融级场景:引入Binlog监听 + 本地缓存版本号校验。80%场景:短TTL本地缓存 + Redis延迟双删。关键业务:增加MQ广播失效。低频更新业务(如配置)Binlog监听同步。

2025-07-05 22:17:47 968

原创 单向链表的反转Java实现

/递归修改当前节点的next节点,最终返回新的首节点。单向链表的反转Java实现如下。

2022-09-29 23:25:14 714

原创 排序算法Java实现

/递归分别进行高低分段排序。Java快速排序实现如下。

2022-09-29 23:22:56 220

原创 Spring事务的传播机制

spring默认使用这种:使用当前的事务, 如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的, 如果当前存在事务,则加入当前事务, 成为一个整体。如果当期有事务, 则开启一个子事务(嵌套事务), 嵌套事务是独立提交或者独立回滚的, 如果当前没有事务, 则同Required。如果当前有事务, 则挂起当前事务, 并创建一个自己新的事务, 如果当前没有事务, 则同 required。如果当前有事务, 则使用事务, 如果当前没有事务, 则不使用事务。如果当前有事务, 直接抛出异常。

2022-09-29 23:19:15 291

原创 Spring事务原理深度解析

当我们在某个方法上加了@Transactional注解后,就表示该方法在调用时会开启Spring事务,而这个方法所在的类所对应的Bean对象会是该类的代理对象。某个加了@Transactional注解的方法被调用时,要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效。4. 执行target.test(),执行程序员所写的业务逻辑代码,也就是执行sql。1. 判断当前执行的方法是否存在@Transactional注解。5. 执行完了之后如果没有出现异常,则提交,否则回滚。

2022-09-20 23:28:26 318

原创 Spring AOP

3. 代理类中还会有一个target属性,该属性的值为被代理对象(也就是通过UserService类推断构造方法实例化出来的对象,进行了依赖注入、初始化等步骤的对象)AOP就是进行动态代理,在创建一个Bean的过程中,Spring在最后一步会去判断当前正在创建的这个Bean是不是需要进行AOP,如果需要则会进行动态代理。UserService代理对象.test()--->执行切面逻辑--->target.test(),注意target对象不是代理对象,而是被代理对象。1. 找出所有的切面Bean。

2022-09-20 23:24:51 616

原创 Spring推断构造方法

2. 如果一个类存在多个构造方法,Spring不知道如何选择,就会看是否有无参的构造方法,因为无参构造方法本身表示了一种默认的意义。a. 不管该构造方法是无参构造方法,还是有参构造方法,Spring都会用这个构造方法,因为只有一个无需判断。如果Spring选择了一个有参的构造方法,Spring在调用这个有参构造方法时,需要传入参数,那这个参数是怎么来的呢?a. 这些构造方法中,存在一个无参的构造方法,那么Spring就会用这个无参的构造方法。象,但是如果一个类存在多个构造方法,Spring会使用哪个呢?

2022-09-20 23:16:10 374

原创 SpringBean的创建过程

5. 紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化)6. 最后,Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要进行AOP,则会进行动态代理并生成一个代理对象做为Bean(初始化后)1)如果不用进行AOP,那么Bean就是类的构造方法所得到的对象。

2022-09-20 23:11:23 1920

原创 Spring如何解决循环依赖

3、singletonFactories:缓存的是一个ObjectFactory,也就是一个Lambda表达式。4、还要一个缓存earlyProxyReferences,它用来记录某个原始对象是否进行过AOP 了。1、singletonObjects:缓存经过了完整生命周期的bean。在生成Bean的时候互相依赖对方的生成,导致谁也无法生成。但是B类又有一个属性A类。比如A类有一个属性B类。

2022-09-13 21:14:29 185

原创 Redis 核心数据类型的常用命令与典型使用场景

brpop key timeout//从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待。sadd key value [value1...] //往集合key中存入元素,元素存在则忽略,若key不存在则新建。srandmember key count //从集合key中选出count个元素,元素不从key中删除。spop key count //从集合key中选出count个元素,元素从key中删除。

2022-09-03 00:01:32 378

原创 JVM核心特性

加载->验证->准备->解析->初始化加载:读取硬盘上类字节码文件,会在内存中生成一个该类的class对象,作为方法区该类的各种数据访问入口验证:校验字节码文件的正确性准备:给类的静态变量分配内存,并且赋予默认值解析:将符号引用替换为直接引用初始化:对类的静态变量赋予指定的值,执行静态代码块。

2022-09-01 18:53:59 436

原创 MySQL-Explain执行计划与SQL优化

Explain与索引详解

2022-07-09 12:06:17 293

原创 Java类加载机制

类加载运行全过程

2022-07-09 11:48:40 180

空空如也

空空如也

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

TA关注的人

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