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% |
缓存的核心价值可以总结为以下四点:
- 加速数据读取:内存访问延迟约 100ns,磁盘访问延迟约 10ms,差距达 10 万倍。
- 保护后端系统:缓存作为“缓冲层”,防止突发流量击穿数据库。
- 降低网络开销:缓存数据在应用本地或同机房,避免跨网络调用。
- 支持高并发:单机 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)”模式。下图展示了请求在缓存与数据库之间的流转路径:
1.5 缓存引入后的架构挑战
缓存虽然带来了性能提升,但也引入了新的复杂性。在 Spring Boot 架构中,缓存一致性是最核心的挑战:
- 数据不一致:缓存中的数据与数据库中的数据在某个时间点不一致。
- 缓存穿透:请求直接绕过缓存打到数据库,通常由查询不存在的数据引起。
- 缓存击穿:热点 key 过期瞬间,大量并发请求同时回源数据库。
- 缓存雪崩:大量缓存同时过期或缓存节点宕机,导致数据库压力骤增。
- 更新顺序:先更新数据库还是先更新缓存?顺序错误会导致长期不一致。