自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringCache :让缓存开发更高效

定制化 RedisCacheManager 示例// 定义不同缓存名称的个性化配置static {// 用户数据缓存1小时// 商品数据缓存2小时且压缩值// 默认配置模板.computePrefixWith(cacheName -> "v2:" + cacheName + ":") // 自定义前缀策略@Bean@Override.withInitialCacheConfigurations(CACHE_CONFIG_MAP) // 应用个性化配置。

2025-11-04 09:13:03 1180 1

原创 如何在Java中整合Redis?

Bean// 设置连接工厂(必需)// Key序列化配置(String类型)// Value序列化配置(JSON格式)// 初始化模板(必需)键序列化使用 StringRedisSerializer,保证键的可读性值序列化使用 Jackson,支持复杂对象存储必须调用 afterPropertiesSet() 完成初始化。

2025-11-02 12:39:41 1017

原创 深入理解锁的优化机制

锁消除是指编译器或 JVM 在运行时,通过逃逸分析(Escape Analysis)发现某些锁对象不会被多个线程访问,从而自动移除这些锁的优化过程。其核心思想是基于对象作用域分析,当确认同步操作不会引发线程安全问题时,去除冗余的同步开销。自旋锁的核心思想是采用"忙等待"策略,当线程竞争锁失败时,不会立即进入阻塞状态,而是保持运行状态循环检查锁的持有状态(即自旋)。锁粗化是一种JVM层面的优化技术,其核心思想是将多个连续的、短时间的锁获取/释放操作,合并为一次范围更大的锁操作。

2025-11-01 11:26:10 1212

原创 深入剖析 Spring Bean 的生命周期

根标签和嵌套的<bean>标签声明,支持属性注入(<property>)、构造函数注入()等配置。示例:<beans></bean>

2025-10-30 08:45:00 1339

原创 深入理解线程安全

线程安全是多线程编程中最基础也是最重要的概念之一。根据《Java 并发编程实践》中的权威定义,线程安全指的是:当多个线程同时访问一个对象时,如果不需要考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步操作,调用这个对象的行为都能获得正确的结果,那么这个对象就是线程安全的。在实际开发中,线程安全问题往往会导致一些难以复现的bug,可能在生产环境运行数日甚至数月才突然出现,给系统稳定性带来极大挑战。

2025-10-29 08:45:00 722

原创 深入理解 JVM 内存模型

在 JDK 8 及以后版本中,JVM 内存模型经历了重大改进,摒弃了容易导致内存溢出的"永久代"(PermGen),转而采用更灵活的"元空间"(Metaspace)。JVM 内存模型(JVM Memory Model)是 Java 虚拟机规范中定义的一套完整的内存管理架构,它规范了 Java 程序运行时的内存分配、使用和回收机制。线程私有区域的特点是各个线程都有自己的独立副本,这些区域的内存管理相对简单,因为线程结束后会自动释放,无需垃圾回收机制介入。: 当线程请求的栈深度超过虚拟机允许的最大深度时抛出。

2025-10-28 08:45:00 1509

原创 深入理解 Java 中的 synchronized 关键字

synchronized 是 Java 中用于实现线程同步的关键字,它提供了内置的锁机制来协调多线程对共享资源的访问。在 Java 并发编程中,synchronized 是最基本、最常用的同步手段之一。// 需要同步的代码System.out.println("使用自定义锁");优势可以创建多个锁对象实现更细粒度的控制避免直接使用this或Class对象可能导致的问题锁对象通常声明为final防止意外修改。

2025-10-27 10:32:01 1497

原创 什么是Nginx?:掌握高性能 Web 服务器核心技术

在当今互联网架构中,Nginx(发音为 "engine x")无疑是最受欢迎的 Web 服务器之一,同时还承担着反向代理、负载均衡、缓存等重要角色。它由俄罗斯程序员 Igor Sysoev 于2004年开发,最初的设计目标就是解决高并发场景下的性能瓶颈(C10K问题),如今已被阿里巴巴、腾讯、百度、Netflix、Dropbox等全球顶级互联网企业广泛采用。根据 W3Techs 2023年的统计,Nginx 在全球最繁忙网站中的市场份额超过40%,远超 Apache 的23%。

2025-10-26 13:53:46 1661

原创 解析常见的限流算法

