缓存读取、淘汰与写入策略
缓存如何用局部数据加快读取?
- 缓存: 暂存更可能被再次访问的数据,用容量与一致性维护成本换取更低延迟、数据库负载和网络消耗;
- 局部性: 请求有重复或集中趋势时,较小数据子集就可能承接较大流量;
- 命中: 在缓存找到可用数据并返回;未命中则访问后端,并按策略填充缓存;
- 多级缓存: 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: 先写缓存并确认,稍后异步合并或批量写入持久化存储;
- 收益: 降低前台写延迟,合并重复写,适合能承担相应风险的高写入负载;
- 失败风险: 缓存在落盘前丢失会丢数据,副本可以降低风险,但仍需定义确认、恢复与持久性保证;