- 博客(40)
- 收藏
- 关注
原创 全面解析Redis分布式锁
Redis分布式锁是实现共享资源互斥访问的常用方案。基础实现使用SETNX+EXPIRE命令组合,但存在死锁风险。改进方案应采用原子性SET命令设置唯一值和过期时间,并通过Lua脚本确保释放锁时的操作原子性。生产环境中还需考虑单点故障问题,可采用Redlock算法实现更高可靠性。最佳实践包括:原子性获取锁、唯一标识符验证、Lua脚本释放、合理设置超时时间。实现分布式锁需确保互斥性、防死锁和正确解锁三大特性。
2025-09-23 16:24:38
678
原创 Redis:主从复制与哨兵模式解析
Redis通过主从复制实现数据冗余与读写分离,从节点同步主节点数据,为高可用奠定基础。哨兵模式在此基础上提供自动化故障转移,通过多哨兵节点监控、主观/客观下线判断、领导者选举等机制,在主节点故障时自动选举新主并更新配置,实现服务不中断。主从复制负责数据层,哨兵模式负责治理层,二者结合构成完整的Redis高可用架构,适用于中小规模系统。
2025-09-20 15:38:39
785
原创 深入解析Redis集群模式:构建高可用与可扩展的缓存系统
Redis集群是官方提供的分布式解决方案,通过数据分片(16384个哈希槽)和主从复制实现高性能、高可用和线性扩展。它解决了单机Redis的容量、性能和单点故障问题,支持无缝扩容和自动故障转移。集群采用Gossip协议通信,客户端需支持重定向处理。搭建最少需要3主3从6个节点,适合大数据量、高并发和高可用场景,但存在多Key操作限制、部署复杂等缺点。
2025-09-18 22:06:19
938
原创 深入理解Java数据结构
Java数据结构主要通过内置集合框架和自定义实现两种方式体现。内置集合框架包含线性结构(List/Queue)、键值对(Map)和集合(Set)三大类,如ArrayList、HashMap等,各有适用场景。自定义数据结构可利用数组和节点引用来构建链表、树等结构。选择数据结构应权衡操作需求,如随机访问选数组、频繁增删选链表、去重选HashSet等。需注意线程安全需求,并理解底层实现原理才能做出最佳选择。
2025-09-18 15:50:03
1081
1
原创 一文读懂Docker:从入门到实践
Docker容器的核心概念及其在软件开发中的革命性意义。Docker通过轻量级容器技术解决了环境不一致问题,其三大核心组件(镜像、容器、仓库)实现了应用的高效构建、分发和运行。相比传统虚拟机,容器共享主机内核,具有启动快、资源占用少等优势。Dockerfile的声明式构建使环境配置可版本化,而容器编排工具Kubernetes则进一步解决了大规模容器管理问题。Docker显著提升了软件交付效率,是微服务架构和持续集成的理想载体。
2025-09-16 17:48:50
933
原创 深入解析Seata:一站式分布式事务解决方案
Seata是阿里巴巴开源的分布式事务解决方案,针对微服务架构下的数据一致性问题提供高效、低侵入的解决方式。其核心架构包含事务协调器(TC)、事务管理器(TM)和资源管理器(RM)三个角色,支持AT、TCC、Saga和XA四种事务模式。其中AT模式通过两阶段提交和undo日志实现自动补偿,对业务代码零侵入;TCC模式需要开发者手动实现Try-Confirm-Cancel接口,适合高一致性要求的场景。Seata具有非侵入性、高性能和支持多模式等优势,建议优先采用AT模式,并确保TC服务集群化部署以保证高可用性。
2025-09-15 17:15:17
977
原创 MySQL索引:结构、类型与选型实践
系统介绍了MySQL索引的核心知识,包括索引的本质、B+树结构、常见索引类型及适用场景。重点解析了聚簇索引、二级索引和覆盖索引的存储原理,提供了索引选型的最佳实践和常见误区。文章强调应根据查询模式设计索引,平衡查询效率与写入成本,同时给出了索引维护的具体建议,如利用组合索引、避免冗余索引等,帮助开发者优化数据库性能。
2025-09-14 21:57:17
1040
原创 Java Collection集合框架:体系、核心与选型
Java集合框架提供了统一的数据结构接口与实现,分为Collection(List、Set、Queue)和Map两大体系。主要实现类包括ArrayList(动态数组查询快)、LinkedList(链表增删快)、HashSet(高效去重)、TreeSet(自动排序)等。选择集合需考虑数据结构特性:ArrayList适合查询频繁场景,LinkedList适合频繁增删,HashSet用于去重,TreeSet用于排序。线程安全场景需使用并发集合或同步包装器。该框架通过接口与实现分离,提高了开发灵活性和效率
2025-09-14 21:46:27
652
原创 Java GC:从GC Roots到分代设计的哲学
本文深入解析Java垃圾收集(GC)机制的核心原理。阐明了GCRoots的概念,包括栈引用、静态变量、常量等存活对象起点;其次分析分代收集的设计思想,基于弱/强分代假说将堆分为新生代和老年代,分别采用复制和标记整理算法;最后指出GC系统在吞吐量与停顿时间间寻求平衡,是Java生态繁荣的关键基础。理解GC机制有助于JVM调优和编写高效Java程序。
2025-09-13 22:03:23
1267
原创 Java ThreadLocal原理、内存泄漏与实战应用
ThreadLocal是Java实现线程隔离的关键机制,通过为每个线程创建变量副本避免共享资源竞争。其核心原理是利用Thread类内部的ThreadLocalMap存储线程私有数据,以ThreadLocal实例为Key进行存取。虽然采用弱引用Key减少内存泄漏风险,但Value仍可能因线程长期存活而无法回收,必须配合remove()方法及时清理。最佳实践是在finally块中调用remove(),尤其在线程池场景下更需注意。ThreadLocal以空间换时间,适用于线程上下文传递、非线程安全工具类封装等场景
2025-09-13 13:39:29
984
原创 Java JUC并发集合详解:线程安全容器完全指南
Java并发容器(JUC)提供线程安全的高性能集合类,包括ConcurrentHashMap(分段锁/CAS优化)、阻塞队列(Array/LinkedBlockingQueue)、非阻塞队列(ConcurrentLinkedQueue)和写时复制集合(CopyOnWriteArrayList)。相比传统同步方式,JUC通过锁分离、CAS无锁算法等实现更高并发性。选型需考虑数据结构特性(Map/Queue/List)、是否需要有序/阻塞,以及读写比例,优先选用JUC而非同步包装类,以提升多线程环境下的程序性能
2025-09-12 22:00:00
1031
原创 深入解析MVCC:多版本并发控制的原理与实现
MVCC(多版本并发控制)是现代数据库实现高性能事务处理的核心技术。它通过为数据创建多个版本,解决读写操作相互阻塞的问题,大幅提升并发性能。关键机制包括:添加隐藏字段记录事务信息、利用Undo Log存储版本链、区分快照读与当前读。不同隔离级别下ReadView的生成策略不同,影响事务的数据可见性。MVCC优势在于读写不冲突和高并发,但需付出存储和维护多版本数据的开销。该技术是数据库实现高效事务隔离的关键创新。
2025-09-12 15:11:53
819
原创 深入解析HashMap:从原理到实践的全方位指南
HashMap作为Java编程的基石之一,其设计由数组+链表到数组+链表+红黑树,有效平衡了普通场景和极端场景下的性能。本文带你深度剖析HashMap底层原理,一看就会!
2025-09-11 19:15:46
1344
原创 深入解析ReentrantLock:可重入锁
深度熟悉ReentrantLock特性,解析synchronized和ReentrantLock的区别
2025-09-10 21:58:06
820
原创 深入理解synchronized:从使用到原理的进阶指南
作为Java并发编程的基石,synchronized 关键字的重要性不言而喻。它不仅仅是一个关键字,更是一套完整的线程同步解决方案,其背后蕴含着Java虚拟机精湛的设计哲学。本文将带领你从字节码层面到操作系统内核,全方位剖析 synchronized 的实现原理、优化手段与实战技巧。
2025-09-09 23:36:26
1020
原创 微服务雪崩问题与系统性防御方案
雪崩效应是指单个服务故障通过调用链扩散导致系统崩溃的现象,其形成过程包括初始故障、资源阻塞、资源耗尽和故障扩散四个阶段。针对这一问题,文章提出了四道防御体系:超时处理(基础防护)、仓壁模式(故障隔离)、断路器(熔断机制)和限流(预防性保护)。这四道防线共同构成了"预防+补救"的弹性防御系统,其中限流是预防措施,其他三者是补救手段。通过综合运用这些方案,可以有效构建高韧性的微服务系统,保障核心业务的持续可用性。
2025-09-09 18:52:44
843
原创 深入解析TCP核心机制:连接管理、流量与拥塞控制
TCP协议通过三次握手建立可靠连接、四次挥手有序释放连接。流量控制采用滑动窗口机制动态调整发送速率,避免接收方缓冲区溢出。拥塞控制则通过慢启动、拥塞避免、快重传和快恢复四个算法,动态探测网络容量并应对拥塞。这些机制共同保障了TCP的可靠传输,是网络通信的核心技术基础。
2025-09-08 18:51:57
1069
原创 深入解析 Java 的类加载机制
解密Java类从字节码到内存对象的诞生全过程。本文精讲加载、连接、初始化的核心步骤,深入双亲委派模型机制,为你揭示JVM类加载器的层次结构与工作原理,是提升Java内功的必读指南。
2025-09-06 21:35:59
798
原创 一篇文章带你彻底搞懂 JVM 垃圾收集器
JVM垃圾收集器是内存管理的核心组件,其设计围绕分代模型和算法权衡展开。采用分代收集理论,将堆划分为新生代(复制算法)和老年代(标记-清除/整理算法),针对对象生命周期差异采用不同策略。基础算法包括标记-清除(产生碎片)、复制(高效但浪费空间)和标记-整理(无碎片但耗性能)。主流收集器如Serial(单线程)、Parallel Scavenge(高吞吐)、CMS(低延迟)和G1(可预测停顿)各有适用场景,需根据应用需求(吞吐量/延迟)选择。现代JVM中G1因平衡性成为默认推荐,但特定场景下其他收集器仍有优势
2025-09-04 19:30:47
694
原创 深入学习Redis——删除策略
Redis通过两种机制管理内存:1.过期key删除采用"惰性删除+定期删除"组合策略:惰性删除在访问时检查过期key,节省CPU但可能内存泄漏;定期删除通过随机采样主动清理过期key,平衡内存与CPU消耗。2.内存淘汰策略在达到内存上限时触发,分为三类:不淘汰(noeviction)、从所有key中淘汰(allkeys-)、仅从过期key中淘汰(volatile-),提供8种具体策略如LRU、LFU等,根据业务场景可选择不同淘汰规则来平衡数据保留与内存使用。
2025-09-03 18:32:12
1104
原创 深入学习Redis——持久化方式
Redis持久化机制对比:RDB通过定时快照存储二进制文件,具有高性能和快速恢复的优点,但数据可靠性低;AOF记录写操作日志,可靠性高但文件体积大、恢复慢。混合持久化结合两者优势,在AOF重写时首先生成RDB快照,再追加增量命令,实现快速恢复与高可靠性的平衡。RDB适合定时备份和数据迁移,AOF适合数据安全要求高的场景,混合模式则兼顾了性能与可靠性。
2025-09-02 23:03:14
634
1
原创 深入学习Redis——五种常用数据类型
Redis提供的五种核心数据结构绝非简单的数据容器,而是经过精密设计的工程解决方案。它们各自解决了特定场景下的数据建模与操作效率问题,是现代分布式系统架构中不可或缺的组件。String类型的原子操作特性使其成为高性能计数器和分布式锁的理想选择;Hash类型通过field-value映射为对象存储提供了最优解;List的双端操作能力支撑了消息队列和时间线功能;Set的集合运算为社交关系和数据去重提供了数学基础;ZSet通过score排序机制实现了高效的排行榜和优先级队列。
2025-09-02 18:38:53
1351
原创 SpringMVC的核心架构与工作原理解析
SpringMVC是Spring框架中的Web开发模块,基于MVC模式实现请求处理、业务逻辑与视图展示的分离。它通过DispatcherServlet统一分发请求,配合HandlerMapping、HandlerAdapter等组件完成处理流程,解决了传统Servlet开发中代码耦合高、维护难的问题。借助@Controller、@RequestMapping等注解,开发者可便捷处理参数绑定、JSON返回和页面跳转,显著提升开发效率。其核心优势在于清晰的职责划分、简化开发流程和良好的扩展性,已成为Java W
2025-09-01 18:37:52
839
4
原创 告别繁琐配置!深度解析Spring Boot 自动配置原理
SpringBoot自动配置机制深度解析:本文通过剖析@SpringBootApplication注解,揭示SpringBoot自动配置的核心原理。关键发现包括:1)@EnableAutoConfiguration作为总开关,通过AutoConfigurationImportSelector动态加载配置;2)自动配置类通过META-INF/spring.factories标准化注册,实现解耦和扩展;3)SpringFactoriesLoader机制扫描所有jar包中的配置清单。这种"约定优于配置+
2025-08-24 15:10:07
697
原创 Spring学习笔记:Spring中Bean的生命周期
本文介绍了Spring框架中Bean的生命周期,包括实例化、属性赋值、初始化、使用和销毁五个阶段。每个阶段详细说明了Spring容器的处理逻辑和关键扩展点,如依赖注入、Aware接口回调、BeanPostProcessor处理等。文章通过餐厅招聘厨师的通俗比喻,帮助理解Bean从创建到销毁的完整过程,并强调了合理控制生命周期对资源管理的重要性。
2025-08-17 14:30:11
852
原创 Mybatis学习笔记:Executor执行器详细解读
MyBatis的三种Executor执行器解析:SimpleExecutor是默认执行器,每次创建新Statement,适合常规查询但性能较低;ReuseExecutor通过缓存Statement重用相同SQL,可提升30%-50%高频查询性能;BatchExecutor支持批量操作,大幅减少数据库交互但需手动管理。选择策略:Simple适合通用场景,Reuse适合重复SQL,Batch适合批量写入。合理选择执行器能显著优化MyBatis性能,需根据业务场景的SQL特征灵活配置。
2025-08-10 16:54:55
741
原创 MyBatis学习笔记:Mapper接口的工作原理
MyBatis的Mapper接口通过JDK动态代理实现SQL方法映射,自动将接口方法转换为SQL执行指令。代理对象拦截方法调用,根据"接口名+方法名"定位MappedStatement,由Executor执行SQL并处理结果映射。支持resultType自动映射和resultMap复杂映射(包括嵌套对象和集合),通过参数转换机制实现Java对象与SQL参数的绑定。整个流程包含动态代理生成、SQL定位、参数处理、执行和结果映射五个关键环节,实现了接口方法与SQL操作的解耦。
2025-08-09 15:11:51
632
1
原创 HTTP与HTTPS协议的详细解读
HTTPS不是新协议,它使用了隧道进行通信,先让HTTP与 SSL(Secure Sockets Lay,er)通信,再有SSL与TCP通信。通过使用SSL,HTTPS具有了加密(防窃听),认证(防伪造)和完整性保护(防篡改)
2025-07-30 19:20:37
966
原创 对计算机网络模型的理解
网络模型采用分层设计将复杂通信功能模块化,简化开发维护。OSI七层模型是理论标准,TCP/IP四层模型是实际应用架构。应用层通过HTTP/DNS等协议实现具体功能;传输层用TCP/UDP提供端到端服务;网络层通过IP协议寻址和路由;网络接口层处理MAC地址转换。分层设计使各层专注自身功能,上层无需关心底层实现,提高了网络通信的灵活性和可维护性。
2025-07-28 19:03:33
783
原创 对JVM的理解与感悟
JVM(Java Virtual Machine)是Java平台的基础,它有自己的指令集,并在运行时操作不同的内存区域(JVM内存模型)。JVM虚拟机运行于之上,将字节码加载到JVM内存模型中,通过解释器将字节码翻译成当前平台CPU能识别的机器码。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。JVM是运行在操作系统之上的,所以,它与硬件没有直接交互。通常,我们编写的Java源代码在编译后会生成一个Class文件,称为字节码文件。
2025-07-23 19:05:43
310
原创 线程池的状态机制详解
线程池的状态分为RUNNING、SHUTDOWN、STOP、TIDYING和TERMINATED五种状态。RUNNING是初始状态,能接收新任务;调用shutdown()进入SHUTDOWN状态,不再接收新任务但处理队列任务;调用shutdownNow()进入STOP状态,中断所有任务。当任务队列和线程都为空时转为TIDYING状态,执行terminated()方法后进入TERMINATED终止状态。状态切换通过CAS原子操作保证线程安全。
2025-07-22 18:05:09
457
原创 线程池的核心配置参数和流程
线程池是一种管理和复用线程的机制,通过维护固定数量的线程来执行任务,避免频繁创建销毁线程的性能损耗。相比直接创建线程,线程池能减少资源消耗、控制并发数量并统一管理任务。Java提供了ThreadPoolExecutor类来创建线程池,核心参数包括线程数量、任务队列和拒绝策略等。线程池执行流程遵循"核心线程→任务队列→非核心线程→拒绝策略"的顺序。关闭线程池时可以使用shutdown()或shutdownNow()方法,前者等待任务完成,后者立即终止。合理使用线程池能提高系统性能和稳定性。
2025-07-21 19:23:24
611
原创 CAS的理解与解读
的全称是Compare And Swap,中文意思是“比较并交换”。是CPU支持的一种对内存中的共享数据进行操作的特殊CPU指令,用于对内存中的共享数据,进行的读写操作。进行读写操作时,CPU会比较内存中某个值是否和预期值相同,如果相同,则将这个值更新为新值;如果不相同,则不做更新。
2025-07-19 17:08:52
677
原创 StringBuilder类的数据结构和扩容方式解读
在了解StringBuilder类的数据结构和扩容方式前,我们先回顾一下什么是StringBuilder类: 1. StringBuilder类是处理可变字符串的一个类。它提供了一个可变的字符序列,在进行字符串拼接或修改时,比使用String类更高效。 2. StringBuilder类它允许直接修改字符串内容,而不需要每次都创建新的字符串对象。在我的第一篇博客中说到过:String对象一旦创建后它的内容是不可改变的,所以每次修改其都会创建新的对象,还要注意的是StringBui
2025-02-10 18:13:16
328
原创 String类的equals()的作用和源代码解读
使用String类的equals方法在比较两个字符串时,首先会检查两个对象的引用是否相同,如果相同,接着检查传入的对象是否是String类型,如果符合条件,则继续比较字符串的长度。如果长度不同,直接返回false,如果长度相同,则逐个字符比较两个字符串的内容。如果内容完全相同,返回true,否则返回false。
2025-01-20 19:25:50
1387
原创 String为什么是不可变的?
我们可以看到String内部是使用一个字符数组来保存当前字符串中的所有字符,并且这个数组是用final关键字修饰的。使用final关键字修饰的类为最终类,该类不能被继承。使用final关键字修饰的方法为最终方法,该方法也不能被其子类重写。
2025-01-19 21:59:09
345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