知识卡片

引入缓存前要先问是否真的需要

普通读书笔记卡

内容

人们容易把硬件里”多多益善”的缓存直觉(CPU L1/2/3、磁盘缓存)不假思索 搬到软件设计里,但两者的负面代价完全不对等。硬件缓存的失效、更新、一致 性问题由芯片和主流ISA自动处理,开发者感知不到;软件缓存的这些问题全部 要由开发者自己承担,直接推高系统复杂度。除此之外,缓存还会从运维角度 掩盖问题——某个缺陷可能因为缓存的存在,在更久之后、离真实发生现场更远 的位置才暴露出来,排查成本更高;从安全角度看,缓存本身可能泄漏敏感数据, 也是容易被攻击的薄弱点。能说服你冒着这些风险引入缓存的理由,说到底只有 两类:缓解CPU压力(把计算结果存起来复用,省去重复计算)和缓解I/O压力 (把对慢介质如磁盘、网络的访问变成对内存等快介质的访问,把对单点部件如 数据库的压力转移到可扩缩的缓存中间件上)。缓存是典型的”以空间换时间”, 但它的出发点应该是”缓解资源峰值压力”而非”专门追求响应速度”——如果单靠 增强CPU/I/O本身性能(比如加机器)就能满足需求,往往比承担缓存的额外 风险更划算。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第4章"透明多级分流系统" 4.6节"服务端缓存"(源文件:_epub-src对应OEBPS/Text/chapter53.xhtml) - 结论依据:原文对比硬件缓存与软件缓存在开发、运维、安全三方面代价的 不对等,并说明只有缓解CPU压力和缓解I/O压力两类理由才值得冒险引入 缓存,直接支撑本卡片结论。 - 原始内容:在软件开发中引入缓存的负面作用要明显大于硬件缓存带来的 负面作用……冒着上述种种风险,仍能说服你引入缓存的理由,总结起来无外乎 以下两种:为缓解CPU压力而引入缓存……为缓解I/O压力而引入缓存。