- 博客(105)
- 收藏
- 关注
原创 Redis 中的看门狗机制:分布式锁的守护者
Redis分布式锁通过看门狗机制解决锁过期问题。当客户端获取锁后,会启动一个后台线程定期检查并续期锁,防止业务未完成时锁自动释放。Redisson实现了这一机制:通过Lua脚本原子性操作锁,每10秒续期一次(默认30秒过期)。客户端正常释放锁时会停止看门狗,异常崩溃时锁会自然过期避免死锁。该机制提高了锁的可靠性,但会增加Redis负载且不适用于强一致性场景。实际应用中需权衡安全性、可用性和性能。
2025-07-17 20:11:56
1217
原创 Redis 中的脑裂 (Split-Brain)
Redis脑裂(Split-Brain)是指主从集群中同时存在多个主节点,各自独立接受写请求的危险状态。主要由于网络分区导致故障检测误判,触发新主节点选举,而原主节点恢复后仍认为自己是主节点。脑裂会导致数据不一致、服务混乱等严重问题。防范措施包括:配置min-replicas-to-write让主节点在从节点不足时拒绝写入;合理设置Sentinel的quorum和超时阈值;Redis Cluster通过多数投票和槽位管理降低风险;优化网络部署架构。理解并防范脑裂对保障Redis高可用性至关重要。
2025-07-17 10:21:49
847
原创 什么是红锁 (Redlock)
本文探讨了分布式系统中Redis分布式锁的实现及其演进,重点分析了红锁(Redlock)算法。文章首先阐述了分布式锁的必要性,指出本地锁在分布式环境中的局限性,并提出了分布式锁的四个核心目标。随后详细介绍了基于Redis单机实现分布式锁的基本方法及其缺陷,以及通过SET NX EX命令的优化方案。针对单机Redis锁的单点故障问题,文章深入解析了Redlock算法的原理,包括其在多个独立Redis节点上的获取锁流程和判断条件。最后客观评价了Redlock的优缺点,指出其提高了可用性但存在复杂性和安全性争议,
2025-07-15 19:15:12
685
原创 什么是延迟双删
分布式系统中,延迟双删策略是解决读写并发场景下缓存一致性问题的有效方法。该策略通过两次删除缓存操作:第一次在更新数据库前删除缓存,第二次在更新数据库后延迟删除缓存,解决了"先删缓存再更新数据库"策略可能导致的缓存击穿问题。延迟时间需大于一次数据读取的最大耗时,通常取经验值。此策略虽能实现最终一致性,但也增加了系统复杂性和性能开销,需根据业务场景权衡使用。
2025-07-14 21:02:27
829
原创 Redis事务失败的处理机制与处理方案
Redis事务执行涉及编译时、运行时和资源限制三类错误,分别采用整体回滚、部分执行和错误跳过的处理机制。其原子性仅体现在命令入队和执行隔离层面,不保证结果原子性。生产环境建议采用WATCH乐观锁或Lua脚本实现原子操作。WATCH通过版本号检测数据变更并重试,Lua脚本则保证操作序列的原子执行,二者都能有效解决事务失败问题,其中Lua脚本更适合复杂业务场景。
2025-07-11 17:08:12
447
原创 Redis中BigKey的隐患
Redis中的BigKey是指存储大量数据或占用大内存的键,包括巨型字符串、集合等。BigKey会引发内存失衡、网络阻塞、CPU耗尽等问题,严重影响Redis性能。检测BigKey的方法包括:1)使用redis-cli的--bigkeys命令扫描;2)通过RDB工具离线分析;3)编写脚本实时监控;4)结合业务逻辑排查。合理识别和处理BigKey对优化Redis性能至关重要。
2025-07-10 20:26:47
1025
原创 Redis分片集群原理
Redis分片集群通过哈希槽机制将数据分散到多节点,解决单机性能瓶颈。采用去中心化架构和Gossip协议同步状态,支持自动故障转移。客户端通过槽位路由访问数据,遇到迁移会进行重定向。需注意多键操作限制和最终一致性特点,支持在线扩容缩容。该方案实现了高可用、高性能和线性扩展能力,是应对大规模Redis应用的理想选择。
2025-07-05 09:43:51
1095
原创 缓存雪崩、穿透、预热、更新与降级问题与实战解决方案
缓存管理常见问题及解决方案:(1) 针对缓存雪崩,建议分散过期时间并部署高可用集群;(2) 解决缓存穿透可采用空对象缓存和布隆过滤器;(3) 缓存预热可预先加载热点数据;(4) 缓存更新推荐CacheAside模式结合双删策略;(5) 缓存降级则需预设兜底数据。这些策略需要根据业务场景灵活选择,并配合监控持续优化,才能保障系统的高效稳定运行。
2025-07-04 20:07:00
1027
原创 Redis常见性能问题
Java应用中Redis性能痛点解析及优化方案 摘要:针对Java应用与Redis交互中的常见性能问题,本文总结了7大痛点及优化方案:1)大Key问题导致内存消耗和网络阻塞,建议拆分Key、使用渐进式删除;2)热Key引发CPU瓶颈,推荐多级缓存和读写分离;3)连接池配置不当造成资源耗尽,需合理设置pool大小;4)序列化性能影响CPU和网络,宜选用高效序列化库;5)慢查询阻塞服务,应优化命令并使用管道;6)持久化策略影响性能,需权衡RDB/AOF配置;7)内存碎片降低利用率,可开启activedefrag
2025-07-03 15:00:00
511
原创 RedisCluster不可用的6大隐患
RedisCluster高可用性的潜在风险与防范措施 RedisCluster虽然具备高可用性和可伸缩性,但在特定场景下仍可能出现不可用问题。主要风险包括:1)脑裂,网络分区导致多个子集群同时写入,引发数据不一致;2)大量节点宕机,导致槽位丢失或集群不可写;3)主节点无可用副本,使部分槽位无法访问;4)配置错误(如cluster-node-timeout过短)引发服务中断;5)资源耗尽(CPU/内存/网络等)影响节点通信;6)伸缩操作失误导致数据迁移失败。 防范措施需多维度保障:部署冗余网络、合理配置参数(
2025-07-02 21:04:05
535
原创 分布式存储必知:BigKey的危害与优化
BigKey是分布式存储系统中存储超大数据或海量成员的键,会导致网络阻塞、内存消耗、CPU负载高等问题,影响系统性能和稳定性。发现BigKey可通过Redis命令、监控系统或RDB工具。避免方法包括拆分大键、选择合适数据结构、控制成员数量、定期清理和业务优化。合理设计架构和持续监控能有效减少BigKey的负面影响。
2025-07-01 20:33:04
920
原创 Redis 实现消息队列
Redis作为高性能内存数据库,凭借10万+QPS、毫秒级延迟和丰富数据结构,成为轻量级消息队列的理想选择。文章详细解析Redis三种队列实现模式:List实现简单FIFO队列,Pub/Sub适用于实时广播,Stream(Redis5.0+)则提供生产级特性,包括消息持久化、消费者组、ACK机制等。重点剖析Stream的实现细节,涵盖数据结构、消费者组工作流程及关键操作命令(XADD/XREADGROUP/XACK),为构建可靠异步消息系统提供完整解决方案。不同模式适用于应用解耦、流量削峰、实时通知等典型场
2025-06-30 21:29:39
501
原创 Redis哨兵模式
Redis哨兵模式是实现Redis高可用的核心机制,通过分布式哨兵节点监控主从状态,实现自动故障转移。核心流程包括:心跳检测、主观下线判断、客观下线投票、领导者选举和新主节点切换。需至少3个哨兵节点避免误判,采用Raft算法达成共识。关键配置参数包括quorum值、超时阈值等。该模式能自动恢复服务,但存在短暂不可用和脑裂风险,可通过min-slaves参数优化写入安全性。整体实现了故障自动处理与客户端透明访问,但配置复杂度较高。
2025-06-28 11:56:26
742
原创 Redis主从复制原理
Redis主从复制是实现高可用和读写分离的基础架构,通过主节点向从节点同步数据实现数据冗余、故障恢复和负载均衡。其核心原理包括全量同步(初次连接时完整数据复制)和增量同步(持续发送写命令)。Redis提供多种配置方式(配置文件、命令行、运行时修改)和优化参数(无盘复制、缓冲区设置等)。通过INFO replication命令可监控复制状态,常见问题如同步延迟可通过调整参数解决。主从复制是Redis哨兵和集群功能的基础。
2025-06-27 20:24:30
641
原创 Redis的持久化机制
Redis 是一种内存数据库,它将数据存储在内存中以实现极高的读写性能。然而,如果服务器发生故障或重启,内存中的数据将会丢失。为了解决这个问题,Redis 提供了持久化机制,将内存中的数据保存到磁盘上,从而保证了数据的持久性。和。
2025-06-26 20:27:11
552
原创 高性能的内存数据存储系统-Redis
Redis是一款开源的内存键值数据库,支持持久化、多种数据结构和高可用特性。核心优势包括微秒级读写性能、丰富的数据结构(如Hash、SortedSet)、RDB/AOF持久化机制,以及Redis Sentinel/Cluster提供的高可用方案。典型应用场景涵盖缓存、会话存储、排行榜和实时消息队列。但Redis不适合存储TB级数据,且持久化非实时。相比Memcached等缓存系统,Redis在数据结构、持久化和功能丰富度上更胜一筹,成为现代应用架构中的核心组件。
2025-06-25 21:05:21
493
原创 在微服务中使用 Sentinel
本文介绍了在微服务架构中集成Sentinel的实现方法。首先通过添加Maven依赖和配置YML文件完成基础集成,然后详细阐述了Sentinel的三大核心功能:流量控制、熔断降级和系统自适应保护。文章还讲解了热点参数限流、集群流控等高级特性,以及规则持久化到Nacos等配置中心的实现方案。Sentinel作为新一代流量控制组件,相比Hystrix具有更丰富的控制维度和更直观的监控界面,能够有效提升微服务系统的稳定性和可靠性。
2025-06-24 20:07:15
1088
原创 什么是Sentinel
Sentinel是阿里开源的高性能分布式系统防护组件,主要用于预防"雪崩效应"。其核心功能包括:流量控制(限流)、熔断降级(故障隔离)、系统自适应保护(动态限流)、热点参数限流(精细化控制)和授权控制(访问权限管理)。工作原理围绕资源保护展开,通过实时监控和规则匹配实现防护。Sentinel以轻量级、高可用等特点,帮助构建健壮的分布式系统。
2025-06-23 20:30:05
714
原创 TC、TM、RM如何协同解决分布式事务难题
在分布式系统架构中,事务管理一直是极具挑战性的技术难题。阿里巴巴开源的Seata框架通过其精妙的三组件架构——,为分布式事务提供了优雅的解决方案。本文将深入剖析这三个核心组件的设计原理、协作机制及最佳实践。
2025-06-21 20:18:10
460
原创 Seata:微服务分布式事务的解决方案
Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的分布式事务解决方案。Simple:简单易用Extensible:高度可扩展Autonomous:自治式架构Transaction:事务处理Architecture:系统架构在微服务架构中,当业务操作跨越多个服务时,Seata能确保这些操作的原子性一致性隔离性(Isolation)和持久性(Durability)—— 即经典的ACID特性。数据一致性。
2025-06-20 20:29:43
480
原创 Nacos:微服务架构的神经中枢与配置大脑
Nacos(Naming and Configuration Service)是阿里巴巴开源的一款集服务发现配置管理和服务治理于一体的核心平台。Naming:命名服务(服务注册与发现)Configuration:配置管理Service:服务治理在微服务架构中,Nacos扮演着服务中枢神经系统的角色,它让分散的服务能够相互感知、动态协作,并保持配置一致性。
2025-06-19 20:33:16
367
原创 Gateway:现代分布式系统的流量枢纽
在分布式系统架构中,Gateway(网关)是位于系统边界的关键组件,负责处理所有进入系统的请求。它如同建筑的玄关、城市的门户,是外部世界与内部服务之间的统一接入点。
2025-06-18 20:28:59
275
原创 Spring 无法解决循环依赖的 5 种场景
Component// 依赖其他BeanSpring 的循环依赖处理机制体现了框架设计的高度智慧,但作为开发者,最优雅的解决方案往往不是技术手段,而是架构设计。单一职责原则:拆分臃肿的 Bean依赖倒置原则:面向接口编程层次化设计:Controller -> Service -> Repository 的严格分层。
2025-03-07 18:58:59
1211
原创 Spring 三级缓存 vs 二级缓存:深度解析循环依赖的终极解决方案
/ Bean A 依赖 Bean B@Component@Autowired// Bean B 依赖 Bean A@Component@Autowired。
2025-03-04 20:55:13
803
原创 死锁发生的原因及如何避免
线程 A 等待线程 B 的资源,线程 B 等待线程 C 的资源,线程 C 又等待线程 A 的资源。线程 B 持有锁 Y,并尝试获取锁 X。:线程 A 持有锁 X,线程 B 必须等待线程 A 释放 X 后才能使用。:线程 A 持有锁 X,无法被系统强制剥夺锁 X 给线程 B。:线程在持有至少一个资源的同时,等待获取其他线程持有的资源。:存在一个线程等待链,每个线程都在等待下一个线程持有的资源。:对资源(如锁)进行编号,所有线程必须按编号从小到大申请。:若线程无法获取全部资源,则释放已持有的资源,稍后重试。
2025-02-25 14:05:04
817
原创 深入剖析Spring MVC
Model:封装应用程序的数据和业务逻辑。View:负责渲染数据(通常是 HTML 页面)。Controller:处理用户请求并协调 Model 和 View。
2025-02-18 20:52:33
952
原创 使用 JavaConfig 配置 Spring
JavaConfig 是 Spring 框架提供的一种基于 Java 的配置方式。它通过使用注解标记的类来替代传统的 XML 配置文件。JavaConfig 的核心思想是“约定优于配置”,通过注解和代码来定义 Bean 及其依赖关系。使用// 配置 Bean 的方法使用@Bean@Bean。
2025-02-15 09:24:11
1025
原创 Spring 整合 MyBatis:核心知识点详解
在传统的Java开发中,开发者需要手动管理数据库连接、事务以及SQL语句的执行。是Spring提供的一个类,用于自动扫描MyBatis的Mapper接口,并将其注册为Spring的Bean。:Spring的IoC容器可以管理MyBatis的Mapper接口,简化了对象的创建和管理。:通过Spring的配置,可以简化MyBatis的配置过程,减少冗余代码。:Spring提供了声明式事务管理,可以轻松地管理数据库事务。,并指定MyBatis的Mapper文件位置。在Spring的配置文件中,配置数据源。
2025-02-10 19:48:43
543
原创 Spring MVC
Spring MVC是一个基于MVC设计模式的Web框架,用于构建灵活、可扩展的Web应用。它通过DispatcherServlet处理请求,并将请求分发给相应的控制器进行处理。
2025-02-07 09:56:17
567
原创 Spring AOP
AOP(Aspect-Oriented Programming)是一种编程范式,旨在将横切关注点从核心业务逻辑中分离出来。通过AOP,开发者可以将日志、事务管理、安全性等通用功能模块化,从而提高代码的可维护性和可重用性。
2025-02-07 08:50:53
593
原创 深入理解Spring框架的核心概念与使用
Spring是一个轻量级的开源框架,旨在简化Java企业级应用的开发。它通过提供一系列模块,如Spring Core、Spring AOP、Spring MVC等,帮助开发者构建灵活、可扩展的应用。
2025-02-04 15:15:53
388
原创 Spring 实现注入的方式
如果没有匹配, 则回退为一个原始类型进行匹配,如果匹配则自动装配。①如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛 出异常。③如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个,都会 抛出异常。②如果指定了 name ,则从上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常。:默认按照 Bean 的名称进行注入,如果名称相同则可以选择使用。注解指定具体的 Bean 名称进行注入。
2025-02-04 14:45:01
826
原创 如何在MyBatis中优化SQL
MyBatis 是一款流行的 Java 持久层框架,它简化了数据库操作,并且能够灵活地映射 Java 对象与数据库表之间的关系。在使用 MyBatis 进行数据库操作时,SQL 性能优化是至关重要的,特别是在面对复杂查询、大规模数据处理或高并发场景时。
2025-01-13 20:58:40
802
原创 Java反射机制
Java反射(Reflection)是一种机制,它允许程序在运行时加载、探测和操作类、方法、构造函数等信息。通过反射,Java程序能够动态地获取类的详细信息,并能在运行时实例化对象、调用方法、访问字段等,而不需要在编译时就知道具体的类、方法或字段。反射机制为Java提供了极大的灵活性,常用于一些框架或库中,如Spring、Hibernate等,它们通过反射来实现依赖注入、动态代理等功能。
2025-01-06 20:43:54
1088
原创 设计模式中的代理模式
动态代理允许我们在运行时创建代理对象,而不需要为每一个委托类都编写一个具体的代理类。这提供了更高的灵活性和可扩展性。Java中的动态代理主要分为两种:基于接口的代理和基于子类的代理。在Java中,代理模式(Proxy Pattern)可以通过静态代理和动态代理两种主要方式实现。使用CGLIB需要引入相应的依赖(如Maven依赖)。2. CGLIB 动态代理。1. JDK动态代理。
2025-01-04 09:36:24
1066
原创 代理模式和适配器模式有什么区别
代理对象与目标对象通常有相同的接口,因此可以在客户端不感知的情况下替代目标对象。适配器通过将一个接口转换成客户端所期望的接口,从而使得不兼容的类能够一起工作。代理模式(Proxy Pattern)和适配器模式(Adapter Pattern)是两种结构型设计模式,它们看似相似,但在设计意图、使用场景以及功能上有一些显著的区别。:远程代理(如在分布式系统中,代理类用于远程调用目标对象)或虚拟代理(用于延迟加载某些计算量大或数据量大的对象)。:将旧的接口适配到新的接口,或者将一个类的接口适配为另一个类的接口。
2025-01-03 15:22:03
1098
原创 静态代理与动态代理区别
由于代理类在编译时就已经确定,一旦需要增加新的代理逻辑或者修改代理行为,通常需要手动修改代理类。:静态代理是在编译时就确定了代理类的实现,通常通过手动编写代理类或者由工具在编译期生成。:适用于需要根据不同的需求生成不同的代理类,或者代理的类的数量较大,且不可能在编译时知道具体的代理类的场景。静态代理需要提前确定好所有代理的类,因此比较适合代理逻辑相对简单,且代理类不需要太多变化的场景。:如果有多个接口或多个实现类需要代理,则每个接口或实现类都需要创建一个对应的代理类,可能会导致大量的代码重复。
2025-01-02 08:28:00
1092
原创 设计模式-单例模式
懒汉式:延迟加载,线程安全性差(需要双重检查锁定)。饿汉式:类加载时立即创建实例,线程安全,但浪费资源(如果实例不常用)。静态内部类:延迟加载,线程安全,不存在性能问题,推荐使用。枚举式:最安全、最简洁,JVM 保证唯一性,适合用于单例模式。通常推荐使用 静态内部类 或 枚举式,它们具有较高的性能并能避免常见的错误。
2024-12-28 22:05:58
749
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人