跳到主要内容

缓存读取、淘汰与写入策略

缓存如何用局部数据加快读取?​

  • 缓存: 暂存更可能被再次访问的数据,用容量与一致性维护成本换取更低延迟、数据库负载和网络消耗;
  • 局部性: 请求有重复或集中趋势时,较小数据子集就可能承接较大流量;
  • 命中: 在缓存找到可用数据并返回;未命中则访问后端,并按策略填充缓存;
  • 多级缓存: CPU 的 L1、L2、L3 通过标签定位缓存块,应用也可设置多层缓存,但不能把硬件规则直接等同于业务缓存;
  • 冷暖状态: 应用冷缓存通常指尚未预热,热缓存指常用内容已驻留,不应固定对应某个 CPU 层级;
  • 不适用条件: 重复率低、变化太快或缓存访问并不更便宜时,维护成本可能超过收益;
  • 数据地位: 缓存一般可重建,不能在没有持久化与恢复保证时把它当唯一事实来源;

一次读穿流程如何填充共享缓存?​

应用 → 缓存查询 → 命中则返回
→ 未命中 → 后端读取 → 填充缓存 → 返回
  • 分布式缓存: 把多机内存组织成逻辑缓存,突破单机容量,但增加网络调用和节点故障处理;
  • 全局缓存: 多个应用共享同一逻辑缓存;原文示例由缓存层负责回源,应用回源的形式则是旁路缓存;
  • 容量估算: 应根据活跃唯一键数、键值大小、元数据、TTL 与副本数计算,请求次数不能直接替代键数;
  • 应用场景: 数据库查询、API 响应、DNS 与 CDN 都可使用缓存思想,具体过期语义各不相同;

缓存空间不足时怎样淘汰数据?​

策略被淘汰对象适用判断
FIFO / LIFO最先 / 最后插入项不考虑真实访问热度
LRU / MRU最久未访问 / 最近访问项按最近访问规律取舍
LFU访问频率最低项适合稳定热点,但需考虑历史计数衰减
RR随机项维护简单,不精确追踪热度
  • 淘汰与失效: 淘汰为了腾空间,失效为了不再使用错误或过期数据,两者解决的问题不同;
  • 原文示例: Redis、Memcached、ElastiCache、Aerospike,持久化与淘汰行为需要按实际配置判断;

直写缓存怎样确认一次写入?​

  • Write-through: 写路径同步更新缓存和持久化存储,只有满足指定成功条件后才返回;
  • 收益: 后续读取通常可命中刚写入的数据,适合写后立即读取;
  • 代价: 写延迟包含后端写入,且必须处理只成功一侧的失败,不能假设两次写天然原子;

绕写缓存怎样避免一次性数据污染缓存?​

  • Write-around: 写入直接到持久化存储,等到后续真正读取时再加载缓存;
  • 收益: 不必为只写一次、不再读取的内容占用缓存;
  • 代价: 紧接着的读取可能未命中,已有旧值还需要失效或更新,否则会读到过期版本;

回写缓存怎样用风险换取写吞吐?​

  • Write-back: 先写缓存并确认,稍后异步合并或批量写入持久化存储;
  • 收益: 降低前台写延迟,合并重复写,适合能承担相应风险的高写入负载;
  • 失败风险: 缓存在落盘前丢失会丢数据,副本可以降低风险,但仍需定义确认、恢复与持久性保证;