知识卡片
多级缓存化:从浏览器到分布式存储,及local+remote两级mget优化
内容
京东详情页系统构建了一套完整的多级缓存体系,每一级缓存针对不同的访问路径和数据特点:浏览器缓存处理页面之间来回跳转的场景,走本地local cache,打开页面时用Last-Modified去CDN验证是否过期,减少重复传输;CDN缓存让用户就近从离自己最近的节点取数据,而不是所有请求都要回源到中心机房,直接提升访问性能;服务端应用本地缓存基于Nginx+Lua的HttpLuaModule模块shared dict实现,这一级缓存有个关键特性——即使应用重启,共享字典缓存也不会丢失,这意味着重启应用不会造成”缓存被清空、瞬间大量请求穿透到后端”的抖动;服务端分布式缓存则用内存+SSD+持久化存储引擎的组合来承载更大容量、更持久的数据。在应用本地缓存这一层,团队还做了一个针对具体访问模式的精细化优化:详情页需要mget商品的其他维度数据(分类、面包屑、商家等约8个维度),如果每次都直接mget远程缓存,不仅性能不理想,单次数据量还经常超过30KB;但这些数据即使缓存半小时也完全可以接受业务上的滞后,于是把mget拆成两级——先读本地local cache,只有本地没命中的部分才回源到remote cache获取,这个改动直接把remote cache的流量削减了一半以上。这套多级缓存设计给出了一条通用原则:不能笼统地问”要不要加缓存”,而要针对链路上每一段访问路径(浏览器内跳转、跨用户跨地域访问、应用内高频重复读取)分别设计合适的缓存层级;而在已经有缓存的基础上,如果发现某类数据的读取模式呈现出”访问频繁但容忍一定过期”的特征,进一步在缓存前面再叠一层更靠近调用方、允许命中失败才回源的本地缓存,往往能带来立竿见影的流量削减。
结构图:
flowchart TB
A["浏览器缓存\n(页面跳转local cache/\nLast-Modified验证CDN)"] --> B["CDN缓存\n(就近节点,避免全部回源)"]
B --> C["服务端应用本地缓存\n(Nginx+Lua shared dict\n重启不丢失)"]
C -->|"本地未命中"| D["服务端分布式缓存\n(内存+SSD+持久化存储引擎)"]
subgraph mget优化["8维度数据mget优化"]
E["请求8个维度数据(分类/面包屑/商家等)"] --> F{"local cache是否命中?"}
F -->|"命中"| G["直接返回,无需远程调用"]
F -->|"未命中"| H["回源remote cache获取"]
H --> I["缓存半小时"]
end
C -.->|"该优化削减remote cache流量50%+"| mget优化
参考来源
- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.1 亿级商品详情页架构演进技术解密"节,"3.1.2 商品详情页发展史"(源文件:_epub-src/OEBPS/Text/Chapter3_1_3.xhtml)
- 结论依据:原文说明浏览器缓存、CDN缓存、服务端应用本地缓存("每次重启共享缓存不丢")、服务端分布式缓存四级结构,以及"这些数据缓存半小时也是没有问题的,因此我们设计为先读local cache,然后把不命中的再回源到remote cache获取,这个优化减少了一半以上的remote cache流量",共同支撑本卡片结论与结构图。
- 原始内容:浏览器缓存,当页面之间来回跳转时走local cache……CDN缓存,用户去离自己最近的CDN节点拿数据……服务端应用本地缓存,我们使用Nginx+Lua架构……重启不丢失……我们设计为先读 local cache,然后把不命中的再回源到remote cache获取,这个优化减少了一半以上的remote cache流量。