← 返回题目列表

什么是缓存?为什么要用缓存?它有哪些代价?

高频 简单 第 1 / 25 题 更新于 2026/07/28
缓存缓存收益缓存代价中间件

简化版

缓存是把访问频繁、计算或获取成本高的数据,临时存放在读取更快的介质里(如内存),下次直接命中缓存、不再回源数据库。用它的核心原因是读多写少 + 局部性原理:少量热点数据被反复读取,缓存能挡掉绝大多数数据库压力,把响应从几十毫秒降到亚毫秒。代价是要额外维护数据一致性(缓存和数据库可能不一致)、面对穿透/击穿/雪崩等异常场景,以及占用内存成本。

详细版

缓存的三大收益:

  1. 提升读性能:内存读取(Redis 亚毫秒)远快于磁盘数据库(几毫秒~几十毫秒)。
  2. 降低数据库压力:热点数据被缓存挡住,数据库 QPS 大幅下降,避免被打垮。
  3. 提升系统吞吐:同样的硬件,加缓存后能扛更高并发。

缓存生效的前提(为什么能用):

  • 读多写少:缓存靠「一次写入、多次读取」摊薄成本;写多读少反而拖累。
  • 局部性原理:热点数据集中(二八定律,20% 数据占 80% 访问),少量缓存就能覆盖大部分请求。
  • 能容忍短暂不一致:多数业务读到几百毫秒前的旧数据没关系。

缓存的代价(为什么不能滥用):

代价说明
一致性缓存与 DB 是两份数据,更新时可能不一致
异常场景穿透、击穿、雪崩需要专门防护
复杂度多一层组件,运维、排障成本上升
内存成本内存比磁盘贵,缓存容量有限,需淘汰策略

完整版教学

一、缓存的本质:用空间换时间、用快介质挡慢介质

缓存的思想在计算机世界无处不在——CPU 有 L1/L2/L3 缓存挡内存,操作系统有 Page Cache 挡磁盘,浏览器有 HTTP 缓存挡网络,应用层有 Redis/本地缓存挡数据库。它们的共同逻辑是:在「慢的数据源」前面架一层「快的临时存储」,把热点数据放进去,让大部分请求在快的这一层就被满足,不用穿透到慢的源头。

具体到后端,通常是用 Redis(内存)或本地缓存挡在数据库(磁盘)前面。数据库一次查询可能几毫秒到几十毫秒(涉及磁盘 I/O、锁、网络),而 Redis 命中只要亚毫秒。差着一两个数量级。

二、为什么缓存能work:读多写少 + 局部性

缓存不是万能的,它成立有前提:

① 读多写少。 缓存的价值在于「写一次、读很多次」——第一次读回源填充缓存,之后成千上万次读都命中缓存。如果数据写得比读得还频繁,每次写都要更新/失效缓存,缓存反而成了累赘。所以商品详情、用户信息、配置这类「很少变、经常读」的数据最适合缓存。

② 局部性原理(热点集中)。 现实业务符合二八定律:20% 的热门数据承担了 80% 的访问(爆款商品、大 V 用户、热门文章)。这意味着只要用有限内存缓存住这少部分热点,就能挡掉大部分请求。如果访问是均匀分散的(每条数据都被访问一次),缓存命中率极低,就没意义了。

三、缓存的读写模式:Cache Aside(旁路缓存)

最常用的缓存使用模式是 Cache Aside(旁路缓存)

读流程:

  1. 先查缓存,命中直接返回;
  2. 未命中,查数据库;
  3. 把数据库结果写入缓存,再返回。

写流程:

  1. 先更新数据库;
  2. 再删除缓存(而不是更新缓存)。

这套模式把缓存当作「旁路」——应用自己负责协调缓存和数据库。它简单、通用,是绝大多数业务的默认选择(更新一致性的细节另有专题)。

四、缓存带来的代价:天下没有免费的午餐

用了缓存,就要承担它的副作用:

  • 数据一致性问题:缓存和数据库是两份独立数据,更新时存在时间差,可能读到旧值。需要用「更新 DB + 删缓存」「延迟双删」等手段缓解,但无法做到强一致(要强一致就别用缓存或用更重的方案)。
  • 三大异常场景缓存穿透(查不存在的数据,缓存挡不住,全打到 DB)、缓存击穿(热点 key 失效瞬间大量请求压向 DB)、缓存雪崩(大量 key 同时失效或缓存宕机,DB 被压垮)。每个都要专门防护。
  • 系统复杂度上升:多一个 Redis 集群要部署、监控、容灾,排障时要多考虑一层。
  • 内存成本:内存比磁盘贵得多,缓存容量有限,需要 LRU/LFU 等淘汰策略决定留谁淘汰谁。

五、什么数据适合放缓存、什么不适合

适合: 读多写少、允许短暂不一致、热点集中、单条数据不大。例如商品详情、用户资料、类目树、配置项、排行榜。

不适合:

  • 写多读少:更新频繁,缓存命中率低还要频繁失效。
  • 强一致要求:如账户余额、库存扣减的核心链路(虽然也有用缓存 + 严格控制的做法,但要格外谨慎)。
  • 数据量巨大且访问均匀:缓存不了全部,命中率低。
  • 超大 value(大 key):单个几 MB 的 value 会阻塞 Redis、占满带宽。

六、常见误区与追问

考点正确口径
缓存目标用更快介质保存热点数据,降低延迟和后端压力
适用数据读多写少、热点明显、可容忍短暂不一致
代价一致性、失效、容量、雪崩击穿穿透
without cache:
request -> database, 50ms

with cache:
request -> cache, 1ms
cache miss -> database -> cache set
hit rate 95% reduces database QPS by about 20x

缓存本质是用“空间和一致性复杂度”换“读性能和抗压能力”。

  • 误区:缓存只为了让接口更快。 缓存还用于削峰、保护数据库、降低成本和提升可用性。
  • 误区:所有数据都适合缓存。 强一致、写多读少、极低复用率或敏感实时数据不一定适合缓存。
  • 误区:缓存命中率高就没有问题。 还要看热点倾斜、大 key、尾延迟、一致性和故障降级。
  • 追问:缓存命中率如何影响数据库压力? 命中率 95% 表示只有 5% 请求回源,理论上数据库读流量约降到 1/20。
  • 追问:缓存常见风险有哪些? 穿透、击穿、雪崩、一致性、内存淘汰、热点 key 和大 key。
  • 追问:如何选择缓存 TTL? 按数据变更频率、业务容忍度、内存成本和雪崩风险综合设置。

七、加强记忆

缓存 = 在慢数据源(DB)前架一层快介质(内存),把热点数据放进去挡住大部分请求,用空间换时间。生效前提是读多写少 + 局部性(二八定律,少量热点占大部分访问)+ 能容忍短暂不一致;核心收益是提升读性能、降低 DB 压力、提升吞吐。最常用 Cache Aside 模式(读:查缓存→未命中查 DB→回填;写:更新 DB→删缓存)。代价是一致性问题、穿透/击穿/雪崩三大异常、复杂度和内存成本。简明区分:把握:缓存挡的是「读多写少的热点」,挡不了强一致和均匀访问