1. 缓存基础:定义、作用、对比与命中率
1.1 缓存的定义
缓存(Cache)是一种将数据存储在临时高速存储层中的技术,目的是让后续对相同数据的请求能够更快地被响应。在计算机系统中,缓存通常位于速度较慢的持久化存储(如磁盘、数据库)与计算单元之间,利用局部性原理(时间局部性与空间局部性)来减少对底层慢速存储的访问次数。
核心思想:用空间换时间——用额外的内存或高速存储空间,换取数据访问的延迟降低与吞吐量提升。
1.2 缓存的作用
- 降低延迟:内存访问延迟通常在微秒级(<1ms),而磁盘或远程数据库访问延迟在毫秒级(10~200ms),缓存可将响应时间降低 1~3 个数量级。
- 提升吞吐量:缓存层能承载更高的并发请求(单机 Redis 可达 10 万+ QPS),减轻后端数据库的连接与查询压力。
- 保护后端系统:通过削峰填谷,防止突发流量打垮数据库或下游服务。
- 降低运营成本:减少数据库扩容需求,降低 CPU、磁盘 I/O 与网络带宽开销。
1.3 缓存与数据库的对比
| 对比维度 | 缓存(以 Redis 为例) | 数据库(以 MySQL 为例) |
|---|---|---|
| 存储介质 | 内存为主(可持久化到磁盘) | 磁盘为主(内存 Buffer 辅助) |
| 读写延迟 | 亚毫秒级(0.1~1ms) | 毫秒级(1~100ms) |
| 数据模型 | Key-Value、Hash、List、Set、Sorted Set | 关系表、行、列、索引 |
| 查询能力 | 简单键值查询 + 有限聚合 | 复杂 SQL、多表 JOIN、事务 |
| 持久化 | 可选(RDB/AOF),非强一致 | 强持久化,ACID 事务保证 |
| 容量 | 受限于内存大小(GB~TB) | 磁盘容量大(TB~PB) |
| 典型场景 | 热点数据缓存、会话管理、计数器、排行榜 | 核心业务数据存储、报表、审计 |
关键认知:缓存不是数据库的替代品,而是数据库的前置加速层。两者配合使用时,必须关注数据一致性、过期策略与缓存穿透/击穿/雪崩问题。
1.4 缓存命中率的概念
缓存命中率(Cache Hit Ratio)是衡量缓存系统效率的核心指标,定义如下:
缓存命中率 = 缓存命中的请求次数 / 总请求次数 × 100%
- 命中(Hit):请求的数据在缓存中存在,直接返回。
- 未命中(Miss):请求的数据不在缓存中,需要回源到数据库或其他后端获取。
命中率越高,说明缓存越有效地承担了数据访问压力,系统整体延迟越低。业界常见参考值:
| 命中率范围 | 评价 | 典型场景 |
|---|---|---|
| > 95% | 优秀 | 静态数据、配置信息、用户会话 |
| 80% ~ 95% | 良好 | 大部分读多写少业务 |
| 60% ~ 80% | 一般 | 数据频繁更新或冷热交替明显 |
| < 60% | 较差 | 缓存策略不当、容量不足或访问模式不匹配 |
注意:命中率并非越高越好。如果为了追求 99% 命中率而缓存大量冷数据,反而会浪费内存资源,增加淘汰开销。需要结合业务访问分布与缓存容量做权衡。
1.5 缓存系统核心架构
下图展示了缓存系统在应用与数据库之间的位置关系,以及命中与未命中时的数据流向:
1.6 影响缓存命中率的关键因素
- 缓存容量与淘汰策略:容量过小导致频繁淘汰(如 LRU 逐出热数据),容量过大浪费内存。需根据数据访问的 热点分布 合理设置 maxmemory 与淘汰策略(allkeys-lru / volatile-lru / allkeys-lfu 等)。
- 过期时间(TTL)设置:TTL 过短导致数据频繁过期,命中率下降;TTL 过长可能导致数据不一致。建议根据业务容忍的 数据新鲜度 设置差异化 TTL。
- 缓存粒度:缓存整行数据 vs 缓存单个字段,粒度越细越灵活,但可能增加 key 数量与管理复杂度。
- 访问模式:读多写少场景命中率高;写频繁场景需要配合更新策略(先更新 DB 再删除缓存,或延迟双删)。
- 缓存预热:系统启动或重启后,缓存为空,命中率瞬间跌至 0%。需要提前将热点数据加载到缓存中。