一句话定义

缓存是一种高速数据存储层,用于临时保存数据的副本,使后续对同一数据的请求能比访问原始存储位置更快地被响应。核心思路是「用空间换时间」:用昂贵的快速存储换取访问延迟的下降。(来源:AWS Caching Overview、Fastly)

核心原理

  • 缓存之所以有效,依赖程序局部性原理:
    • 时间局部性:某数据一旦被访问,短时间内大概率会被再次访问
    • 空间局部性:某数据被访问时,其邻近数据大概率也会被访问
  • 典型工作流程:首次请求 → 未命中(cache miss)→ 从源读取并存入缓存 → 后续请求命中(cache hit)→ 直接返回缓存数据
  • 性能指标:命中率(hit rate)、未命中开销、访问延迟
  • 本质是「容量换速度」的权衡:缓存通常只保存数据子集,数据是瞬态(transient)的

计算机体系中的缓存(CPU 缓存)

现代处理器内部是多级缓存层级(Cache Hierarchy):

  • L1 缓存:最顶层,极小(约 32KB64KB),极快(13 个时钟周期),指令/数据分离,每核独有
  • L2 缓存:中等(约 512KB2MB),较快(1015 周期),承接 L1 溢出数据
  • L3 缓存:共享大容量(约 32MB256MB),较慢(4060 周期),多核共享,兼作核间通信
  • 主存(RAM/DDR):GB 级,极慢(300~400 周期)
  • 物理原因:光速与 RC 线延迟决定了「大容量必然慢」,多级缓存就是用统计规律模拟出「又大又快又便宜」的假象
  • 硬件实现:缓存多用昂贵但高速的 SRAM,主存用廉价 DRAM

网络与 Web 中的缓存

HTTP 缓存(浏览器缓存)

  • 浏览器缓存减少不必要的网络请求,所有主流浏览器均支持
  • 关键响应头 Cache-Control:
    • Cache-Control: max-age=120 表示资源可缓存 120 秒
    • Cache-Control: no-cache 表示每次使用前必须向服务器重新验证
    • 还有 no-store、must-revalidate 等指令
  • 资源校验机制:
    • ETag:资源内容指纹,配合请求头 If-None-Match 做条件请求
    • Last-Modified:资源最后修改时间,配合 If-Modified-Since
    • 服务器验证未变化 → 返回 304 Not Modified(体积极小),浏览器继续用本地缓存;变化 → 返回完整新资源

CDN 缓存

  • CDN(内容分发网络)在靠近用户的边缘节点缓存静态资源副本
  • 好处:降低用户等待延迟(latency)、减少源站流量与带宽成本(egress 费用)
  • 常见缓存对象:图片、CSS/JS、视频等静态资产

DNS 缓存

  • 域名解析结果会被各级 DNS 服务器和操作系统/浏览器缓存,避免重复向上级查询
  • 通过 TTL(生存时间)控制缓存有效期

应用层缓存

  • 内存缓存:Redis、Memcached 等,键值存储热点数据,供应用快速读写
  • 数据库缓存:数据库自身的 buffer pool / 查询缓存,加速重复查询
  • 浏览器本地存储:localStorage、sessionStorage、IndexedDB 等

缓存淘汰与失效策略

  • 缓存容量有限,满了需要淘汰旧数据:
    • LRU(Least Recently Used,最近最少使用):优先淘汰最久未使用的条目,是最常用策略(如操作系统内存页置换)
    • LFU(Least Frequently Used,最不经常使用):优先淘汰使用频率最低的条目
    • 其他:FIFO(先进先出)、TTL 过期、随机淘汰等
  • 缓存失效(Cache Invalidation):源数据变化后必须让缓存失效,否则用户看到旧数据
    • 主动失效:更新数据时删除/更新对应缓存
    • 组失效:整组数据变化时批量失效(如新闻网站政治板块整体更新)
    • 过期失效:依赖 TTL 自然过期
  • 缓存一致性是分布式系统的经典难题(”计算机科学只有两件难事:缓存失效和命名”)

常见问题与权衡

  • 缓存雪崩:大量缓存同时过期导致请求全部打到数据库
  • 缓存穿透:查询不存在的数据,每次都绕过缓存直击数据库
  • 缓存击穿:热点 key 失效瞬间高并发打爆后端
  • 解决方案:随机过期时间、布隆过滤器、互斥锁/单飞等

参考资料