Smartstore 输出缓存:Donut Hole 缓存策略深度剖析

发布时间:2026/10/3 7:31:00
Smartstore 输出缓存:Donut Hole 缓存策略深度剖析 Smartstore 输出缓存Donut Hole 缓存策略深度剖析【免费下载链接】SmartstoreA modular, scalable and ultra-fast open-source all-in-one eCommerce platform built on ASP.NET Core 10项目地址: https://gitcode.com/GitHub_Trending/smar/SmartstoreSmartstore是一款基于 ASP.NET Core 的开源一体化电子商务平台而它的**输出缓存Output Cache**正是平台超快性能的核心秘密之一。本文将带你完整剖析 Smartstore 独特的Donut Hole甜甜圈洞缓存策略静态外圈如何整体缓存、动态内层如何实时替换、缓存失效又靠什么精准触发——帮助新手和普通用户快速理解这套机制背后的性能原理。什么是 Donut Hole 缓存策略想象一个电商页面顶部导航、Banner、商品网格、页脚几乎天天不变但购物车数量登录用户名却时刻在变。传统做法要么整页不缓存慢要么整页缓存数据不新鲜。Smartstore 的Donut Hole Caching甜甜圈洞缓存给出了优雅的折中方案外圈Page页面的非动态外层——HTML、CSS、JavaScript 及大部分静态内容整体缓存在服务端内存、数据库或 Redis 中内圈Component即甜甜圈的洞嵌入在静态外层中的动态区块如搜索框、个性化推荐每次请求实时生成请求到达时服务器先取缓存的外圈再把新鲜的内圈填进洞里拼出最终页面返回给用户。这套策略既拿到了整页缓存的巨大性能收益又保证了动态内容永远新鲜。缓存命中后无需重新执行控制器与视图渲染响应时间可大幅降低、服务器负载显著减少这正是 Smartstore 号称ultra-fast的关键所在。 官方文档中对这一概念有完整说明output-cache.md哪些页面可以缓存——路由级白名单机制Smartstore 的输出缓存采用**显式声明opt-in**方式没有任何配置时什么都不缓存。只有被明确列出的路由才会被视为缓存候选。缓存路由的两种形态元素路由格式示例整页Full Page[{模块}/]控制器短名/动作Catalog/Category、BlogModule/Blog/List视图组件View Componentvc:[{模块}/]组件短名vc:SearchBox模块开发者只需在模块内提供一个internal的 CacheableRoutes 类实现 ICacheableRouteProvider 接口并返回路由字符串列表即可无需任何 DI 注册internal sealed class CacheableRoutes : ICacheableRouteProvider { public int Order 0; public IEnumerablestring GetCacheableRoutes() { yield return Catalog/Category; yield return vc:SearchBox; } }缓存键为什么同一页面会有多份缓存同一个页面在不同环境下内容不同因此 Smartstore 会用多个环境要素共同生成缓存条目键cache key每种组合各存一份页面路径与查询字符串当前语言、货币当前商店、主题全部客户角色应用版本号多店铺、多语言、多主题的站群场景下这正是缓存不出串味问题的保障。动态甜甜圈洞是如何被实时替换的这是整个策略最精妙的部分官方称之为Substitution替换首次请求页面正常渲染但所有不匹配任何组件路由的视图组件即动态洞不会被写进缓存内容而是被替换为一段JSON 元数据包含组件信息与它的Invoke方法参数后续请求服务器直接从缓存取出带洞的外圈解析每个洞里的 JSON 元数据现场调用对应组件的Invoke方法把新鲜 HTML 填回洞里拼出最终页面。⚠️ 这里有两条重要约束新手务必牢记组件Invoke方法的参数不能依赖父页面或外层视图模型二次请求时模型已不可用且所有参数必须可序列化为 JSON绝不要把涉及用户个人信息的组件设为可缓存——否则 A 用户的购物车可能展示给 B 用户。另外后台管理页面永远不会被缓存只有前台页面在缓存范围内。缓存失效实体标签让脏数据无处可藏输出缓存最大的难题是商品 A 在后台被改价或删除后任何以任意形式展示过商品 A 的页面都必须立即失效。Smartstore 用一套实体标签 观察者体系自动化了这件事。显示声明Announce与缓存标签核心服务是 IDisplayControl。控制器只需在准备视图模型时调用一次Announce(product)系统就会为实体生成缓存标签tag。内置的标签规则已在 DisplayControl.cs 中预置商品 →p5、分类 →c12、品牌 →m3、主题新闻→t8、菜单 →mnu1……连带关系也被覆盖修改商品的图片、规格、捆绑子项、阶梯价同样会打上所属商品的标签p5。缓存条目生成时这些标签随条目一起被缓存。此后任何实体被编辑或删除所有携带该标签的缓存条目都会被精准清除——改价商品 A全站涉及 A 的页面瞬间刷新无需手动清缓存。对于自定义实体如博客文章可通过DisplayControl.RegisterHandlerFor注册标签生成规则例如为BlogPost生成b5标签。失效观察者复杂场景的总开关IOutputCacheInvalidationObserver 是单例服务允许模块注册两类观察者实体观察者监控实体变更如博客文章的可见性属性被修改时按路由批量失效所有博客列表页设置观察者监控系统设置键如任何CatalogSettings.*变更时失效相关目录页面支持通配前缀。失效粒度由粗到细都有覆盖按路由失效InvalidateByRouteAsync、按标签失效InvalidateByTagAsync、按前缀失效InvalidateByPrefixAsync完整接口见 IOutputCacheProvider。逃生舱标记请求为不可缓存即使路由匹配成功只要页面包含不宜缓存的内容调用 IDisplayControl 的MarkRequestAsUncacheable()即可让缓存提供方放弃拦截本次请求——私密的、个性化的页面永远安全。上手清单模块开发者的 5 条黄金法则✅只声明确实可缓存的路由——输出缓存是 opt-in少即是多✅用户相关组件永远不缓存防止个人数据串用户✅在准备视图模型时 Announce 所有被显示的实体让标签系统自动接管失效✅为自定义实体注册标签处理器DisplayControl.RegisterHandlerFor并处理好子实体到父实体的标签映射✅在启动类的BuildPipeline中注册失效观察者覆盖设置变更这类全局影响。核心源码导读想进一步深入建议按此顺序阅读策略概念与路由规范dev-docs/framework/platform/output-cache.md可缓存路由定义ICacheableRouteProvider.cs显示控制与标签体系DisplayControl.cs、IDisplayControl.cs失效观察者与缓存提供程序IOutputCacheInvalidationObserver.cs、IOutputCacheProvider.cs小结Smartstore 的输出缓存并非简单存页面而是一套静态外圈整体缓存 动态内圈实时替换 实体标签精准失效三位一体的工程体系。Donut Hole 策略让商城首页在秒杀级流量下依然轻快如飞而标签与观察者机制又确保商品一改全站缓存即刻保鲜——这正是它兼顾快与新的答案。【免费下载链接】SmartstoreA modular, scalable and ultra-fast open-source all-in-one eCommerce platform built on ASP.NET Core 10项目地址: https://gitcode.com/GitHub_Trending/smar/Smartstore创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询