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 过长(数据陈旧)。合理的命中率目标应结合业务场景和成本预算综合设定。
缓存系统核心性能指标关系图 用户请求 缓存层(Redis / Local Cache) 命中 → 直接返回 命中率 = 命中数 / 总请求 未命中 → 查数据库 数据库(MySQL) 回填缓存 平均延迟 = 命中率 × 缓存延迟 + (1 - 命中率) × 数据库延迟

1.5 缓存一致性问题的根源

缓存与数据库之间的数据不一致,本质上是由于双写时序和并发访问导致的。当应用程序同时操作缓存和数据库时,如果两个操作的顺序或原子性得不到保证,就会出现缓存数据与数据库数据不同步的情况。

典型场景:线程A更新数据库后还没来得及更新缓存,线程B读取了旧缓存数据;或者线程A先更新缓存后数据库更新失败,导致缓存变成“脏数据”。这些问题的解决方案将在后续章节详细展开。
缓存与数据库差异对比架构 应用程序 缓存(内存) 延迟:0.1~1 ms 容量:GB 级 数据库(磁盘) 延迟:10~50 ms 容量:TB 级 缓存层拦截热点请求,数据库层保证数据持久化与完整性