1. 缓存基础概念
1.1 缓存的定义
缓存(Cache)是一种将数据存储在临时存储介质中的技术,目的是让后续对相同数据的访问能够更快地获取结果。在软件架构中,缓存通常位于应用程序与慢速存储系统(如数据库、磁盘文件系统)之间,充当高速数据中转层。
核心定义:缓存是空间换时间的经典实践——用额外的存储空间(内存或SSD)换取数据访问的延迟降低与吞吐量提升。
1.2 缓存的作用
缓存主要解决两个核心问题:
- 加速读操作:将热点数据从毫秒级(数据库查询)提升到微秒级(内存读取),读写速度差距可达1000倍以上。
- 减轻数据库压力:拦截重复查询,降低数据库连接数、CPU消耗和磁盘I/O,防止数据库成为系统瓶颈。
| 对比维度 | 无缓存 | 有缓存 | 提升倍数 |
|---|---|---|---|
| 单次读取延迟 | 10~50 ms(MySQL) | 0.1~1 ms(Redis) | 50~500x |
| QPS 上限 | 1,000~5,000 | 50,000~100,000 | 20~100x |
| 数据库连接数 | 高(每个请求占用) | 低(缓存层拦截) | — |
1.3 缓存与数据库的差异
缓存和数据库在存储特性上存在本质区别,理解这些差异是设计缓存策略的前提:
| 特性 | 缓存(如 Redis) | 数据库(如 MySQL) |
|---|---|---|
| 存储介质 | 内存(DRAM)为主 | 磁盘(SSD/HDD)为主 |
| 数据持久性 | 弱(宕机可能丢失) | 强(ACID 事务保证) |
| 数据模型 | Key-Value / 简单结构 | 关系表 / 复杂查询 |
| 读写能力 | 高吞吐、低延迟 | 中等吞吐、较高延迟 |
| 容量成本 | 昂贵(GB级) | 便宜(TB级) |
| 一致性保证 | 最终一致性为主 | 强一致性(可配置) |
实践建议:缓存适合存储读多写少、变化不频繁、对一致性容忍度较高的数据。对于金融交易、库存扣减等强一致场景,必须配合数据库事务和缓存失效策略共同保障。
1.4 缓存命中率与性能指标
缓存命中率是衡量缓存系统效率的核心指标,直接反映缓存是否有效降低了数据库负载。
1.4.1 核心指标定义
- 缓存命中率(Hit Ratio) = 缓存命中的请求数 / 总请求数 × 100%
- 缓存未命中率(Miss Ratio) = 1 - 命中率
- 平均访问延迟(Average Latency) = 命中率 × 缓存延迟 + 未命中率 × 数据库延迟
1.4.2 性能指标参考范围
| 指标 | 优秀 | 良好 | 需优化 |
|---|---|---|---|
| 缓存命中率 | ≥ 95% | 80% ~ 95% | < 80% |
| 平均读取延迟 | < 2 ms | 2 ~ 10 ms | > 10 ms |
| 数据库 QPS 下降比例 | ≥ 90% | 70% ~ 90% | < 70% |
1.4.3 影响命中率的关键因素
- 缓存容量:容量过小导致数据频繁被淘汰(Eviction),命中率下降。
- 过期策略:TTL 设置过短会导致缓存频繁失效,过长则可能带来数据不一致。
- 数据访问模式:热点数据集中(二八定律)有利于缓存;全表扫描或随机访问则命中率低。
- 缓存粒度:细粒度缓存(单条记录)命中率高但管理复杂;粗粒度缓存(整页数据)命中率低但实现简单。
常见误区:不要盲目追求 100% 命中率。缓存命中率过高可能意味着缓存容量过大(浪费内存)或 TTL 过长(数据陈旧)。合理的命中率目标应结合业务场景和成本预算综合设定。
1.5 缓存一致性问题的根源
缓存与数据库之间的数据不一致,本质上是由于双写时序和并发访问导致的。当应用程序同时操作缓存和数据库时,如果两个操作的顺序或原子性得不到保证,就会出现缓存数据与数据库数据不同步的情况。
典型场景:线程A更新数据库后还没来得及更新缓存,线程B读取了旧缓存数据;或者线程A先更新缓存后数据库更新失败,导致缓存变成“脏数据”。这些问题的解决方案将在后续章节详细展开。