AEM Edge函数中的缓存 edge-functions-caching
本页提供了有关缓存如何在AEM Edge Functions中工作的详细技术指导,包括双缓存架构,如何控制代码中的缓存行为,以及如何在内容发生更改时清除缓存条目。
有关AEM as a Cloud Service缓存工作方式的一般背景,请参阅AEM as a Cloud Service中的缓存和AEM as a Cloud Service中的CDN。 有关代码示例,请参阅AEM Edge函数样板 — 缓存。
缓存架构 architecture
AEM Edge函数位于CDN和函数从中获取的后端服务之间。 这些后端可以是AEM发布实例、第三方API、外部数据库或您的代码调用的任何HTTP端点。 请求流中有两个不同的缓存,每个缓存独立运行:
Browser → AEM CDN (CDN Cache) → AEM Edge Functions (Fetch Cache) → Backend (AEM, APIs, etc.)
fetch()调用,以及通过核心缓存API存储的数据CacheOverride或通过核心缓存API编程的替代密钥aio aem edge-functions purge-cache CLI命令或purgeSurrogateKey()了解此两层体系结构至关重要,因为每个缓存具有不同的范围、不同的控件和不同的清除机制。 有效的缓存需要在这两个级别进行精心配置。
CDN缓存(外部) cdn-cache
CDN缓存位于浏览器和Edge函数之间。 它缓存Edge函数的响应。 您可以通过在Edge函数响应中设置标准HTTP缓存标头来控制其行为:
return new Response(body, {
headers: {
'Surrogate-Key': 'page-home product-123',
'Cache-Control': 'public, max-age=3600'
}
});
多个代理键用空格分隔。 这些替代密钥可用于使用CDN缓存清除API清除CDN缓存。 代理密钥清除的概念与清除一组资源的缓存中所述的概念相同,主要区别在于此处的CDN代理密钥由Edge函数代码设置,而不是由后端设置。
Edge函数获取缓存(内部) fetch-cache
Edge函数获取缓存位于Edge函数及其调用的后端之间。 它会缓存后端对Edge函数代码中发起的fetch()调用的响应。 它还保留您的代码通过 核心缓存API 或 简单缓存API 存储的任何数据 — 这些编程缓存接口为您提供对缓存内容、缓存时间长度和替代键下的细粒度控制。
不是受您在Edge函数的传出响应中设置的标头的影响 — 只受后端的响应标头的影响,受获取调用中的CacheOverride选项的影响,或受您在写入核心缓存API时以编程方式分配的替代密钥的影响。
Surrogate-Key标头可控制浏览器的外部CDN缓存,而不控制此内部缓存。 内部缓存的代理密钥来自后端的Surrogate-Key响应标头或写入核心缓存API时分配的密钥。缓存后端响应 cache-override
要缓存特定持续时间的后端响应,请执行以下操作:
import { CacheOverride } from "fastly:cache-override";
const response = await fetch(request, {
backend: "my-origin",
cacheOverride: new CacheOverride({ ttl: 300 })
});
绕过缓存 cache-pass
要完全绕过提取缓存并始终从后端提取,请使用pass模式:
import { CacheOverride } from "fastly:cache-override";
const response = await fetch(request, {
backend: "my-origin",
cacheOverride: new CacheOverride({ mode: "pass" })
});
缓存清除 cache-purging
当缓存的内容过期时,您需要明确清除该内容。 由于这两个缓存是独立运行的,因此了解您要使哪个层失效以及它们如何交互非常重要。
协调两个层中的清除 coordinating-purges
由于Edge函数作为后端位于CDN之后(可通过源选择器访问),因此清除一个缓存层而不清除另一个缓存层可能会产生意外结果:
- 仅清除CDN缓存会导致下一个请求调用Edge函数。 如果Edge函数的获取缓存仍保留陈旧数据,则会返回旧内容,然后CDN会再次缓存这些内容。
- 仅清除Edge函数缓存将清除内部状态,但CDN将继续提供其以前缓存的副本,直到它过期或被单独清除。
最佳实践:当基础数据更改时,清除 两个 缓存 — 将CDN缓存清除API用于外层,将purge-cache (或purgeSurrogateKey())用于内部Edge功能层。 跨两个层使用一致的代理密钥可简化协调的失效过程。 有关此模式的完整示例,请参阅AEM Edge函数样板 — 清除。
清除CDN缓存 purge-cdn-cache
要清除外部CDN缓存(在CDN层缓存的Edge函数响应),请使用CDN缓存清除API。 这是用于在CDN上缓存的所有AEM as a Cloud Service内容的相同清除机制 — 请参阅如何清除CDN缓存以了解分步指南。
在AEM as a Cloud Service架构中,Edge函数通过原始选择器接收来自CDN的流量(另请参阅CDN路由)。 完整的请求流程为:
Client → AEM CDN (VCL) → Origin Selector → Edge Function → Backend
CDN将缓存Edge函数返回的最终响应。 CDN清除仅清除外部缓存响应的 — 它对Edge函数的内部缓存没有影响。
清除Edge函数提取缓存 purge-fetch-cache
purge-cache CLI命令清除Edge函数提取缓存(在Edge函数中缓存的后端响应)。 它 不 清除外部CDN缓存。 有关完整的CLI选项和标志,请参阅purge-cache命令引用。
代孕钥匙的来源 surrogate-key-origin
清除命令中使用的代理项必须与存储缓存内容时在该内容上标记了的项匹配。 此概念与AEM CDN中使用的基于代理键的清除相同,但应用于Edge函数的内部缓存。 这些密钥来自:
- Edge函数从后端提取时后端返回的
Surrogate-Key响应标头。 - 在写入核心缓存API时以编程方式分配的密钥(例如,在插入缓存条目时通过
surrogateKeys选项)。
例如,如果后端响应为:
HTTP/1.1 200 OK
Content-Type: text/html
Surrogate-Key: page-about product-456 category-shoes
Cache-Control: public, max-age=3600
然后,使用三个替代键标记缓存的响应: page-about、product-456和category-shoes。 您以后可以使用以下任一键清除它:
# Purge all cached content tagged with "product-456"
aio aem edge-functions purge-cache <function-name> --surrogateKey product-456
# Purge multiple keys at once
aio aem edge-functions purge-cache <function-name> -k page-about -k category-shoes
page-about)、内容ID (product-456)或内容类型(category-shoes)。 这使得在内容发生更改时,目标缓存失效变得直观。全部清除 purge-all
# Purge all cached content (use with caution)
aio aem edge-functions purge-cache <function-name> --all
软清除 soft-purge
使用--soft标志执行软清除,在启用过时重新验证的同时保留缓存中的过时条目并减少后端负载:
aio aem edge-functions purge-cache <function-name> --surrogateKey product-456 --soft
程序化清除 programmatic-purge
您还可以使用purgeSurrogateKey以编程方式从Edge函数代码中清除代理键:
import { purgeSurrogateKey } from "fastly:compute";
// Hard purge (immediate removal)
purgeSurrogateKey("product-456");
// Soft purge (retain stale entries for revalidation)
purgeSurrogateKey("product-456", true);
--all标志,并尽可能优先清除目标替代密钥。