知识卡片
复制式缓存与集中式缓存的读写代价对称性权衡
内容
分布式缓存要面对的核心矛盾不再是淘汰策略,而是网络本身——序列化、传输、 反序列化带来的延迟远高于内存访问,是比命中率更值得关注的性能因素。复制式 缓存可以理解成”能支持分布式的进程内缓存”:每个节点都保存全量数据副本, 读取完全走本地内存,理论上能做到和进程内缓存一样快;但一旦数据变化,就 必须把变更同步给集群里的每一个节点,复制成本随节点数增长呈平方级上升, 代表产品JBossCache正是因为大规模集群下同步速度追不上写入速度、内存里 堆积大量待重发对象、最终OOM崩溃而被淘汰。集中式缓存反过来:读写都要走 网络,不会随节点数增加而产生额外同步负担,但读写性能都到不了进程内缓存 的水平;它天然独立于业务进程之外,能天然跨语言提供服务(用C写的Memcached 毫无障碍地为Java应用提供服务),代价是复杂对象只能靠序列化传输,哪怕 一个大对象只改了一个字段,通常也要整体重新序列化。这本该是”读多写少 适合复制式、读写都频繁适合集中式”的选型问题,但Redis几乎以一己之力把 这个理论选择题变成了事实上不需要再选的问题——性能足够好,用作缓存已经 成了默认选项,不太需要再区分场景。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第4章"透明多级分流系统"
4.6.1节"缓存属性"(源文件:_epub-src对应OEBPS/Text/chapter54.xhtml)
- 结论依据:原文说明复制式缓存读取快但写入代价随节点数呈平方级上升、
JBossCache因此被淘汰,集中式缓存读写都要走网络但不受节点数影响、能
跨语言服务,并指出Redis的流行让"理论上该选哪种"的判断变得不那么重要,
直接支撑本卡片结论。
- 原始内容:复制性能随着节点的增加呈现平方级下降,变更数据的代价十分
高昂……JBossCache被淘汰的主要原因是写入性能太差……如今Redis广为流行,
基本上已经打败了Memcached及其他集中式缓存框架……甚至可以说成为分布式
缓存的实质上的首选。