系统架构设计师高频必考概念总复习(上)
- 2026-11-05 19:17:42
技术博客 · 软考系统架构设计师 · 考前冲刺
考试临近,很多人会陷入一种典型的焦虑:书翻了三遍,概念还是散的;真题做了五年,错的还是同一类;论文模板背了两篇,一上考场看到新题目就不知道往哪套。
问题不在努力程度,而在知识没有结成网。系统架构设计师的考试有一个很特殊的性质:上午题、案例题、论文题考的是同一套知识,只是考法不同。
同一个"架构评估",上午题问你 ATAM 的四类点分别叫什么;案例题给你一段描述,让你指出哪句话是风险点、哪句话是权衡点;论文题让你写"我在项目里如何做架构评估",你得把评估步骤、参与角色、产出物、以及一次真实的取舍讲清楚。背概念只能过上午题,理解概念之间的因果才能过案例和论文。
所以这篇长文不再按教材目录平铺,而是按三条线组织:
- 第一条线:命题地图
——先告诉你分数从哪来,哪些点每年必考,哪些点可以不看。这决定了你时间的分配。 - 第二条线:概念网
——把高频概念按"硬件 → 操作系统与网络 → 数据库 → 软件工程 → 架构设计 → 质量属性 → 新兴技术"的顺序串起来,每个概念都给"定义 + 考点 + 常见陷阱"三层,并且尽量给出计算公式和算例。 - 第三条线:答题法
——案例题的三类问法怎么答,论文的四维评分怎么拿分,模板怎么套而不露痕迹,最后给一篇完整的、按考场标准写的范文。
阅读建议:如果只剩三天,直接读第一章(命题地图)、第六章(架构设计)、第九章(案例套路)、第十章(论文写法)和第十二章(速记表);如果还有两周,按顺序读完,把每章末尾的"考点提示"抄成一页纸。
📌 考点提示
一句话立场:这门考试不考你见得多广,考你能不能在限定时间里,把一个模糊的业务问题翻译成一套有取舍的架构决策,并且说得让人信服。所有概念都是为这个能力服务的,背概念的时候,永远问一句"这个东西解决了什么矛盾"。
一、先看命题地图:分数从哪里来
1.1 三科的结构与及格线
系统架构设计师属于软考高级资格,三个科目全部达到合格线才算通过,任何一科不过,下次三科重考。这是最残酷也最公平的规则:它不允许你用两科高分去补一科的短板。
三科合格线通常为各科满分的 60%,即 45 分。这个数字值得反复念叨,因为它直接决定策略:
上午题 75 分里拿 45 分,只需要 60% 的正确率。也就是说,允许你有 30 道题完全不会。真正致命的是"会做但做错"——计算题算错、概念混淆、看错题干。 案例题 75 分里拿 45 分,三道题平均每题 25 分拿 15 分。案例题是按关键词给分,写满不一定得分,写对关键词才得分。 论文 75 分里拿 45 分,是很多人的生死线。论文的失败往往不是"写得不好",而是偏题、字数不足、没有项目细节这三件事。
📌 考点提示
三科的时间都紧。上午题平均 2 分钟一题,其中 20 道左右是"读完就会"的送分题,10 道左右是需要计算的题,剩下的需要判断。正确的节奏是:第一遍只做有把握的,把计算题和纠结题标记跳过;第二遍集中攻计算;第三遍用剩余时间处理"完全不会"的题——绝不留空,选择题蒙一个也有 25% 的期望值。
1.2 上午题的经验分布
官方没有公布过细目表,但把近十年真题按知识点归类,会得到一个相当稳定的分布。下面这张表是经验值,用于分配复习时间,不是官方数据:
从这张表能读出三个策略:
第一,"架构设计"是唯一一个三科通吃的板块。 它既出上午题,又是案例题的主战场,还是论文的核心论点。这部分投入一小时,回报是三倍的。
第二,"新兴技术"是性价比最高的板块。 云计算三种服务模式、大数据处理架构、容器与虚拟化的区别,这些概念不需要计算、不需要推理,看两遍就能拿分,而且几乎每年都考。
第三,"数学与专业英语"是战略性放弃区。 专业英语 5 题,靠的是长期积累,短期突击收益极低;数学题(概率、图论、线性规划)往往一题要算五分钟,做对一题 1 分,不如把时间给架构题。放弃不是不做,是不投入复习时间,考场上凭直觉选。
1.3 三科其实是一道题
这是全文最重要的一张表。把同一个知识点在三个科目里的考法摆在一起,你会立刻明白该怎么复习:
看懂这张表,复习方法就出来了:任何一个概念,都要能回答三个层次的问题——
- 是什么
(定义、分类、术语)——应付上午题; - 什么时候用、什么时候不该用
(适用场景、代价、与替代方案的对比)——应付案例题的判断; - 我在项目里怎么用的
(具体动作、量化结果、遇到的坑)——应付论文。
绝大多数人卡在第二层。他们能背出"微服务有独立部署、技术异构、去中心化治理等特征",但答不出"什么情况下不该拆微服务"。而案例题和论文,考的全是第二层和第三层。
📌 考点提示
从现在开始,每复习一个概念,强迫自己补两句话:一句"它的代价是什么",一句"我在哪个项目里用过/为什么没用"。这两句话就是案例题和论文的弹药。没有代价的技术是不存在的,说不出代价,说明你只是背了定义。
1.4 三张清单:把厚书读薄
考前复习不是"再看一遍书",而是"把书压缩成三张纸"。建议你亲手做三张清单(手写比打字记得牢):
清单 A:必背公式表(约 20 条)。流水线三条公式、Cache 平均访问时间、Amdahl 定律、可靠性串并联、可用度、McCabe 环路复杂度、关键路径总时差、COCOMO 工作量、决策树期望值、海明码校验位数、香农熵、奈奎斯特/香农定理、子网可用主机数……这张表在第十二章会给全。
清单 B:必辨概念对(约 30 对)。这类题的套路是"两个词长得很像,考你分不分得清":可靠性与可用性、内聚与耦合、逻辑独立性与物理独立性、悲观锁与乐观锁、蓝绿部署与灰度发布、容器与虚拟机、SOA 与微服务、批处理与流处理、对称加密与非对称加密、数字签名与数字信封、敏感点与权衡点……每对只需一句话说清差别。
清单 C:论文素材卡(2~3 个项目)。每个项目一页:背景(行业、规模、时间)、我的角色、三个技术难点、每个难点的方案与取舍、五个量化数字、两条不足。这张卡决定了论文能不能过。
三张清单做完,你会发现教材从六百页变成了六页。剩下的时间,反复看这六页。
二、计算机系统:计算题都藏在这里
这一章是上午题计算题的主要来源。好消息是:公式少、题型固定、每年重复。把下面八个点吃透,这一块的分数基本是稳的。
2.1 冯·诺依曼结构与哈佛结构
冯·诺依曼结构的核心是存储程序:指令和数据存在同一个存储器里,用同一组总线传输,CPU 按"取指—译码—执行"循环工作。它的天然缺陷是冯·诺依曼瓶颈——CPU 与存储器之间的总线带宽有限,取指令和取数据争抢同一条通路,速度上不去。
哈佛结构把指令存储器和数据存储器物理分开,两组总线并行,可以同时取指和取数。现代 CPU 普遍采用"改进的哈佛结构":L1 缓存分成指令缓存(I-Cache)和数据缓存(D-Cache),但主存仍然是统一的。GPU 是典型的哈佛结构实践者,这也是它能做大规模并行计算的原因之一。
考点通常这样出:"某处理器采用指令与数据分开的缓存结构,这属于( )结构?" 答案:改进的哈佛结构。
2.2 Flynn 分类:四个象限
Flynn 按"指令流"和"数据流"两个维度分类,是并行计算的经典框架:
记忆方法:SIMD 是 GPU 的灵魂,MIMD 是集群的灵魂,MISD 是考卷上的干扰项。 考试里如果出现 MISD 的现实例子,最常见的就是"多套相同处理逻辑对同一数据做冗余计算并表决"的容错结构。
2.3 CISC 与 RISC
考点常以"以下关于 RISC 的描述,错误的是"出现。要记牢 RISC 的三个"更":指令更少、更简单、更规整;以及一个"更":更依赖编译器优化(复杂操作由多条简单指令组合完成,编译器责任更重)。
2.4 流水线:三条公式,一个算例
流水线是每年计算题的高频点。设一条指令分 k 段,每段耗时 Δt,连续执行 n 条指令:
- 执行时间
:T = (k + n − 1) × Δt - 吞吐率
:TP = n / T = n / [(k + n − 1) × Δt] - 加速比
:S = 不使用流水线的时间 / 使用流水线的时间 = (n × k × Δt) / [(k + n − 1) × Δt] = nk / (k + n − 1) - 效率
:E = S / k = n / (k + n − 1)
算例:一条指令分 5 段,每段 2ns,连续执行 100 条指令。
T = (5 + 100 − 1) × 2 = 208 ns TP = 100 / 208 ≈ 0.48 条/ns S = (100 × 5) / (5 + 100 − 1) = 500 / 104 ≈ 4.81 E = 100 / 104 ≈ 96.2%
三个结论必须理解,而不是背:
- 加速比永远小于段数 k
。因为流水线有"填满"和"排空"的代价,段数越多、指令越少,这个代价占比越大。当 n → ∞ 时 S → k,这就是理论上限。 - 流水线周期由最慢的一段决定
。如果各段耗时不等,Δt 取最大值,此时效率会下降(快的段在等慢的段),这也是为什么流水线设计强调"段均衡"。 - 流水线提高的是吞吐率,不是单条指令的延迟
。单条指令走完仍需要 k×Δt,甚至因为流水寄存器开销而更长。
📌 考点提示
题目经常给"各段耗时分别为 1ns、2ns、1ns、3ns",这时 Δt 取 3ns,并且要注意题目问的是"执行 10 条指令的总时间"还是"吞吐率"。总时间 =(4 + 10 − 1) × 3 = 39ns。先定 Δt,再套公式,最后看问的是时间还是率,三步不能乱。
2.5 存储层次与 Cache
存储层次的金字塔是:寄存器 → Cache(L1/L2/L3)→ 主存 → 外存(SSD/HDD)→ 磁带/对象存储。越往上越快、越贵、越小。整个层次能成立的前提是局部性原理:
- 时间局部性
:刚被访问的数据,很可能马上再被访问(循环变量、热点数据)。 - 空间局部性
:刚被访问的数据,其相邻地址很可能马上被访问(数组遍历、顺序读)。
Cache 有三个必考点:
其一,平均访问时间。设命中率为 h,Cache 访问时间 tc,主存访问时间 tm:
若"不命中时才访问主存"(串行):ta = h × tc + (1 − h) × (tc + tm) 若题目明确"同时访问 Cache 和主存"(并行):ta = h × tc + (1 − h) × tm
算例:tc = 10ns,tm = 100ns,h = 95%。串行模型下 ta = 0.95×10 + 0.05×110 = 9.5 + 5.5 = 15ns。这比直接访问主存的 100ns 快了 6.7 倍——注意,命中率 95% 带来的加速远大于 95%,因为省下的是最贵的那一段。
其二,替换算法。LRU(最近最少使用)、FIFO(先进先出)、LFU(最不经常使用)、随机。Cache 用 LRU 为主,因为符合时间局部性。
其三,写策略。写直达(Write Through,同时写 Cache 和主存,简单但慢)、写回(Write Back,只写 Cache,替换时才写回主存,快但一致性复杂)。多核场景下还要考虑缓存一致性协议(MESI)。
📌 考点提示
Cache 题最常见的陷阱是"命中率提高 1%,平均访问时间下降多少"。答案是非线性的:h 从 95% 到 96%,ta 从 15ns 降到 14ns,只降了 6.7%;但如果 h 从 90% 到 95%,ta 从 20ns 降到 15ns,降了 25%。命中率越低,提升命中率的边际收益越大——这句话可以直接写进论文的性能优化段落。
2.6 主存与 RAID
主存的关键参数是容量、带宽、校验。海明码是常考点:设数据位 m 位,校验位 k 位,需满足 2^k ≥ m + k + 1。例如 8 位数据需要 4 位校验(2^4 = 16 ≥ 8+4+1 = 13)。海明码能纠一位错、检两位错。
RAID 是案例题和上午题的双料高频点,必须能默写这张表:
记忆要点:RAID 5 的可用容量是 (n−1)/n,写操作有"读-改-写"四次 IO 的写惩罚;RAID 10 兼顾性能与可靠,数据库常用;RAID 6 的双校验是为了应对"大容量盘重建时间长、重建期间再坏一块"的风险——这个理由可以直接用于论文里"为什么选 RAID 6"的论证。
2.7 总线与 I/O 控制方式
I/O 控制的四种方式,本质是"CPU 参与程度"的递减:
- 程序查询(轮询)
:CPU 反复读状态寄存器,CPU 利用率最低。 - 中断驱动
:设备完成后发中断,CPU 在中断处理中搬运数据。每次传输一个字节/字,中断频繁。 - DMA(直接存储器访问)
:DMA 控制器接管总线,成块搬运,CPU 只在开始和结束时介入。 - 通道(I/O 处理机)
:通道本身是一台小型处理机,执行通道程序,管理多台设备,CPU 参与最少。
考点:DMA 与中断的区别——DMA 是"数据搬运不经过 CPU",中断是"通知 CPU 来搬运";DMA 传输结束后仍会发一次中断告知 CPU。通道是 DMA 的升级版,能执行通道程序,控制多台设备并行工作。
2.8 Amdahl 定律:性能优化的天花板
Amdahl 定律回答一个问题:只优化系统的一部分,整体能快多少?
设可优化部分占总执行时间的比例为 p,该部分加速比为 n,则整体加速比:
S = 1 / [(1 − p) + p / n]
算例:某系统 40% 的时间在做可以并行化的计算,把这部分加速 100 倍,整体加速比 = 1 / (0.6 + 0.4/100) = 1 / 0.604 ≈ 1.66 倍。即使把这部分优化到无限快,上限也只有 1/0.6 ≈ 1.67 倍。
这个定律的架构意义远大于计算意义:它告诉我们优化的顺序。如果系统 70% 的时间耗在数据库查询上,你去优化代码里的字符串拼接,即使优化到零,整体也只快 1.4 倍。先找最大的 p,再谈优化手段——这是性能优化类论文最重要的一句话。
📌 考点提示
Amdahl 定律的常见变体是"并行计算"场景:程序串行部分占 20%,用 8 个处理器并行,加速比 = 1/(0.2 + 0.8/8) = 1/0.3 ≈ 3.33。注意题目给的可能是"串行部分比例"而不是"可并行比例",看清 p 是谁,这是最常见的失分点。
三、操作系统与网络:从进程到子网
3.1 进程、线程与协程
进程是资源分配的基本单位,拥有独立的地址空间;线程是 CPU 调度的基本单位,同一进程内的线程共享地址空间和文件描述符,只独享栈、寄存器、程序计数器。协程是用户态的轻量线程,由程序自己调度,切换不经过内核,开销极小。
三者的取舍是架构设计的经典话题:
为什么高并发服务偏爱协程? 因为 IO 密集型负载的瓶颈不是 CPU,而是等待。一个线程等一次网络响应要阻塞几毫秒,几万个并发连接就需要几万个线程,线程栈(默认 1MB)就吃掉几十 GB。协程把"等待"变成了"让出",一个线程可以挂几万个协程,内存占用降到 KB 级。
📌 考点提示
进程与线程的对比是上午题常客,但更容易被忽略的是线程共享了什么、不共享什么。共享:代码段、数据段、堆、打开的文件、信号处理。不共享:栈、寄存器、程序计数器、线程 ID。"栈不共享"这一条几乎每年都以某种形式出现。
3.2 进程状态与 PV 操作
进程的五态模型:新建 → 就绪 → 运行 → 阻塞 → 终止。关键转换规则:
就绪 → 运行:被调度器选中(唯一主动上升的转换)。 运行 → 就绪:时间片用完或被更高优先级抢占。 运行 → 阻塞:主动请求资源(IO、信号量)而不得。 阻塞 → 就绪:等待的事件发生(不是直接变运行,这是最常见的错误选项)。
PV 操作是上午题的固定题型。P(wait)操作申请资源,信号量减 1,若小于 0 则阻塞;V(signal)操作释放资源,信号量加 1,若有等待进程则唤醒一个。
经典模型要能默写:
- 互斥
:信号量初值 1,P 在临界区前,V 在临界区后。 - 同步(先后关系)
:信号量初值 0,前驱完成后 V,后继开始前 P。 - 生产者-消费者
:互斥信号量 mutex = 1,空缓冲区数 empty = n,满缓冲区数 full = 0。生产者:P(empty) → P(mutex) → 放 → V(mutex) → V(full)。消费者:P(full) → P(mutex) → 取 → V(mutex) → V(empty)。
PV 顺序不能颠倒:如果生产者先 P(mutex) 再 P(empty),当缓冲区满时,生产者持有互斥锁却阻塞在 empty 上,消费者又拿不到锁无法消费,死锁。这个陷阱考过多次。
3.3 死锁:四个条件与四种策略
死锁的四个必要条件(缺一不可):
- 互斥
:资源一次只能被一个进程使用。 - 请求与保持
(占有且等待):持有资源的同时申请新资源。 - 不可剥夺
:资源只能由持有者主动释放。 - 环路等待
:存在进程与资源的循环等待链。
四种处理策略,考试必须能对号入座:
银行家算法的考点是"判断某次请求能否满足":试分配 → 计算 Need → 找安全序列(每个进程的 Need ≤ 当前 Available,执行完释放资源)→ 若存在安全序列则可分配。答题步骤固定,关键是算 Available 时别忘了进程执行完要归还全部资源。
📌 考点提示
死锁与"活锁""饥饿"的区别常被混淆。死锁是互相等待、谁也动不了;活锁是都在动但谁也推进不了(比如两个进程都退让重试);饥饿是优先级低的永远排不上。死锁的四个条件是"必要条件"不是"充分条件"——满足四条不一定死锁,但破坏任一条一定不会死锁。
3.4 存储管理:分页、分段与虚拟内存
分页:把逻辑地址空间切成固定大小的页,物理内存切成同样大小的块(页框),页表记录映射。优点是消除外部碎片,缺点是有内部碎片(最后一页填不满),且页表本身占空间。
分段:按程序的逻辑结构(代码段、数据段、栈段)划分,长度可变。优点是便于共享和保护、符合逻辑,缺点是有外部碎片。
段页式:先分段,段内再分页,兼顾两者优点,代价是两次查表,地址转换更慢。
页面置换算法与缺页率是必考计算:
- OPT(最佳)
:淘汰未来最久不用的页。理论最优,无法实现,作为基准。 - FIFO
:淘汰最早进入的页。简单,但会出现 Belady 异常——增加页框数,缺页率反而上升。 - LRU(最近最少使用)
:淘汰最久未访问的页。性能接近 OPT,实现需要硬件支持(计数器或栈)。 - CLOCK(时钟)
:LRU 的近似,用访问位循环扫描,开销小,实际系统常用。
虚拟内存的三个前提:局部性原理、离散分配、置换机制。它的价值是让程序看到比物理内存更大的地址空间,并实现进程隔离。
📌 考点提示
缺页率计算题的关键是"首次访问必缺页"和"修改过的页换出要写回"。给一个页面访问序列和页框数,按算法模拟即可,注意 FIFO 的 Belady 异常只在 FIFO(和部分非栈式算法)出现,LRU 和 OPT 属于栈式算法,不会有 Belady 异常。
3.5 文件系统与磁盘
文件的物理结构三种:连续分配(顺序读写快,有外部碎片、不易扩展)、链接分配(无碎片、可扩展,只能顺序访问)、索引分配(支持随机访问,索引块占空间)。UNIX 的多级索引是常考点:10 个直接块 + 1 个一级间接 + 1 个二级间接 + 1 个三级间接,给块大小和指针大小,算最大文件大小。
磁盘调度:FCFS(公平但慢)、SSTF(最短寻道优先,可能饥饿)、SCAN(电梯算法,单向扫到端点再折返)、C-SCAN(循环扫描,回程不服务)、LOOK(到最后一个请求就折返)。计算题给磁道序列,算总移动磁道数——注意 SCAN 与 LOOK 的区别:SCAN 要走到磁盘端点,LOOK 只走到最远请求处。
3.6 网络分层与协议
OSI 七层与 TCP/IP 四层的对应关系,是必须条件反射的知识:
记忆口诀:"物数网传会表应"(从下到上)。
TCP 与 UDP 的对比必须能从五个维度说清:连接(面向连接/无连接)、可靠性(可靠/尽力而为)、传输方式(字节流/数据报)、首部开销(20 字节/8 字节)、适用场景(文件传输、Web/实时音视频、DNS、IoT)。TCP 的三次握手与四次挥手要能画出状态迁移,并且知道"为什么是三次"——为了防止已失效的连接请求突然到达服务端,导致服务端白白建立连接。
TCP 的可靠性机制:序号确认、超时重传、滑动窗口(流量控制)、拥塞控制(慢开始、拥塞避免、快重传、快恢复)。
3.7 子网划分与地址计算
这是网络部分最高频的计算题。给定一个 IP 和掩码,要能算出:网络地址、广播地址、可用主机数、子网数。
核心公式:
可用主机数 = 2^主机位 − 2(减去网络地址和广播地址) 子网数 = 2^借位数 网络地址 = IP 与掩码按位与 广播地址 = 网络地址 + 主机位全 1
算例:192.168.10.130/26。掩码 255.255.255.192,主机位 6 位,块大小 64。子网为 192.168.10.128 ~ 192.168.10.191,网络地址 192.168.10.128,广播地址 192.168.10.191,可用地址 192.168.10.129 ~ 190,共 62 个。
CIDR 与路由聚合:把多条路由合并成一条,找"公共前缀"。例如 192.168.0.0/24 到 192.168.3.0/24 四条,可聚合为 192.168.0.0/22。
📌 考点提示
子网题最容易错的是"问的是可用主机数还是总地址数"。看到"可用"就减 2,看到"地址块大小"就不减。另外 /31 和 /32 是特例(点对点链路与单主机),考试偶尔会挖这个坑。
四、数据库:范式、事务与数据架构
4.1 三级模式与两级映像
数据库的三级模式:
- 外模式(子模式/用户模式)
:面向具体用户或应用的视图,一个数据库可有多个外模式。 - 模式(概念模式)
:全体数据的逻辑结构,一个数据库只有一个模式。 - 内模式(存储模式)
:数据的物理存储结构,一个数据库只有一个内模式。
两级映像带来两种独立性:
- 外模式/模式映像
→ 逻辑独立性:模式改变时,调整映像,应用程序不变。 - 模式/内模式映像
→ 物理独立性:存储结构改变时,调整映像,逻辑结构不变。
📌 考点提示
这两个独立性几乎每年必考,且极易搞混。记忆法:"外-模"管逻辑(应用不用改),"模-内"管物理(逻辑不用改)。注意"应用程序不变"对应逻辑独立性,这是判断的关键词。
4.2 E-R 模型与关系模式转换
E-R 图三要素:实体(矩形)、属性(椭圆)、联系(菱形)。联系分 1:1、1:n、m:n。
转换规则:
每个实体转为一个关系模式,属性为列,实体主键为关系主键。 - 1:1 联系
:可并入任一端,把另一端的码作为外键。 - 1:n 联系
:并入 n 端,把 1 端的码作为外键。 - m:n 联系
:必须单独建一个关系,主键为两端主键的组合。
考点:给 E-R 图,问"至少需要几个关系模式"。m:n 联系必须独立成表,这是最容易漏的。另外,多元联系(三个实体之间的联系)也必须独立成表。
4.3 范式:从 1NF 到 BCNF
判断步骤(考场上固定套路):
找出所有候选码(能决定全部属性的最小属性集)。 找主属性(出现在任一候选码中的属性)和非主属性。 看非主属性对码是部分依赖还是完全依赖 → 判断 2NF。 看是否存在非主属性 → 非主属性的传递依赖 → 判断 3NF。 看每个函数依赖的左部是否都包含码 → 判断 BCNF。
规范化 vs 反规范化是架构题的高频讨论点:规范化减少冗余、避免更新异常,但查询需要更多连接;反规范化(冗余字段、预计算、宽表)提升查询性能,代价是一致性维护成本。数据仓库刻意采用反规范化(星型模型),因为它是读多写少、以查询性能为先的场景——这个对比可以直接写进论文。
4.4 事务与并发控制
ACID 四特性:
- 原子性(Atomicity)
:要么全做,要么全不做。靠 undo log 实现。 - 一致性(Consistency)
:事务前后数据库满足完整性约束。 - 隔离性(Isolation)
:并发事务互不干扰。靠锁或 MVCC 实现。 - 持久性(Durability)
:提交后的修改永久生效。靠 redo log 与 WAL 实现。
四种隔离级别与三类异常:
三者的区别要一句话说清:脏读是读到了别人未提交的数据;不可重复读是同一行两次读的值不一样(别人改了);幻读是同一条件两次查的行数不一样(别人插了)。注意"不可重复读"针对 update/delete,"幻读"针对 insert。
封锁协议:一级封锁(写加 X 锁,防丢失修改)、二级(加读加 S 锁,防脏读)、三级(S 锁持到事务结束,防不可重复读)。两段锁协议(2PL)是保证可串行化的充分条件:加锁阶段只能加锁,解锁阶段只能解锁。
悲观锁与乐观锁:悲观锁假设冲突常发生,先加锁再操作(SELECT FOR UPDATE);乐观锁假设冲突少,用版本号/CAS 在提交时校验。高并发读多写少的场景选乐观锁,冲突频繁的选悲观锁——这是案例题常问的取舍。
4.5 分布式数据架构
CAP 定理:一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)三者不可同时满足。由于网络分区在分布式系统中不可避免,实际上是在 C 和 A 之间取舍:
- CP
:分区时拒绝服务,保证一致。典型:ZooKeeper、Etcd、HBase。 - AP
:分区时继续服务,接受最终一致。典型:Cassandra、Eureka、DynamoDB。
BASE:基本可用(Basically Available)、软状态(Soft state)、最终一致(Eventually consistent)。它是 AP 的工程化表述,也是互联网系统的默认选择。
一致性模型谱系(从强到弱):线性一致 → 顺序一致 → 因果一致 → 最终一致。"最终一致"不等于"不一致",它承诺的是"没有新写入时,副本终将收敛"。
分库分表的四个维度:
- 垂直分库
:按业务拆(用户库、订单库),解决单库压力与团队耦合。 - 垂直分表
:把大字段/冷字段拆到扩展表,解决单表行过大。 - 水平分库
:按分片键把同一张表的数据分散到多个库。 - 水平分表
:同一库内拆成多张结构相同的表。
分片键的选择是核心难点:要保证数据均匀、查询能命中分片、避免跨片事务。常见方案有哈希取模(均匀但扩容难)、范围分片(易扩容但可能热点)、一致性哈希(扩容影响小)、基因法(把分片基因嵌入 ID,避免二次路由)。
分库分表带来的问题必须能说出来:跨片 JOIN、跨片事务(用 TCC/Saga/消息最终一致)、全局唯一 ID(雪花算法)、跨片分页与聚合、扩容迁移。这一段是论文里体现深度的好材料。
4.6 数据仓库与大数据
数据仓库的四个特征:面向主题、集成、相对稳定(非易失)、反映历史变化(随时间变化)。它与 OLTP 的对比:
维度建模:星型模型(一个事实表 + 多个维度表,维度不规范化,查询快)、雪花模型(维度再规范化,省空间但连接多)。缓慢变化维(SCD)的三种处理:覆盖(Type 1)、加版本行(Type 2)、加前值列(Type 3)。
OLAP 的实现:MOLAP(多维数组,预聚合,快但加载慢)、ROLAP(关系表 + 物化视图,灵活但慢)、HOLAP(混合)。
大数据处理架构:
- Lambda 架构
:批处理层(全量、准确、高延迟)+ 速度层(增量、近似、低延迟)+ 服务层(合并查询)。缺点是两套代码逻辑要维护两份。 - Kappa 架构
:只用流处理,历史数据通过重放消息队列来重算。架构简单,但对消息队列的保留能力和流处理吞吐要求高。 - 湖仓一体
:数据湖(原始存储、schema-on-read)+ 数据仓库(schema-on-write、事务、索引),用开放表格式(Iceberg/Hudi/Delta Lake)在湖上实现 ACID 与增量更新。
📌 考点提示
Lambda 与 Kappa 的对比是高频点,答题的关键是说出"Lambda 的批流两套逻辑导致口径不一致、维护成本高,Kappa 用一套流逻辑统一,代价是历史重放的成本"。能说出"口径不一致"这个词,说明你真的理解了,而不是背了两个名词。