1. 缓存基础概念:什么是缓存、缓存的作用与价值、缓存与数据库的差异

1.1 什么是缓存

缓存(Cache)是一种将数据存储在临时存储介质中的技术,其核心思想是“空间换时间”。在计算机系统中,缓存位于数据请求者与数据持久化存储之间,用于保存最近访问或频繁访问的数据副本,从而加速后续相同数据的访问速度。

从系统架构视角看,缓存可以出现在多个层级:

  • CPU 缓存:L1/L2/L3,解决 CPU 与主存速度不匹配问题。
  • 应用层缓存:本地堆缓存(如 Caffeine、Guava Cache)、分布式缓存(如 Redis、Memcached)。
  • 网络层缓存:CDN 边缘节点、反向代理缓存(如 Nginx、Varnish)。
  • 数据库缓存:MySQL Query Cache、InnoDB Buffer Pool。

在 Spring Boot 微服务架构中,我们主要关注 应用层缓存,即服务实例与数据库之间的缓存层。

关键定义:缓存是数据的临时副本,其生命周期短于原始数据,且必须与数据源保持最终一致性。

1.2 缓存的作用与价值

缓存的价值可以从三个维度衡量:性能、可用性、成本。

维度 具体价值 典型指标
性能 降低响应延迟,提升吞吐量 P99 延迟从 50ms 降至 5ms;QPS 提升 10~100 倍
可用性 缓存命中时,即使数据库短暂不可用,仍可返回数据 缓存命中率 ≥ 95% 时,系统可用性从 99.9% 提升至 99.99%
成本 减少数据库连接数和磁盘 I/O,降低硬件与运维成本 数据库 CPU 使用率从 80% 降至 20%

缓存的核心价值可以总结为以下四点:

  1. 加速数据读取:内存访问延迟约 100ns,磁盘访问延迟约 10ms,差距达 10 万倍。
  2. 保护后端系统:缓存作为“缓冲层”,防止突发流量击穿数据库。
  3. 降低网络开销:缓存数据在应用本地或同机房,避免跨网络调用。
  4. 支持高并发:单机 Redis 可支撑 10 万+ QPS,远超单机数据库的数千 QPS。
实践建议:在 Spring Boot 项目中,优先对“读多写少、数据变化不频繁、一致性要求可放宽”的业务场景引入缓存,例如用户会话、商品详情、配置信息。

1.3 缓存与数据库的差异

缓存与数据库在存储介质、数据模型、访问模式、一致性保证等方面存在本质差异。理解这些差异是设计缓存一致性方案的前提。

对比维度 缓存(Cache) 数据库(Database)
存储介质 内存(DRAM)为主,部分支持持久化 磁盘(SSD/HDD)为主,内存为辅
读写速度 微秒级(1~100μs) 毫秒级(1~100ms)
数据容量 GB 级(受限于内存成本) TB~PB 级
数据模型 Key-Value 为主,简单结构 关系型/文档型,支持复杂查询
持久性 默认不持久,重启丢失 ACID 事务保证,持久化存储
一致性 最终一致性为主 强一致性(可配置)
查询能力 简单查询(精确匹配、范围) 复杂查询(JOIN、聚合、子查询)
成本 高($/GB) 低($/GB)

缓存与数据库的差异决定了它们在架构中的角色:缓存负责“快”,数据库负责“全”和“稳”。缓存不能替代数据库,而是作为数据库的前置加速层。

常见误区:不要试图用缓存存储全量数据。缓存只适合存储“热数据”(高频访问、小数据量),全量数据必须由数据库承载。缓存容量超过内存 70% 时,GC 压力和淘汰开销会急剧上升,反而降低性能。

1.4 缓存与数据库的交互模型

在典型的 Spring Boot 应用中,缓存与数据库的交互遵循“旁路缓存(Cache-Aside)”模式。下图展示了请求在缓存与数据库之间的流转路径:

旁路缓存模式(Cache-Aside)交互流程 客户端 缓存(Redis) 数据库 ① 读请求 ② 缓存命中 → 直接返回 ③ 缓存未命中 → 回源 ④ 写入缓存 旁路缓存核心规则 • 读:先查缓存,命中则返回;未命中则查数据库,回写缓存 • 写:先更新数据库,再删除/更新缓存(避免缓存与数据库不一致) 缓存与数据库的差异在交互中的体现 • 缓存命中时:响应时间约 1~5ms,数据库零压力 • 缓存未命中时:响应时间约 50~200ms,数据库产生一次查询 • 缓存与数据库之间始终存在“时间窗口”,这是一致性问题的根源

1.5 缓存引入后的架构挑战

缓存虽然带来了性能提升,但也引入了新的复杂性。在 Spring Boot 架构中,缓存一致性是最核心的挑战:

  • 数据不一致:缓存中的数据与数据库中的数据在某个时间点不一致。
  • 缓存穿透:请求直接绕过缓存打到数据库,通常由查询不存在的数据引起。
  • 缓存击穿:热点 key 过期瞬间,大量并发请求同时回源数据库。
  • 缓存雪崩:大量缓存同时过期或缓存节点宕机,导致数据库压力骤增。
  • 更新顺序:先更新数据库还是先更新缓存?顺序错误会导致长期不一致。