限流技术的核心目标:在保证系统服务质量的前提下,合理控制请求流量,避免资源被过度占用。

2025-10-25 13:57:51 1454

原创 解析常见的负载均衡算法

负载均衡(Load Balancing)是指将网络请求、计算任务或数据流量均匀地分配到多个服务器或资源节点上,以避免单个节点过载,提高系统的整体性能、可用性和扩展性。常见的负载均衡算法可以分为静态负载均衡算法和动态负载均衡算法两大类。

2025-10-24 09:41:32 1213

原创 什么是补偿事务 TCC?

订单服务创建订单(状态为"待支付")库存服务扣减商品库存(确保有货)支付服务扣减用户账户余额(完成支付)事务一致性要求所有步骤成功后,订单状态更新为"已支付"若任一步骤失败,回滚所有操作典型异常场景举例用户购买商品A(库存仅剩1件),同时有另一个用户也在购买同一商品用户账户余额不足(如账户余额100元,商品价格120元)网络抖动导致服务间通信超时/*** 订单服务TCC接口* 使用Seata的@TwoPhaseBusinessAction注解定义TCC事务。

2025-10-23 17:29:59 1479

原创 深入理解分布式事务

原子性(Atomicity): 事务中的所有操作要么全部完成,要么全部不完成一致性(Consistency): 事务执行前后,数据库从一个一致状态变为另一个一致状态隔离性(Isolation): 多个并发事务之间互不干扰持久性(Durability): 事务一旦提交,其结果就是永久性的银行转账:从账户A扣款和向账户B加款必须在同一个事务中完成电商下单:创建订单记录和扣减库存需要在同一事务中处理。

2025-10-22 10:33:36 1370

原创 一次完整的 HTTP 请求经历什么步骤?

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种基于TCP/IP 协议簇的应用层协议,用于在客户端(如浏览器、App)和服务器之间传输超文本数据(如 HTML、CSS、JavaScript、图片、JSON 等)。无状态特性服务器不会记录客户端的历史请求状态,每个HTTP请求都被视为独立的新请求实际业务中通过以下机制解决无状态问题:Cookie:客户端存储的小型文本数据(如会话ID)Session:服务器端存储的用户会话数据。

2025-10-21 10:39:54 1485

原创 Redis 数据类型与使用场景

Redis(Remote Dictionary Server)是一款开源的、基于内存的高性能键值对(Key-Value)存储数据库,由 Salvatore Sanfilippo 于2009年开发。它采用ANSI C语言编写,支持网络访问,并提供多种语言的客户端API。String:简单键值对存储,适合缓存单个值(如用户token)、计数器(如PV统计)、会话存储(如Session)。支持原子性增减操作,最大512MB,是最基础的数据类型。Hash。

2025-10-20 19:22:41 1451

原创 JVM 垃圾收集算法解析

G1(Garbage-First)是 JDK 9 后的默认回收器,适用于大堆内存(如 16GB+),核心思想是"将堆划分为多个大小相等的 Region(默认 1MB~32MB)",每个 Region 可动态标记为 Eden、Survivor 或 Old,回收时优先选择"垃圾比例最高的 Region"(Garbage-First),兼顾吞吐量与响应时间。:STW,再次标记并发标记期间遗漏的存活对象(比初始标记久,但通过"卡表"优化,仍可控);这是现代JVM(包括HotSpot)采用的核心判断机制。

2025-10-15 08:45:00 1150

原创 Redis 的原子性操作

首先需要明确一个关键概念:Redis 的原子性是指单个命令的执行是 "不可中断" 的—— 当一个命令开始执行后,直到其执行完毕,Redis 不会中断它去执行其他命令。Redis 支持通过 Lua 脚本执行自定义逻辑,且整个 Lua 脚本的执行过程是原子性的—— 脚本执行期间,Redis 不会中断或执行其他命令。需要特别注意的是:Redis 仅保证 "单个命令" 的原子性,多个命令的组合并不天然具备原子性。当需要多个命令组合实现原子性时,Redis 提供了两种方案:MULTI/EXEC事务和Lua 脚本。

2025-10-14 09:38:17 1599

原创 如何实现分布式幂等性设计?

幂等性(Idempotence)最初是一个数学概念,指一个运算在相同条件下多次执行所产生的结果与一次执行的结果相同。在计算机科学领域,特别是分布式系统中,幂等性被定义为:对于同一个接口或业务操作,无论执行多少次,最终产生的业务结果和系统状态都保持一致。

2025-10-13 08:45:00 1079

原创 Redis 分布式锁解析

分布式锁是一种在分布式环境下,用于协调多个节点(进程或服务)对共享资源访问的同步机制。它能够保证在同一时间,只有一个节点可以获取到锁,从而独占对共享资源的操作权,避免并发问题导致的脏读、脏写、数据不一致等情况。唯一性:锁Key需能唯一标识共享资源,避免不同资源共用同一把锁导致的并发问题。操作订单ID为"123"的共享资源时,锁Key应设计为操作商品ID为"456"的库存时,锁Key应为避免使用通用的lock:order或lock:stock可读性:锁Key的命名需清晰易懂,便于后续排查问题。

2025-10-12 12:00:00 2102

原创 剖析Spring 循环依赖

循环依赖是指两个或多个 Spring Bean 之间存在相互引用的关系,形成一个依赖的闭环结构。这种依赖关系会导致 Bean 初始化过程中的"死锁"问题。简单循环依赖:Bean A 依赖 Bean B,同时 Bean B 又依赖 Bean A,形成 A ↔ B 的依赖环复杂循环依赖:Bean A 依赖 Bean B,Bean B 依赖 Bean C,而 Bean C 又依赖 Bean A,形成 A → B → C → A 的依赖链自环依赖:Bean A 直接或间接地依赖自身(较少见)本质分析。

2025-10-11 08:45:00 1396 2

原创 Redis 常见问题与解决方案

Redis的RDB持久化是通过fork子进程的方式实现的,这种机制在Linux系统上依赖操作系统的内存管理特性。当Redis实例内存使用量较大时,fork操作可能会遇到各种系统限制。加入/etc/rc.local实现开机自动禁用。可将此脚本加入crontab定时执行。:具有数据校验和自动修复功能。

2025-10-10 09:19:46 1523

原创 Redis 缓存与数据库谁先更新?

详细时序分析时间线程A(读请求R1)线程B(写请求W)DB状态Redis状态t1检查缓存,未命中张三空t2发起DB查询张三空t3更新DB为"李四"李四空t4删除缓存李四空t5获取到DB结果"张三"李四空t6写入缓存"张三"李四张三。

2025-10-09 18:39:36 1527

原创 Redis 解决 key 冲突指南

Redis 是基于键值对(Key-Value)的内存数据库,其核心特性之一是键的唯一性——在同一个 Redis 数据库(DB)中,不允许存在两个相同的 key。当我们尝试向 Redis 写入一个已经存在的 key 时,新的 value 会直接覆盖旧的 value,这种因"键重复"导致的数据异常覆盖现象,就是 Redis key 冲突。具体表现显式覆盖:直接使用 SET 命令覆盖已存在的 key隐式覆盖:通过 INCR、APPEND 等命令修改已存在的 key。

2025-10-08 12:00:00 1310

原创 Redis 提高缓存命中率指南

缓存命中率是衡量缓存系统效率的核心指标,指在一定时间范围内,成功从缓存中获取数据的请求数占总请求数的比例。缓存命中率 = (命中缓存的请求数) / (总请求数) * 100%命中缓存数据存在于Redis缓存中数据处于有效状态(未过期)数据未被淘汰(如LRU算法未将其移除)典型特征:响应时间通常在10ms以内,完全避免了数据库访问未命中缓存缓存穿透:请求的数据根本不存在于缓存和数据库中缓存击穿:热点数据恰好过期,导致大量请求直接打到数据库缓存雪崩:大量缓存同时失效,数据库压力骤增。

2025-10-07 12:00:00 1076

原创 Redis过期策略与内存淘汰机制解析

维度LRULFU核心依据访问时间(最近)访问频率(次数)适用场景访问模式较稳定,无明显高频键存在明显高频访问的场景(如热点数据)精准度较低(易误淘汰高频但最近未用的键)较高(更贴合实际访问需求)实现复杂度简单复杂内存开销小较大Redis 版本所有版本4.0+

2025-10-06 12:00:00 1165

原创 Redis 有序集合解析

当 ZSet 使用 skiplist+dict 结构时,修改成员分数会触发 skiplist 节点的重新排序(删除原节点→插入新节点),若频繁修改大量成员的分数(如每秒修改 1 万条),会导致 Redis 频繁进行 skiplist 调整,性能下降。虽然 ZSet 的范围查询时间复杂度是 O(logN + K),但当 K(查询结果数量)过大时(如查询 10 万条数据),仍会占用大量 CPU 和网络资源,影响 Redis 性能。:删除指定的一个或多个成员,返回成功删除的成员数(不存在的成员会被忽略)。

2025-10-05 12:00:00 1687

原创 Redis 热点数据与冷数据解析

热点数据是指在某一时间段内(通常为秒级或分钟级),被高频访问(读操作或写操作)的数据。其核心特征是 "高访问频率",通常满足 "二八定律"—— 即 20% 的数据承载了 80% 的访问请求。

2025-10-04 11:45:00 1214

原创 Redis 为什么设计为“单线程”?

Redis 的 "单线程" 特性实际上特指其核心的命令执行模块,即对数据结构的直接操作(如 GET、SET、HSET 等命令)是由单个主线程顺序执行的。这种设计保证了数据操作的原子性和简单性,避免了复杂的线程同步问题。单线程模型下,所有命令按顺序执行。如果某个命令的执行时间过长(如 KEYS、HGETALL 等遍历大量数据的命令),会阻塞后续所有命令的执行,导致 Redis 响应延迟甚至 "假死"。Redis 的核心优势是 "基于内存的键值存储",而内存操作的速度远快于 CPU 切换开销。

2025-10-03 11:45:00 1376

原创 Redis 哈希槽解析

哈希槽(Hash Slot)是 Redis 集群实现数据分片的核心机制,它将整个数据集划分为多个逻辑分区。Redis 集群采用固定数量的哈希槽(16384个),每个键值对通过计算CRC16校验值后,再对16384取模来确定其所属的哈希槽。集群规模适配数学推算:在1000节点集群中,平均每个节点管理16个槽位实际测试:Facebook的Redis集群验证了16384槽位在300节点规模下的稳定性对比方案:早期版本曾考虑65536槽位,但会导致心跳包过大(16KB vs 4KB)网络通信优化。

2025-10-02 11:45:00 2125

原创 Redis 事务到底是什么?

Redis事务的原子性特性需要根据具体场景来评估,在设计系统时应该充分考虑这种部分原子性特征,并采取相应的补偿措施来保证数据一致性。

2025-10-01 11:45:00 1150

原创 Redis 是如何实现消息队列的?

支持从两端(O(1)时间复杂度)插入和删除元素天然支持"生产者-消费者"模型提供阻塞式获取消息的命令内存存储,性能极高(每秒可处理数万次操作)Redis 的 Pub/Sub(发布 - 订阅)模型是一种高效的"一对多"消息通信机制,它允许生产者将消息发布到特定的频道(Channel),而所有订阅该频道的消费者都能即时接收到这些消息。这种模式特别适合需要实时广播的场景,如新闻推送、实时聊天系统等。

2025-09-30 08:45:00 2037

原创 Redis 阻塞简单解析

Redis 作为一款高性能的内存数据库,其核心采用单线程模型处理网络 I/O 和键值对操作(从 Redis 6.0 开始引入了多线程 I/O,但核心命令处理仍是单线程)。单线程处理机制:所有客户端请求都会进入一个队列,由单个主线程顺序处理高效的事件循环:基于 epoll/kqueue 等 I/O 多路复用技术,能同时处理大量连接微秒级响应:正常情况下,简单命令(如 GET/SET)执行时间在 10-100 微秒之间某个命令执行时间异常(如超过 1 毫秒)事件循环被长时间占用。

2025-09-29 08:45:00 1188

原创 Redis 持久化机制:RDB 与 AOF 解析

AOF(Append Only File)是 Redis 的另一种持久化方案,其核心思想是将 Redis 执行的每一条写命令(如SET、HSET、LPUSH等)以追加的方式写入磁盘日志文件,当 Redis 重启时,通过重新执行 AOF 文件中的命令来恢复数据。RDB(Redis Database)是 Redis 默认的持久化方案,其核心思想是在指定的时间间隔内,将内存中的所有数据生成一份全量快照(Snapshot)并写入磁盘,快照文件以.rdb格式存储(默认文件名是dump.rdb)。

2025-09-28 08:45:00 1761

原创 Redis 同步机制解析

从节点主动连接主节点,复制主节点的数据集,并实时同步主节点的写操作。从节点数据与主节点差距较大,通过info replication查看master_repl_offset与slave_repl_offset差值持续增大,从节点读取到旧数据。主节点每执行一次写命令,都会将该命令发送给所有从节点,从节点执行相同命令,确保数据实时同步。主节点执行写命令后,部分从节点未同步该命令,导致主从数据差异。这是同步的核心阶段,分为两种模式:全量复制(首次同步或从节点断线过久)和增量复制(从节点短期断线后恢复)。

2025-09-27 12:00:00 5635

原创 Spring MVC 三层架构解析

在传统的 Java Web 开发中(如 Servlet+JSP),代码往往混杂在一起:数据处理、页面交互、业务逻辑全部写在 Servlet 中,导致项目维护困难、扩展性差。单个Servlet文件可能包含数百行代码,混合处理业务逻辑和视图渲染数据库操作直接嵌入业务逻辑中,难以更换数据源代码复用率低,相似功能需要重复实现单元测试困难,各功能模块耦合度过高。

2025-09-26 09:00:00 1478

原创 Swagger 详解:打造高效 API 文档与测试体系

Swagger 是一套围绕 OpenAPI 规范构建的开源工具集,它主要用于帮助开发者设计、构建、文档化和消费 RESTful API。最初由 Tony Tam 于 2011 年创建,旨在解决 API 文档维护困难的问题。2015 年,该项目被 SmartBear Software 收购,并更名为 OpenAPI Initiative(OAI),成为 Linux 基金会旗下的开源项目,目前已有 Google、Microsoft、IBM 等科技巨头参与维护。规范层。

2025-09-25 10:02:26 1669

原创 Spring MVC 常用注解详细解析

Spring MVC 作为 Java EE 领域主流的 Web 开发框架,其核心优势之一便是通过注解驱动的方式简化开发流程,降低代码耦合度。掌握 Spring MVC 常用注解,是高效进行 Web 项目开发的基础。本文将从注解的整体作用出发,按功能分类详细讲解各类核心注解的定义、属性、使用场景及示例代码,同时分享实际开发中的注意事项,帮助读者全面、深入地理解并灵活运用这些注解。

2025-09-24 11:33:36 1429

原创 Redis 缓存三大坑:击穿、穿透、雪崩的解析与解决

缓存击穿是指某个高频访问的"热点 key"(如秒杀活动的商品 ID、热门新闻的 ID),在缓存中过期失效的瞬间,大量并发请求直接穿透缓存,涌向数据库,导致数据库瞬间压力骤增,甚至引发数据库宕机的现象。缓存穿透是指请求访问的 key 在缓存和数据库中均不存在(如恶意构造的非法 ID、已删除的数据 ID),导致所有请求直接穿透缓存,全部涌向数据库,造成数据库压力过大的现象。典型场景示例攻击者批量构造不存在的用户ID(如user_999999)用户查询已下架的商品ID(商品ID在数据库中已被删除)

2025-09-23 14:02:17 1722

原创 深入理解 TCP 协议:三次握手与四次挥手的底层原理

三次握手是 TCP/IP 协议中客户端与服务器之间通过交换 3 个 TCP 报文段来完成连接建立的关键过程。我们以 "客户端发起 HTTP 请求" 这一常见场景为例,详细拆解每一步的操作细节和底层原理。

2025-09-22 14:46:46 1294

原创 MyBatis 缓存体系剖析

super(id);= null) {// 获取当前命中率0 :// 获取总请求次数// 获取命中次数。

2025-09-20 23:57:06 1465

原创 MyBatis 结果映射(ResultMap)详细解析

单表映射是 MyBatis 中 ResultMap 的最基础场景,主要解决数据库列名与 Java 实体类属性名不匹配的问题。在实际开发中,数据库设计规范与 Java 编码规范往往存在差异,这种命名不一致的情况十分常见。-- 基础映射配置 -->-- 主键映射:使用id标签提升性能 -->-- 普通字段映射 -->-- 应用场景1:根据ID查询用户 -->SELECTuser_id,user_name,user_age,FROM user</select>

2025-09-19 09:00:16 1557

空空如也

空空如也

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

TA关注的人

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