工程与业务系统里,事务传播(Transaction Propagation)指“外层方法与内层方法在事务边界上的绑定方式”:是否共用同一条事务上下文、是否新开事务、遇到异常时如何回滚与隔离。常见实现以 Spring 的传播行为为代表,实践中最常用的集中在以下几种。 REQUIRED:默认的“能共用就...
RabbitMQ 本身不提供“跨系统强一致”的事务能力,但可以把消息系统的能力(持久化、确认、重投、路由)与业务侧的状态机、幂等与补偿机制拼起来,实现“至少一次投递 + 幂等消费 + 可重试与可追踪”的最终一致性。关键不在某个开关,而在端到端闭环:消息不丢、可重复、可定位、可修复。 最终一致性的核心...
红黑树插入的核心思路是两段式:先按二叉搜索树(BST, Binary Search Tree)规则把新键插进去;再用“染色 + 旋转”修复红黑性质(根为黑、红节点不相邻、每条根到叶路径黑高一致等),把局部破坏消掉。 1. 第一步:按 BST 规则落位(结构先对,再谈颜色) 插入键 x 时,从根开始比...
自增 id(Auto-increment ID)本质是一种“由数据库集中发号”的主键生成策略:每插入一行,数据库分配一个新的整数编号。它被大量系统默认采用,不是因为完美,而是因为在工程实践里稳定、便宜、好用。 低成本获得“唯一且稳定”的行身份 主键的第一职责是唯一标识一行数据,并在生命周期内尽量不变...
平衡二叉树(AVL、红黑树等)把“有序集合/映射”这类问题的核心操作稳定在 O(log n):查找、插入、删除都依赖树高。要“更快”,首先要区分两种“快”:渐进复杂度更低,还是常数更小、工程上更快。前者通常需要改变问题前提(键的类型、是否需要全序、是否接受概率或摊还分析)。 复杂度下界与“为什么很难...
缓存击穿指某个热点数据的缓存条目失效(过期或被淘汰)那一刻,大量并发请求同时绕过缓存直打数据库或下游服务,形成瞬时高峰,轻则延迟飙升,重则把存储层打崩。它的“击穿”含义更接近在缓存这一层被打开了一个短时间的洞,流量从洞里灌到后端。 关键特征:热 + 失效点 + 并发 缓存击穿通常同时具备三点: 热数...
Java 里“对象引用”通常分两条线来理解:一条是语言层面“强/弱”等可达性强度,另一条是并发内存模型里“普通/volatile/原子”等可见性与有序性语义。两者描述的是不同维度,常被混在一起讨论。 可达性强度:强引用、软引用、弱引用、虚引用 强引用(Strong Reference) 最常见的引用...
Redis Cluster 不靠“全局索引表”记住每个 key 在哪台机器上,而是把整个键空间切成固定数量的槽位(hash slot),再把槽位分配给各个主节点。定位 key 的过程就是:把 key 算成某个槽位,再查这个槽位归属哪个节点。 槽位机制:16384 个 hash slot Redis ...
秒杀系统扛住 1 万并发的核心,不是“把机器堆上去”,而是把请求分层削峰:在越靠近入口的位置越早失败、越少下沉;把“抢资格”和“下单支付”解耦;把库存这一件事做成可校验、可回滚、可审计的单向流。 压力从哪里来:三类最常见的击穿点 秒杀流量的杀伤力来自“同一时间、同一资源、同一热点”。 入口层击穿:网...
垃圾回收器(Garbage Collector, GC)的差异,本质落在四件事上:面向的对象生命周期(短命或长命)、追求的指标(吞吐或延迟)、执行方式(串行或并行、停顿或并发)、以及使用的内存组织(分代或非分代、区域化)。不同实现只是把这些取舍组合成不同“配方”。 核心维度:用什么代价换什么收益 吞...