知识卡片

透明多级缓存靠二级为准一级优先解决侵入性问题

普通读书笔记卡

内容

进程内缓存快但不能跨节点共享,分布式缓存能共享但有网络开销,两者是互补 而非互斥关系——很自然的想法是叠加使用:一级查进程内缓存,没有则查二级 分布式缓存,查到后回填一级,都没有才查真正的数据源、再依次回填两级。但 这个朴素方案代码侵入性很强:开发者要手写多次查询、多次回填逻辑,超时/ 刷新策略要在两层各设置一遍,最麻烦的是数据更新——很容易出现各个节点的 一级缓存和二级缓存互相不一致的局面。要让多级缓存真正”透明”、有实用价值, 常见设计原则是”变更以分布式缓存为准,访问以进程内缓存优先”:数据发生 变动时,在集群内广播一条推送通知(简单场景用Redis的PUB/SUB,要求严谨 则引入ZooKeeper/etcd),让各节点的一级缓存对应数据自动失效,而不是主动 去同步新值;访问时提供统一封装好的查询接口,接口内部自动”先查一级、未 命中再查二级”,调用方看起来只发起了一次查询。这个设计的关键洞察是:让 “失效”这个动作单向地从二级传播到一级,比让”新值”双向同步简单得多,也 更不容易出现不一致。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第4章"透明多级分流系统" 4.6.1节"缓存属性"(源文件:_epub-src对应OEBPS/Text/chapter54.xhtml) - 结论依据:原文说明多级缓存的朴素实现代码侵入性大、容易导致各节点 一二级缓存数据不一致,进而给出"变更以分布式缓存中的数据为准,访问以 进程内缓存的数据优先"的设计原则及推送通知失效一级缓存的具体做法, 直接支撑本卡片结论。 - 原始内容:一种常见的设计原则是变更以分布式缓存中的数据为准,访问以 进程内缓存的数据优先。大致做法是当数据发生变动时,在集群内发送推送 通知……让各个节点的一级缓存中的相应数据自动失效。