第六关 · 数据库与存储
总时长:48 小时 | 目标:解决"数据怎么存、怎么查、怎么保证一致性和性能?" 考试映射:综合知识 3-5 题 | 案例分析:⭐ 2024年11月(Cache-Aside+缓存不一致)+ 2022年11月(缓存分片+布隆过滤器)| 论文:《论数据库设计在系统中的应用》
Step 1:本关资料(海量输入)
| 资料类型 | 具体资料 | 用途 | |---------|---------|------| | 教材 | 《架构师教程》第 12 章(数据库设计、NoSQL、缓存) | 掌握设计阶段、反规范化、NoSQL 分类 | | 真题 | 2020-2025 综合知识·数据库部分(约 30 题) | 锁定高频考点(设计阶段、反规范化、缓存) | | 案例真题 | 2024年11月案例二(Cache-Aside)+ 2022年11月案例四(缓存分片+布隆过滤器)+ 2025下缓存击穿 | 背诵标准答案 | | 论文参考 | 数据库设计相关论文范文 | 学习论文中存储方案选型的展开方式 |
精准阅读策略:
- 数据库设计四阶段必背(需求→概念→逻辑→物理)
- 反规范化 4 种方法必背(增加冗余列/派生列/重组表/分割表)
- Cache-Aside 读写流程必背(读先查缓存,写先更新DB再删缓存)
- 布隆过滤器原理必背(一位为0一定不存在,都为1可能存在)
Step 2:本关心智模型
模型 1:数据库设计漏斗——"从需求到物理存储的四步过滤"
- 核心思想:数据库设计是一个逐层精确化的过程:需求分析(要存什么)→ 概念设计(E-R 图)→ 逻辑设计(关系模式+反规范化)→ 物理设计(索引、分区)。每一步都在把业务需求转化为技术方案。
- 关键变量:反规范化发生在逻辑设计阶段(不是物理设计!这是高频陷阱)
- 应用场景:选择题"在哪个阶段进行反规范化"(答案:逻辑设计)
- 局限性:实际项目中设计阶段经常重叠,不完全按线性流程
- 考试映射:每年必考 1-2 题
| 阶段 | 做什么 | 产出 | |------|--------|------| | 需求分析 | 收集用户需求,分析数据流 | 数据流图、数据字典 | | 概念设计 | 设计 E-R 图 | E-R 图 | | 逻辑设计 | E-R→关系模式,反规范化 | 关系模式、视图 | | 物理设计 | 存储结构、索引、分区 | 物理存储方案 |
模型 2:反规范化权衡——"用冗余换性能"
- 核心思想:数据库范式(3NF)追求减少冗余,但实际查询经常需要多表连接,性能差。反规范化的本质就是"故意增加冗余来提升查询性能",代价是需要额外的机制保证数据一致性。
- 关键变量:4 种方法(增加冗余列、增加派生列、重新组表、分割表)+ 3 种一致性方案(定期同步、触发器、应用校验)
- 应用场景:案例分析(反规范化方法选择 + 一致性方案选择)
- 局限性:反规范化不是万能的,过度反规范化会导致更新异常和数据不一致
- 考试映射:案例分析 8-12 分
模型 3:缓存三层防御——"穿透、击穿、雪崩的攻防战"
- 核心思想:缓存是性能优化的核心手段,但引入缓存会带来三个经典问题:穿透(查不存在的数据)、击穿(热点 key 过期)、雪崩(大量 key 同时过期)。每种问题有对应的解决方案,架构师必须全部掌握。
- 关键变量:Cache-Aside 模式(旁路缓存)是基础,延迟双删/Binlog同步/应用双写解决一致性问题
- 应用场景:案例分析超高频(2022、2024、2025 连续考),论文可用
- 局限性:缓存方案没有银弹,每种方案有适用场景
- 考试映射:案例分析 15-25 分
Cache-Aside 模式:
读:查缓存 → 命中返回 → 未命中查DB → 写入缓存 → 返回
写:先更新DB → 再删除缓存(不是更新缓存!)
缓存三大问题:
| 问题 | 原因 | 解决方案 | |------|------|---------| | 穿透 | 查不存在的数据,所有请求打到 DB | 布隆过滤器 + 空值缓存 | | 击穿 | 热点 key 过期,大量请求同时查 DB | 互斥锁 / 逻辑过期 | | 雪崩 | 大量 key 同时过期 | TTL 加随机偏移 |
Step 3:本关分歧点
分歧点 1:普通哈希 vs 一致性哈希——"节点变化时怎么办?"
| 维度 | A 方:普通哈希 | B 方:一致性哈希 | |------|-------------|---------------| | 核心 | key 通过哈希函数映射到固定节点 | 节点和数据映射到环形空间 | | 节点变化时 | 大量数据需要迁移 | 只迁移少量数据 | | 实现复杂度 | 简单 | 稍复杂(虚拟节点) | | 适用 | 节点固定不变 | 需要动态扩展 |
考试倾向:题目说"需要动态扩展" → 选一致性哈希。2022年11月案例真题。
分歧点 2:物理过期+互斥锁 vs 逻辑过期——"缓存击穿怎么办?"
| 维度 | A 方:物理过期+互斥锁 | B 方:逻辑过期 | |------|-------------------|--------------| | 核心 | 缓存过期后加锁重建 | 缓存不过期,异步更新 | | 一致性 | ✅ 强一致 | ❌ 最终一致 | | 性能影响 | ❌ 重建期间其他线程阻塞 | ✅ 旧数据可用,不阻塞 | | 实现复杂度 | ✅ 简单 | ❌ 复杂 | | 适用 | 数据一致要求严格、并发适中 | 高并发读、可用性优先 |
考试倾向:2025年11月案例真题,题目要求高可用 → 选逻辑过期方案。
分歧点 3:实时同步 vs 异步准实时——"缓存和 DB 怎么保持一致?"
| 维度 | A 方:实时同步 | B 方:异步准实时 | |------|-------------|---------------| | 核心 | 更新 DB 时同时更新缓存 | 更新 DB 时记录日志,逐步排队更新 | | 性能 | ❌ 同步并发时不可控 | ✅ 性能可控 | | 一致性 | ✅ 强一致 | ❌ 短暂不一致窗口 | | 适用 | 低频写、强一致 | 高并发、性能优先 |
考试倾向:2022年11月案例真题,题目说"1s内完成响应" → 选异步准实时。
Step 4:闯关任务(动手验证)
任务 1:Cache-Aside 流程默写(1h)
- 限时 5 分钟默写读流程和写流程
- 检查:写流程是"删除缓存"还是"更新缓存"?(答:删除!)
任务 2:缓存方案设计(3h)
为 AIoT 项目设计缓存方案:
- 选择缓存模式(Cache-Aside)
- 设计 key 命名规则和 TTL 策略
- 解决穿透、击穿、雪崩三个问题
- 设计缓存和 DB 的一致性方案
任务 3:布隆过滤器原理说明(1h)
用 200 字向非技术人员解释布隆过滤器的原理和适用场景。
Step 4.5:💬 AI 教练对话
使用时机:缓存方案不确定时、一致性方案选择时
Review Agent(缓存方案评审)
我正在设计 AIoT 项目的缓存方案。
场景:[描述场景]
我的方案:[粘贴方案]
请帮我检查:
1. 读流程是否正确?
2. 写流程是否正确?
3. 有没有缓存穿透/雪崩/击穿的风险?
4. 如果是考试,这个答案的得分点有哪些?
Theory Agent(数据库设计)
我要为 AIoT 项目设计数据库。
需求:[描述需求]
请帮我:
1. E-R 图应该包含哪些实体和关系?
2. 哪些表需要反规范化优化?
3. 索引应该怎么设计?
Step 5:关 AI 自测
⚠️ 关闭 AI,独立完成后再对照答案
自测题 1(综合知识风格)
在数据库设计的哪个阶段进行关系反规范化?
A. 需求分析阶段 B. 概念设计阶段 C. 逻辑设计阶段 D. 物理设计阶段
点击查看答案
答案:C. 逻辑设计阶段
反规范化在逻辑设计阶段进行(E-R 图转换为关系模式后,对关系模式进行反规范化优化)。
高频陷阱:很多人选物理设计(D),但反规范化不是选择存储结构或索引,而是在逻辑层面增加冗余。每年必考!
自测题 2(案例分析风格)
Cache-Aside 模式的读流程和写流程分别是什么?
点击查看答案
读流程:
- 先查缓存
- 缓存命中 → 直接返回
- 缓存未命中 → 查数据库
- 写入缓存 → 返回数据
写流程:
- 先更新数据库
- 删除缓存(不是更新缓存!)
为什么删缓存而不是更新? 因为更新缓存存在并发问题:线程1更新DB→线程2读旧缓存→线程1更新缓存,导致缓存和DB不一致。删除缓存可以避免这个问题。
自测题 3(布隆过滤器)
布隆过滤器的核心原理是什么?它的优点和缺点分别是什么?
点击查看答案
原理:布隆过滤器通过多个哈希函数将元素映射到一个位数组中。查询时:
- 如果有一位为 0 → 一定不存在
- 如果所有位都为 1 → 可能存在(有误判率)
优点:快速查询、低内存占用,适用于大规模数据判断
缺点:存在误判率(可能把不存在的误判为存在)、无法删除已添加的元素
适用场景:缓存穿透防御(过滤不存在的查询)、垃圾邮件过滤、URL 去重
自测题 4(案例分析风格)
请说明解决缓存数据不一致的三种方案,并比较它们的适用场景。
点击查看答案
-
延迟双删:更新数据库前删除缓存 → 更新数据库 → 延迟后再删除一次缓存。
- 适用:中等并发场景
- 原理:两次删除确保并发读写不会导致脏数据
-
基于 Binlog 异步同步:用 Canal 等工具监听 MySQL Binlog,解析变更推送到 Redis。
- 适用:高并发、最终一致性场景
- 原理:异步解耦,对业务代码零侵入
-
应用层双写:业务代码中同步写 MySQL 和 Redis。
- 适用:低频写、强一致性场景
- 原理:简单直接,但性能有影响
Step 6:费曼输出 + 信心校准
一句话版本
数据库设计四步(需求→概念→逻辑→物理),反规范化在逻辑设计阶段用冗余换性能,缓存用 Cache-Aside 模式(读查缓存写删缓存),防穿透用布隆过滤器,防击穿用互斥锁/逻辑过期。
三分钟版本
(对着镜子或录音讲 3 分钟,不看书)
数据库设计分四步:需求分析、概念设计(E-R图)、逻辑设计(关系模式+反规范化)、物理设计(索引分区)。反规范化在逻辑设计阶段,这是高频陷阱。
反规范化有 4 种方法:增加冗余列、增加派生列、重新组表、分割表。反规范化的代价是数据不一致,有 3 种解决方法:定期同步、触发器、应用层校验。
缓存架构考得最多的是 Cache-Aside 模式:读先查缓存,写先更新DB再删缓存。注意是"删缓存"不是"更新缓存"。缓存三大问题:穿透(布隆过滤器)、击穿(互斥锁/逻辑过期)、雪崩(TTL加随机偏移)。
缓存分片用一致性哈希(节点变化时只迁移少量数据),布隆过滤器"一位为0一定不存在,都为1可能存在"。
信心自评
| 知识点 | 信心 1-5 | 能否给别人讲清楚? | 需要复习? | |--------|---------|------------------|-----------| | 数据库设计四阶段 | /5 | □ 能 □ 不能 | □ 需要 | | 4 种反规范化方法 | /5 | □ 能 □ 不能 | □ 需要 | | Cache-Aside 读写流程 | /5 | □ 能 □ 不能 | □ 需要 | | 缓存穿透/击穿/雪崩 | /5 | □ 能 □ 不能 | □ 需要 | | 布隆过滤器原理 | /5 | □ 能 □ 不能 | □ 需要 | | 一致性哈希 vs 普通哈希 | /5 | □ 能 □ 不能 | □ 需要 |
📌 常见误区
- "反规范化在物理设计阶段" → 错!在逻辑设计阶段(高频陷阱)
- "Cache-Aside 写流程是更新缓存" → 错!是删除缓存
- "布隆过滤器可以判断元素一定存在" → 错!"所有位为1"只是"可能存在"
- "一致性哈希和普通哈希没区别" → 错!节点变化时数据迁移量差很多
🔧 工程映射
- Cache-Aside + Redis = AIoT 设备状态缓存方案
- 布隆过滤器 = 过滤不存在的设备 ID,防止缓存穿透
- TTL 随机偏移 = 防止缓存雪崩(60s ± 10s)
- 一致性哈希 = Redis Cluster 分片策略
✅ 通关标准
- [ ] 信心自评所有知识点 ≥ 4/5
- [ ] 三分钟版本能脱稿讲完
- [ ] 自测题正确率 ≥ 75%
- [ ] 能口述数据库设计四阶段 + 每阶段产出
- [ ] 能口述 Cache-Aside 读流程和写流程
- [ ] 能口述布隆过滤器原理 + 优缺点
- [ ] 真题正确率 ≥ 80%
- [ ] 论文素材:完成数据库设计相关论文初稿