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 缓存系统核心架构

下图展示了缓存系统在应用与数据库之间的位置关系,以及命中与未命中时的数据流向:

缓存系统核心架构 — 命中与未命中流程 应用客户端 缓存层(Redis) 数据库(MySQL) 请求 key 命中 → 直接返回 未命中 → 回源查询 回写缓存 流程说明 ① 应用请求 key ② 缓存命中 → 直接返回 ③ 缓存未命中 → 查 DB ④ 回写缓存,下次命中

1.6 影响缓存命中率的关键因素

  1. 缓存容量与淘汰策略:容量过小导致频繁淘汰(如 LRU 逐出热数据),容量过大浪费内存。需根据数据访问的 热点分布 合理设置 maxmemory 与淘汰策略(allkeys-lru / volatile-lru / allkeys-lfu 等)。
  2. 过期时间(TTL)设置:TTL 过短导致数据频繁过期,命中率下降;TTL 过长可能导致数据不一致。建议根据业务容忍的 数据新鲜度 设置差异化 TTL。
  3. 缓存粒度:缓存整行数据 vs 缓存单个字段,粒度越细越灵活,但可能增加 key 数量与管理复杂度。
  4. 访问模式:读多写少场景命中率高;写频繁场景需要配合更新策略(先更新 DB 再删除缓存,或延迟双删)。
  5. 缓存预热:系统启动或重启后,缓存为空,命中率瞬间跌至 0%。需要提前将热点数据加载到缓存中。