最初发表于tamiz.pro.
现代网络开发中的缓存不再仅仅是为静态资产提供更快的服务;它是平衡性能、成本和数据新鲜度的主要机制。
在"Next.js"的背景下,缓存架构发生了显著演变,从简单/分化转向跨越"边缘跑道"(Edge Runtime),"服务器组件"(Server Cuplications)架构,"节点"(Node.js)服务器环境的复杂多层系统.
对于软件工程师和系统建筑师来说,理解Next.js缓存的默认行为是不够的.
要建立处理高通量且不敲打您数据库的生产级应用程序,您必须掌握高级模式:颗粒再验证、缓存标记和外部缓存管理。
这篇文章深入了这些机制,解释了他们是如何在罩子下工作的,以及如何为最佳的性能而协调.
Next.js Caching的进化 要欣赏先进的模式,我们必须首先将目前的Caching模型结合到上。
Next.js 13+ (App Router) 引入了一种新的缓存模式,既默认更简单,又在定制时更强大.
默认行为为: App路由器(RSC):组件默认被缓存.
服务器组件一次渲染,并在服务器上缓存.
下一次请求相同数据返回缓存结果 。
静态生成:页面和布局在建设时间并静态服务.
服务器组件:所获取的数据被缓存在服务器的内存中,而不是在浏览器中.
这里的关键转变是 缓存是选择退出,而不是选择进入。
之前,你必须明确标记 事物为静态。
现在, 当数据变化时, 您必须明确取消缓存 。
这种控制倒置将一致性的责任完全置于开发者身上,需要精确的工具来管理无效性.
Granular 重排: 基于标记的系统 Next.js中最显著的高级缓存模式是引入 .
此 API 允许您根据标签而非 URL 或时间间隔来取消缓存数据 。
这对于数据相互依存的应用至关重要。
例如,如果用户更新他们的配置文件,你并不只是想要使页面无效;你想要使获取该用户数据的任何其他页面无效,例如全局头或通知徽章.
如何运作 在服务器组件或服务器动作中获取数据时,可以使用选项与标签相连接.
稍后,你可以取消所有与该标记相关的数据.
为什么这是ISR的高级传统增量静电再生(ISR)依赖于一个基于时间的再验证间隔(.
这有两个主要缺陷: Stale Data:用户在变化后最多60秒内可能看到过时的数据.
不必要的再生:如果数据没有改变,系统仍然重建页面,浪费计算资源.
基于标签的再验证解决了两者.
它能确保即时一致性(如果标记被作废),并只在数据实际变化时触发再生.
缓存标记: 复杂图缺失的链接 虽然很强大,但手动管理标记在大型应用中会变得容易出错.
Next.js为此提供了更高级的抽象:缓存标记(常被称作缓存塔格 API).
这个特性允许您定义数据与标记之间的关系,使无效性更加具有声明性.
定义缓存标签 您可以在文件中定义缓存标记 。
这将创建一个全球标签登记簿, 您的应用程序可以参考 。
注:配置主要用于定义标签的解析方式或与外部缓存系统相融合.
核心无效逻辑仍然依赖和选项.
高级拖放策略 在复杂的应用中,你可能拥有一个数据的分级.
例如,一个属于一个.,它属于一个.
如果更新它的时数,你可能会想 取消所有在那个。
此模式允许对缓存 invali 进行精细控制