- 博客(32)
- 收藏
- 关注
原创 Spring如何解决循环依赖问题。
Spring 通过三级缓存机制,在 Bean 实例化后立即将其工厂对象放入缓存,允许其他 Bean 提前获取早期引用,从而解决了 setter 注入方式下的循环依赖问题。这一机制是 Spring 框架的核心特性之一,确保了复杂依赖关系下的 Bean 创建正确性。
2025-06-16 10:25:58
89
原创 ConcurrentHashMap中的key为什么不允许为null
禁止key为null,是为了在多线程环境下保证操作的安全性和一致性,防止出现歧义,同时也简化了内部的实现逻辑。如果你有存储null键的需求,可以考虑使用。不过要注意,在使用这种方式时,需要在外部进行同步操作,以确保线程安全。
2025-06-16 10:22:42
65
原创 Redis的哨兵机制和集群有什么区别?
Redis的哨兵机制(Sentinel)和集群(Cluster)是两种不同的高可用解决方案,在架构设计、功能特性和应用场景上存在明显差异。两者的核心区别在于:哨兵机制是基于主从复制的高可用方案,而集群是分布式分片方案,后者在扩展性和性能上更具优势,但架构和运维复杂度也更高。
2025-06-13 16:36:35
721
原创 @Conditional注解有什么用,怎么用?
import com// 只有在生产环境(spring.profiles.active=prod)才创建这个Bean @Bean @OnProductionEnvironment public ProductionService productionService() {} }
2025-06-13 16:33:10
249
原创 Redis主从复制的原理
Redis主从复制通过异步命令传播和快照机制,实现数据的多节点冗余备份和读写分离。其核心优势在于高性能和数据可靠性,但需注意异步复制带来的数据一致性问题。实际部署时,建议结合哨兵或集群方案,以实现自动化的故障恢复和更高的可用性。
2025-06-13 16:28:27
857
原创 雪花算法的实现原理
雪花算法通过位运算和时间戳设计,在分布式系统中实现了高性能、唯一且有序的ID生成。其核心在于合理划分64位的空间,平衡时间跨度、节点数量和并发量的需求。实际应用中需注意时钟回拨、机器ID管理等问题,并可根据业务场景选择合适的变种方案。雪花算法(Snowflake Algorithm)是由Twitter开发的分布式ID生成算法,其核心思想是通过将64位长整型数字按不同维度拆分,生成全局唯一、趋势递增的ID。
2025-06-13 16:25:33
736
原创 MySQL 中索引、锁、事务、隔离级别与并发读问题的深层关联
索引决定锁的粒度,是高性能的基础。事务是锁的载体,控制锁的生命周期。隔离级别通过不同的锁策略,平衡一致性与性能。锁是解决并发读问题的核心手段。理解这些组件的内在联系,才能在设计高并发系统时做出合理的选择。记住:没有万能的解决方案,只有针对特定场景的最优策略。
2025-06-13 16:19:59
646
原创 给自己半天的时间,彻底搞清楚Mysql中的各种锁
全局锁是锁定整个MySQL数据库实例的锁,当全局锁被启用时,所有数据库中的表都会被锁定,其他事务无法执行写操作(如INSERT、UPDATE、DELETE),在读操作上可能根据锁的类型有所不同。全局锁是一把“双刃剑”,虽然能确保全库数据的一致性,但对业务的影响极大。在InnoDB环境下,应优先使用或物理备份工具替代全局锁;仅在非事务表或短时间维护场景中谨慎使用全局锁。数据库运维中,需始终遵循“最小化锁定范围、最短化锁定时间”的原则,平衡数据一致性与业务可用性。
2025-06-13 16:11:00
584
原创 给自己半天的时间,搞定Java中的各种锁
在Java并发编程中,乐观锁和悲观锁是两种不同的锁竞争策略,它们代表了两种截然不同的并发控制思想。悲观锁(Pessimistic Locking)是一种保守的并发控制策略,它假设:特点:Java中的实现:乐观锁(Optimistic Locking)是一种积极的并发控制策略,它假设:特点:Java中的实现:乐观锁的核心是CAS(Compare-And-Swap)操作,这是一种无锁算法。CAS操作包含三个操作数:内存位置(V)、预期原值(A)和新值(B)。当且仅当V符合预期值A时,CAS用新值B更新V的值,否
2025-06-13 15:12:08
900
原创 一个软件系统的签到数据,是应该存在数据库,还是缓存?
必须用数据库的场景签到记录需要永久保存(如用户权益凭证)。涉及复杂统计查询(如按月份、地区分析签到率)。对数据一致性要求极高(如金融类APP的签到奖励发放)。必须用缓存的场景签到接口需要支持高并发(如秒杀活动中的签到)。用户需要实时看到签到状态更新(如连续天数立即+1)。最佳实践核心原则:缓存负责“实时读写”,数据库负责“持久化和复杂查询”,通过异步同步保证最终一致性。架构示例:Redis(读写) + MySQL(存储) + Kafka(同步消息队列) + 定时任务(数据校验)。
2025-06-12 19:53:49
778
原创 十分钟搞懂使用Redis实现分布式锁
锁粒度尽量细化锁粒度(如按订单ID、用户ID加锁)避免在锁内执行耗时操作(如IO、RPC调用)过期时间合理设置过期时间(业务执行时间×1.5)关键业务使用看门狗机制监控告警监控锁获取成功率、等待时间设置锁等待超时告警降级策略高并发场景下可降级为本地锁(牺牲一致性)增加熔断机制避免级联故障代码规范使用try-finally确保锁释放避免在锁内抛出异常导致锁未释放锁操作与业务逻辑分离。
2025-06-12 19:18:09
744
原创 彻底搞定缓存的延迟双删
通过上述方案,你可以根据业务特点选择合适的延迟双删实现,在保证缓存与数据库一致性的同时,平衡系统性能与复杂度。生产环境中建议先在测试环境压测验证,再逐步灰度上线。是:在删除缓存后,等待一段时间再执行第二次删除,确保所有并发读操作完成后再清理缓存,避免脏数据写入。
2025-06-12 19:05:09
689
原创 彻底搞定缓存的延迟双删
通过上述方案,你可以根据业务特点选择合适的延迟双删实现,在保证缓存与数据库一致性的同时,平衡系统性能与复杂度。生产环境中建议先在测试环境压测验证,再逐步灰度上线。是:在删除缓存后,等待一段时间再执行第二次删除,确保所有并发读操作完成后再清理缓存,避免脏数据写入。
2025-06-12 19:01:08
886
原创 彻底搞定数据库、缓存的双写一致性
在分布式系统中,数据库与缓存的双写一致性是一个极具挑战性的问题。由于两者是异构存储且存在异步特性,强一致性很难完全保证,我们需要通过策略设计和工程实践来实现最终一致性。通过上述策略的组合使用,结合Java代码的工程实现,可以在性能与一致性之间找到平衡点,构建稳定可靠的双写架构。数据库事务完成后,缓存更新可能因网络延迟、服务异常等原因失败,导致短暂不一致。多节点同时操作时,可能出现缓存更新顺序错乱(如电商商品库存更新场景)。:对一致性要求较高、数据量大的场景(如电商商品库存)
2025-06-12 18:58:57
919
原创 彻底搞清楚token续期
Token续期是为了在用户使用应用程序时,在Token即将过期时,无需用户重新登录即可延长其有效时间,以保持用户的登录状态。
2025-06-12 18:55:15
848
原创 Redis到底是单线程还是多线程
本质:Redis是单线程核心逻辑+多线程辅助优化的混合模型,主线程负责核心命令处理,多线程用于优化IO和耗时操作实践建议避免在主线程中执行耗时操作,利用UNLINK等异步命令根据业务场景开启IO多线程(io-threads参数),提升高并发下的网络性能大集群场景使用Redis Cluster分片,突破单节点性能限制Java应用中使用异步客户端(如Lettuce)和合理的连接池配置,减少线程阻塞。
2025-06-12 17:55:39
613
原创 一文让你彻底搞定Redis缓存淘汰策略
/ 每10分钟检查一次// 1. 获取系统指标// 2. 分析访问模式(简化示例:通过访问频率区分冷热数据)// 3. 动态调整策略if (memoryUsage > jedis.info("memory").split("\r\n")[2].split(":")[1] * 0.8) { // 内存使用率超过80%// 热点数据明显,使用LRUif (!System.out.println("切换至allkeys-lru策略");} else {
2025-06-12 17:53:03
411
原创 一文让你彻底搞定Redis缓存过期策略
业务场景过期策略组合Java实现重点读多写少,中等时效性固定TTL + 惰性删除 + 缓存击穿防护互斥锁防止击穿,合理设置TTL读多写多,高时效性滑动过期 + 惰性删除每次访问时刷新TTL,保证会话活跃高并发秒杀,实时性要求短TTL + 主动刷新 + Lua原子操作定时任务主动更新,Lua脚本保证扣减原子性热点数据,几乎不更新永不过期 + 内存淘汰(allkeys-lru)读写锁控制更新,依赖LRU淘汰非热点数据。
2025-06-12 17:49:04
850
原创 读多写多的场景,如何选择缓存策略
通过结合业务场景特性选择合适的缓存策略,并配合架构层面的优化(如分级缓存、异步处理),可在读写频繁的场景中实现高性能与数据一致性的平衡。在读写频繁(读多写多)的场景中,缓存策略的选择需要在。Read/Write Through + 异步刷新。Write Behind + 定期持久化。本地缓存 + 分布式缓存预热。双写缓存 + 版本号校验。分级缓存 + 读写分离。
2025-06-12 17:42:15
658
原创 读多写少的场景,该用什么缓存读写策略
结合 Cache-Aside 的读写策略,并为缓存设置过期时间,同时在数据更新时主动失效缓存。:电商平台的商品详情页,用户每天访问量达百万次,但商家更新商品信息的频率可能每天仅几次。在读多写少的场景中(例如商品详情页、新闻资讯、字典数据等),缓存策略的核心是。:读多写少、希望减少应用代码复杂度的场景(如内部系统的字典数据)。:读多写少、数据一致性要求极高的场景(如金融交易记录、用户余额)。:读多写少、数据一致性要求较高但非实时的场景(如商品价格、库存)。读多写少场景的缓存策略核心是“
2025-06-12 17:38:50
413
原创 如何保障Redis挂了之后,数据不丢失
按指定周期将内存数据生成二进制快照文件(.rdb),故障时通过加载快照恢复数据。:实时记录所有写操作命令,故障时重放命令恢复数据。fill:#333;color:#333;color:#333;fill:none;否是模拟Redis节点故障检查哨兵是否自动切换切换成功?手动执行sentinel failover验证新主节点数据完整性使用备份文件修复不一致数据演练记录与优化。
2025-06-12 17:34:37
957
原创 说说Redis故障后限流、降级的应急预案
某电商平台在Redis主节点故障时,通过Nginx将商品详情页请求从20万QPS限流至5万QPS,同时返回简化版数据(仅包含标题/价格,不包含库存/评价),使数据库负载从90%降至40%。某电商大促期间,Redis集群因热点商品缓存失效(雪崩),导致数据库瞬间承受20万QPS,CPU负载飙升至100%,订单接口响应时间从50ms延长至5s。某理财产品抢购活动中,热点key(如库存)缓存失效,单个key被10万QPS集中访问,Redis单节点CPU打满,响应时间从1ms升至500ms。
2025-06-12 17:28:45
883
原创 彻底搞清楚Redis的雪崩、击穿、穿透、脑裂!
问题类型核心特征攻击/触发方式典型解决方案雪崩大面积缓存失效集中过期/服务宕机过期随机化/多级缓存击穿单个热点键失效高并发访问+键过期互斥锁/热点永不过期穿透请求不存在的数据恶意攻击/参数漏洞布隆过滤器/空值缓存脑裂集群出现多个主节点网络分区/配置不当哨兵模式/合理超时参数。
2025-06-12 17:20:40
788
原创 为什么说Redis的热key,大value是服务器杀手
热key指的是访问频率极高的键(例如每秒访问量超过10万次),通常对应业务中的热点数据(如热门商品ID、热搜关键词等)。大value指单个键存储的数据量过大一个包含10万条记录的List集合一个序列化后的大对象(如10MB的JSON数据)热key治理本地缓存(如JVM缓存)分担热key请求。热key分散存储(如给key添加随机后缀,分散到不同节点)。读写分离(主从模式下读请求分流到从节点)。大value优化数据拆分(如将大List拆分为多个小List,按时间或ID分片)。
2025-06-12 17:02:49
779
原创 集群、分布式、微服务常见面试问题
微服务架构是一种将复杂应用拆分为多个独立、松耦合的小型服务的架构模式。每个服务都专注于完成单一业务功能,可独立部署、开发和扩展,并通过轻量级通信机制(如REST API、消息队列)协同工作。其设计理念遵循“单一职责原则”,强调服务的自治性和可维护性,典型应用场景包括大型互联网平台、高并发系统等。适用场景:业务复杂、团队规模大、需快速迭代或对高可用性要求高的系统(如互联网电商、金融平台)。谨慎场景:小型项目或业务逻辑简单的系统(单体架构更易维护)。问题四:微服务架构中常见的通信方式有哪些?请简单介绍。
2025-06-11 17:27:51
893
原创 多线程并发安全系列问题
问题1:Java内存模型如何保证线程间的可见性?请说明volatile关键字的底层实现原理(内存屏障)Java内存模型(JMM)通过一系列规则来保证线程间的可见性,主要机制包括关键字、同步块以及关键字等。happens-before原则:JMM定义了一系列happens-before规则,确保一个线程的写操作对另一个线程可见内存屏障:编译器会在指令序列中插入特定类型的内存屏障,防止指令重排序并保证内存可见性缓存一致性协议:现代CPU通过MESI等协议保证多核CPU缓存的一致性通过内存屏障(Memory Ba
2025-06-11 15:52:41
1001
原创 一文搞定MVCC,没有那么多乱遭的。
数据修改= 往账本写新记录(旧记录存档)读操作= 查某个时间点的账本快照事务提交= 正式确认该笔交易Purge清理= 银行定期归档旧账本通过这种机制,MySQL实现了:✅ 读写不阻塞✅ 高并发下数据一致性✅ 避免大部分锁竞争。
2025-06-11 13:36:58
436
原创 Mysql没人比我懂
第一问:MySQL索引有哪些类型?B-tree和Hash索引的区别是什么?MySQL 支持多种索引类型,不同存储引擎支持的索引类型也不同。最常用的是 InnoDB 存储引擎,它主要支持 B-Tree 索引(实际实现是 B+Tree),同时也利用了 Hash 索引 的概念进行内部优化(自适应哈希索引)。以下是 MySQL 中常见的索引类型及其支持的引擎:B-Tree 索引 (B+Tree 实现)Hash 索引Full-Text (全文) 索引Spatial (R-Tree) 索引T-Tree 索引 (NDB
2025-06-11 12:22:19
628
原创 说说我对Springioc和di的理解
控制:ioc容器控制对象、控制对象的创建反转:主动寻找依赖、转变为被动接受依赖依赖:程序依赖容器、因为容器会提供给程序想要的对象注入:容器注入程序、注入程序需要用到的对象
2021-01-20 09:53:07
77
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人