Merge pull request #1450 from CyC2018/ignore-revision-log

Stop tracking 修订记录.md
This commit is contained in:
CyC2018
2026-10-23 12:03:02 +08:00
committed by GitHub
2 changed files with 1 additions and 131 deletions
+1
View File
@@ -3,3 +3,4 @@
!tencent13147342467085209222.txt
desktop.ini
CLAUDE.md
修订记录.md
-131
View File
@@ -1,131 +0,0 @@
# 修订记录
记录对笔记内容的实质性修订:事实错误、过时内容、代码错误,以及少量补充。每条给出原因和依据,错别字与排版修正不单独列出。依据优先引用官方文档、规范、论文和源码。
## 2026-10-22 系统设计笔记(PR #1447)
### 分布式.md
- 分布式锁:SETNX 和 EXPIRE 两条指令不原子,改为 `SET key value NX PX`;释放锁改为 Lua 脚本比较 value 后再删除;补充锁续期、主从切换丢锁、Redis 8.4 的 DELEX。依据:[Distributed Locks with Redis](https://redis.io/docs/latest/develop/clients/patterns/distributed-locks/)、[SET](https://redis.io/docs/latest/commands/set/)、[DELEX](https://redis.io/docs/latest/commands/delex/)、[Redisson 看门狗](https://redisson.pro/docs/data-and-services/locks-and-synchronizers/)。
- RedLock:补充时钟和进程暂停下的争议,以及栅栏令牌。依据:[How to do distributed locking](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html)、DDIA 第 9 章“分布式锁和租约”。
- 2PC:原文把协调者部分发送 Commit 后的不一致写成永久性的。实际上协调者先写决定日志再发送,失败后无限重试,参与者在此期间处于存疑状态;3PC 假设网络延迟有上界。依据:DDIA 第 8 章“两阶段提交(2PC)”“协调者失效”“三阶段提交”。
- CAP:一致性改为线性一致性,可用性改为“未故障节点都在有限时间内响应”,分区容忍性改为“分区时系统仍能运行”,删除“三选二”的说法。依据:[Gilbert & Lynch, Brewer's conjecture (2002)](https://dl.acm.org/doi/10.1145/564585.564601)、DDIA 第 10 章“CAP 定理”“帮不上忙的 CAP 定理”;PACELC 依据 [Abadi, Consistency Tradeoffs in Modern Distributed Database System Design (2012)](https://www.cs.umd.edu/~abadi/papers/abadi-pacelc.pdf)。
- Paxos:原文说 Prepare 响应返回“承诺过的提议”,并据此让 Proposer B 被迫使用 v=8,推导错误。Prepare 响应只返回已接受(Accept)的最大编号提议;原“正确性”论证中“Acceptor 不会接受两个不同的提议”不成立,改为多数派相交;可终止性改为可能活锁。相应删除 4 张按错误例子画的示意图。依据:[Lamport, Paxos Made Simple](https://lamport.azurewebsites.net/pubs/paxos-simple.pdf) §2.2、§2.4。
- Raft:原文“主要是用来竞选主节点”不准确,改为共识算法;补充任期、一个任期只投一票、只投给日志不比自己旧的候选者、分区时的行为。依据:[In Search of an Understandable Consensus Algorithm](https://raft.github.io/raft.pdf) §5.1、§5.2、§5.4.1。
- 新增 TCC(空回滚、悬挂)、Saga、RocketMQ 事务消息。依据:[深度剖析 Seata TCC 模式](https://seata.apache.org/zh-cn/blog/seata-tcc/)、[Seata Saga 模式](https://seata.apache.org/zh-cn/docs/user/mode/saga/)、[RocketMQ 事务消息](https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/)。
- 最终一致性补充读己之写和单调读。依据:DDIA 第 6 章“复制延迟的问题”。
### 系统设计基础.md
- 原文“多线程能够缩短响应时间”不准确,改为提高吞吐量;补充分位数、尾部延迟放大。依据:DDIA 第 2 章“描述性能”。
- 故障转移补充异步复制丢写入和脑裂。依据:DDIA 第 6 章“处理节点故障:故障切换”。
- 新增限流、降级、熔断。依据:[Google SRE Book, Handling Overload](https://sre.google/sre-book/handling-overload/)、[Azure 架构中心 Circuit Breaker 模式](https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker)。
### 集群.md
- 加权最少连接原文“根据权重计算出每台服务器能处理的连接数”有误,改为选择“连接数 / 权重”最小的服务器。依据:[LVS 调度算法 Weighted Least-Connection](http://www.linuxvirtualserver.org/docs/scheduling.html)、[Nginx least_conn](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#least_conn)。
- 补充平滑加权轮询。依据:[Nginx 提交 52327e0](https://github.com/nginx/nginx/commit/52327e0627f49dbda173176d8ed5b6b94d82c0f9)。
- 转发实现补充四层与七层、LVS 的 NAT 和 DR 模式。依据:[LVS VS-NAT](http://www.linuxvirtualserver.org/VS-NAT.html)、[LVS VS-DR](http://www.linuxvirtualserver.org/VS-DR.html)。
### 攻击技术.md
- XSS 补充存储型、反射型、DOM 型和按输出位置转义、CSP。依据:[OWASP XSS](https://owasp.org/www-community/attacks/xss/)、[OWASP XSS Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html)、[MDN CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)。
- CSRF 补充 SameSite,Chrome 默认 Lax。依据:[MDN Set-Cookie SameSite](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Set-Cookie#samesitesamesite-value)、[Chrome: SameSite cookie changes](https://developer.chrome.com/blog/cookie-update)、[OWASP CSRF Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html)。
- SQL 注入:原文推荐的 PHP Magic Quotes 已在 PHP 5.4 移除。依据:[PHP 手册 Magic Quotes](https://www.php.net/manual/en/security.magicquotes.php);最小权限依据 [OWASP SQL Injection Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html)。
- DoS 补充类型与防范,SYN Cookie 依据 [RFC 4987](https://www.rfc-editor.org/rfc/rfc4987)。
### 缓存.md
- 原文“MySQL 具有查询缓存机制”已过时,查询缓存在 8.0 移除,改为 InnoDB Buffer Pool。依据:[MySQL 5.7 手册 The MySQL Query Cache](https://dev.mysql.com/doc/refman/5.7/en/query-cache.html)(“removed in MySQL 8.0”)、[InnoDB Buffer Pool](https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool.html)。
- 一致性哈希原文把它与 DHT 混为一谈,且新增节点时的数据迁移方向写反(应是把 C 上位于 B 和 X 之间的数据迁到 X)。依据:[Karger et al., Consistent Hashing and Random Trees (1997)](https://dl.acm.org/doi/10.1145/258533.258660)、DDIA 第 7 章“一致性哈希”。
- 补充 Redis Cluster 使用 16384 个哈希槽而非一致性哈希。依据:[Redis Cluster 规范与扩展](https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/)。
- 缓存一致性改为 Cache Aside(先更新数据库再删除缓存)。依据:[Scaling Memcache at Facebook (NSDI 2013)](https://www.usenix.org/system/files/conference/nsdi13/nsdi13-final170_update.pdf) §3.1。
- 新增缓存击穿;淘汰策略补充缺点。依据:[Redis Key eviction](https://redis.io/docs/latest/develop/reference/eviction/)。
- FIFO 原文“最先进入的数据(最晚的数据)被淘汰”自相矛盾,改写。
### 消息队列.md
- “流量削锋”改为“流量削峰”。
- 补充消费者组、分区内有序、消费者数量不超过分区数。依据:[Kafka Documentation, Consumers](https://kafka.apache.org/documentation/#intro_consumers)(“Kafka only provides a total order over records within a partition”)。
- 补充消息队列侧的持久化与多副本、重投递乱序。依据:[Kafka Replication](https://kafka.apache.org/documentation/#replication)、DDIA 第 12 章“确认应答与重新传递”。
## 2026-10-22 各科笔记错误修复(PR #1448)
以下代码修复均已用 JDK 21 编译运行验证:从笔记中提取代码块,与暴力解法对照,修复前的代码在给出的输入下失败,修复后通过。
### 代码错误
- Leetcode 题解 - 双指针.md,633 两数平方和:`i * i + j * j` 用 int 计算会溢出,改为 long。输入 2147483600 时旧代码返回 false,正确答案为 true(7060² + 45800²)。依据:[题目约束 0 ≤ c ≤ 2³¹ - 1](https://leetcode.com/problems/sum-of-square-numbers/)。
- Leetcode 题解 - 树.md,437 Path Sum III:递归参数 `sum - root.val` 用 int 会溢出,改为 long。节点值均为 10⁹ 量级的用例旧代码返回 2,正确答案为 0。依据:[题目约束 -10⁹ ≤ Node.val ≤ 10⁹](https://leetcode.com/problems/path-sum-iii/)。
- Leetcode 题解 - 动态规划.md,494 Target Sum:`sum < S` 没有处理 S 为负数的情况,`nums=[1], S=-3` 时数组长度为负抛出异常;`(sum + S) % 2 == 1` 在和为负奇数时不成立,`nums=[1,1], S=-3` 返回 1,正确答案为 0。改为 `sum < Math.abs(S) || (sum + S) % 2 != 0`。依据:[题目约束 -1000 ≤ target ≤ 1000](https://leetcode.com/problems/target-sum/)、[JLS §15.17.3 余数的符号与被除数相同](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.3)。
- 算法 - 符号表.md,链表实现的 delete():删除唯一的节点时 first 变为 null,随后访问 `first.next` 抛出 NullPointerException,在删除头节点后补 `return`。依据:Sedgewick《Algorithms》第 4 版 §3.1 SequentialSearchST。
- 57.1 和为 S 的两个数字.md:`array[j]` 是未定义的变量,无法编译,改为 `nums[j]`。
- 18.1 在 O(1) 时间内删除链表节点.md:tobeDelete 为 null 时返回 null 会丢失整个链表,改为返回 head。
- 3. 数组中重复的数字.md:while 循环退出时 `nums[i] == i`,其后的 `swap(nums, i, nums[i])` 是空操作,删除。穷举长度 1~7 的全部 873612 个输入验证结果不变。
- Leetcode 题解 - 双指针.md,88 Merge Sorted Array:`while (index2 >= 0)` 循环内的 `else if (index2 < 0)` 分支不可达,删除。
### 数据库系统原理.md
- ReadView:原文“可重复读:都不可以使用”错误。提交读和可重复读的可见性判断相同,区别是可重复读只在第一次读时创建 ReadView 并复用;TRX_ID_MAX 应为下一个待分配的事务 ID。依据:[InnoDB Consistent Nonlocking Reads](https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html)、[InnoDB 源码 read0types.h 的 changes_visible()](https://github.com/mysql/mysql-server/blob/8.0/storage/innobase/include/read0types.h)。
- 幻读:原文“MVCC 不能解决幻影读”笼统,改为快照读不会出现幻读,当前读需要 Next-Key Locks。依据:[InnoDB Locking Reads](https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html)、[MySQL 术语表 phantom](https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_phantom)。
- 原文“脏读和不可重复读最根本的原因是事务读取到其它事务未提交的修改”把两者混为一谈,不可重复读的原因是两次读取之间其它事务提交了修改。依据:[MySQL 术语表 non-repeatable read](https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_non_repeatable_read)。
- “显示锁定”改为“显式锁定”。
### Java
- Java 容器.md,HashMap 扩容:原文 `hash%00010000 = hash%00100000 + 16` 方向写反,应为 `hash%00100000 = hash%00010000 + 16`。依据:[JDK 8 HashMap.resize() 注释](https://github.com/openjdk/jdk8u/blob/master/jdk/src/share/classes/java/util/HashMap.java)(“either stay at same index, or move with a power of two offset”)。
- Java 并发.md,join() 示例:先启动 b 再启动 a,b 中调用 `a.join()` 时 a 尚未启动,join() 立即返回,不能保证输出顺序,改为先启动 a。依据:[Thread.join() Javadoc](https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#join--)(“uses a loop of this.wait calls conditioned on this.isAlive”)。
- Java 并发.md,内存模型:补充 lock 和 unlock 的定义。依据:[JVM 规范第 2 版第 8 章 Threads and Locks §8.1](https://docs.oracle.com/javase/specs/jvms/se6/html/Threads.doc.html)。
- Java 虚拟机.md,虚引用:示例传入 null 队列,这样的虚引用永远不会入队,与“收到系统通知”矛盾,改为配合 ReferenceQueue。依据:[PhantomReference 构造函数 Javadoc](https://docs.oracle.com/javase/8/docs/api/java/lang/ref/PhantomReference.html#PhantomReference-T-java.lang.ref.ReferenceQueue-)(“such a reference is completely useless … it will never be enqueued”)。
- Java 虚拟机.md,动态对象年龄判定:HotSpot 是从小到大累加各年龄对象的大小,首个累计超过 Survivor 一半的年龄与 MaxTenuringThreshold 取较小者,不是“相同年龄对象总和”。依据:[HotSpot ageTable.cpp compute_tenuring_threshold()](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/shared/ageTable.cpp)。
- Java 虚拟机.md:-XX:PretenureSizeThreshold 只对 Serial 和 ParNew 有效。依据:周志明《深入理解 Java 虚拟机》第 3 版 3.6.2;[HotSpot defNewGeneration.cpp should_allocate()](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/serial/defNewGeneration.cpp)。
- Java 基础.md:接口方法在 Java 8 及之前不允许 private,Java 9 起允许。依据:[JLS 9 §9.4](https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4)。
### 其它
- Redis.md:原文“当键过期时会自动删除”不准确,改为惰性删除和定期删除;补充 Cluster 的 CRC16 % 16384。依据:[EXPIRE: How Redis expires keys](https://redis.io/docs/latest/commands/expire/#how-redis-expires-keys)、[Redis Cluster 规范与扩展](https://redis.io/docs/latest/operate/oss_and_stack/management/scaling/)。
- Leetcode 题解 - 排序.md:堆一节的文字说“大顶堆、堆顶是第 K 大”,与代码中的小顶堆矛盾,改为与代码一致。
- 56. 数组中只出现一次的数字.md:正文“异或结果是否为 0”与代码 `num & diff` 不符,改为按位与。
- 54. 二叉查找树的第 K 个结点.md:牛客链接失效,更换;补充题目描述“第 k 小”。
- Leetcode 题解 - 动态规划.md:错排题目描述补“每封信都装错”;母牛问题的递推式解释。
- MySQL.md:原文“BLOB、TEXT 和 VARCHAR 必须使用前缀索引”错误,只有 BLOB 和 TEXT 必须。依据:[Column Indexes, Index Prefixes](https://dev.mysql.com/doc/refman/8.0/en/column-indexes.html#column-indexes-prefix)。
- SQL 语法.md:`[ ]` 通配符只有 SQL Server 等支持,MySQL 需用 REGEXP。依据:[MySQL LIKE](https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like)、[SQL Server LIKE](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/like-transact-sql)。
- 代码可读性.md:原文“应当总是用 var 来声明变量”过时,改为 let 和 const。依据:[MDN let](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let)。
- Linux.md:`ll` 别名因发行版而异,Ubuntu 默认为 `ls -alF`;IDE 全称 Integrated Drive Electronics,ATA 是接口标准。依据:Ubuntu `/etc/skel/.bashrc`、[Parallel ATA](https://en.wikipedia.org/wiki/Parallel_ATA)。
- README.md:中文文案排版指北的简体版已改名为 README.zh-Hans.md。
- 计算机网络 - 应用层.md、SQL.md、SQL 语法.md:删除字面显示出来的 `\<zero-width space\>` 占位文字。
- Leetcode 题解 - 树.md、数组与矩阵.md:目录锚点含全角逗号和方括号,GitHub 生成锚点时会去掉它们,导致跳转失败,已修正。
## 2026-10-23 代码验证与再核对(PR #1449)
PR #1448 的 8 处代码修复已用 JDK 21 实际编译运行验证:代码块直接从笔记提取,与暴力解法或穷举对照,修复前的代码在上述输入下均复现原问题(633、437 答案错误,494 数组越界,符号表空指针,57.1 无法编译,18.1 返回 null),修复后全部通过。
### HTTP.md
- 原文“HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法”是 RFC 2616 的规定,已过时。RFC 9110 明确出于历史原因允许用户代理这样做,307、308 才禁止改变方法。依据:[RFC 9110 §15.4.2、§15.4.3、§15.4.8](https://www.rfc-editor.org/rfc/rfc9110#section-15.4)。
- 补充 SSL 已被 TLS 取代。依据:[RFC 7568 Deprecating Secure Sockets Layer Version 3.0](https://www.rfc-editor.org/rfc/rfc7568)。
- 原文“使用非对称密钥加密方式传输对称密钥”只适用于 TLS 1.2 及之前的 RSA 密钥交换,补充 TLS 1.3 改用 ECDHE。依据:[RFC 8446 §1.2](https://www.rfc-editor.org/rfc/rfc8446#section-1.2)(“Static RSA and Diffie-Hellman cipher suites have been removed”)。
- 参考链接从 RFC 2616 改为 RFC 9110,RFC 2616 已被废弃。
### Redis.md
- 原文“Redis 可以将很久没用的 value 交换到磁盘”描述的是虚拟内存特性,已在 2.6 版本移除。依据:[Virtual Memory (deprecated)](https://redis.io/docs/latest/operate/oss_and_stack/reference/internals/internals-vm/)。
- 淘汰策略原文只列 6 种,与后文“4.0 引入 volatile-lfu 和 allkeys-lfu”矛盾,补全为 8 种。依据:[Key eviction](https://redis.io/docs/latest/develop/reference/eviction/)。
- 原文“不能为散列表里的单个元素设置过期时间”在 7.4 之后不成立。依据:[HEXPIRE](https://redis.io/docs/latest/commands/hexpire/)(since 7.4.0)。
- 原文把事务中命令的发送方式称为流水线,混淆了两个概念。依据:[Transactions](https://redis.io/docs/latest/develop/using-commands/transactions/)、[Pipelining](https://redis.io/docs/latest/develop/using-commands/pipelining/)。
- 分布式锁一节与分布式笔记统一为 SET NX PX,RedLock 是官方提出的算法而非官方实现。依据:[Distributed Locks with Redis](https://redis.io/docs/latest/develop/clients/patterns/distributed-locks/)。
- 数据类型补充位图、HyperLogLog、地理空间、流。依据:[Redis data types](https://redis.io/docs/latest/develop/data-types/)。
- SLAVEOF 自 5.0 弃用,改为 REPLICAOF。依据:[SLAVEOF](https://redis.io/docs/latest/commands/slaveof/)。
### Java 容器.md
- 原文“链表长度大于等于 8 时转换为红黑树”不完整:实际是向已有 8 个节点的桶再添加元素时触发,并且要求数组长度不小于 64,否则只扩容;节点数减到 6 时退化为链表。依据:[JDK 8 HashMap 源码](https://github.com/openjdk/jdk8u/blob/master/jdk/src/share/classes/java/util/HashMap.java)中的 TREEIFY_THRESHOLD、UNTREEIFY_THRESHOLD、MIN_TREEIFY_CAPACITY 常量及 treeifyBin()。
### Java 虚拟机.md
- 原文“JDK 1.8 之后静态变量和常量池放入堆中”不准确:字符串常量池和类静态变量是 JDK 7 移入堆的,JDK 8 的元空间存放类元信息和运行时常量池。依据:[JDK 7 Release Notes: Area: HotSpot, Synopsis: In JDK 7, interned strings are no longer allocated in the permanent generation](https://www.oracle.com/java/technologies/javase/jdk7-relnotes.html)、[JEP 122: Remove the Permanent Generation](https://openjdk.org/jeps/122)。
- 空间分配担保原文描述的是 JDK 6 Update 24 之前依赖 HandlePromotionFailure 的规则,之后该参数不再起作用。依据:周志明《深入理解 Java 虚拟机》第 3 版 3.8.5;[HotSpot tenuredGeneration.cpp promotion_attempt_is_safe()](https://github.com/openjdk/jdk/blob/master/src/hotspot/share/gc/serial/tenuredGeneration.cpp)。
### 计算机网络 - 传输层.md
- 教材中慢开始的初始 cwnd 为 1 个报文段,补充现行 RFC 建议的初始值为 10 个报文段。依据:[RFC 6928 Increasing TCP's Initial Window](https://www.rfc-editor.org/rfc/rfc6928)。