此覆盖由 OpenNext 提供给 NextServer 的 cache 适配器 (opens in a new tab) 使用。如果在配置中将 enableCacheInterception 设置为 true,OpenNext 也会使用它。
它用于检索和更新 ISR/SSG 缓存以及 Next.js 使用的 fetch 缓存。它不处理任何与缓存标签相关的内容(即 revalidateTag 和 revalidatePath)
如果你想更好地了解如何实现自己的 IncrementalCache,最简单的方法是查看现有的 included IncrementalCache (opens in a new tab)。
需要注意的是,它不是在构建时使用的,仅在运行时使用。这意味着如果你想使用预构建的路由/页面,你必须自己上传缓存(对于 fallback:false 的 ISR/SSG 路由,这是强制性的)。
所有缓存文件都位于 .open-next/cache 文件夹中。BUILD_ID 下的文件用于 ISR/SSG 缓存,__fetch/BUILD_ID 下的文件用于 fetch 缓存。
包含的 IncrementalCache
s3
S3 IncrementalCache 会将 fetch 和 ISR/SSG 缓存存储在 S3 存储桶中。如果你在配置中没有提供任何 IncrementalCache,默认会使用它。
它使用 @aws-sdk/client-s3 与 S3 交互。
要求
- 你需要向服务器提供
CACHE_BUCKET_REGION、CACHE_BUCKET_KEY_PREFIX、CACHE_BUCKET_NAME环境变量。
s3-lite
S3Lite IncrementalCache 会将 fetch 和 ISR/SSG 缓存存储在 S3 存储桶中
此实现是 s3 IncrementalCache 的轻量版本,因为它使用 aws4fetch 与 S3 交互。
要求
- 你需要向服务器提供
CACHE_BUCKET_REGION、CACHE_BUCKET_KEY_PREFIX、CACHE_BUCKET_NAME、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN环境变量。
dummy
Dummy IncrementalCache 是一个虚拟实现,会对每个方法抛出异常。除非你想禁用缓存,否则不应使用它。
fs-dev
FsDev IncrementalCache 是一个简单的实现,将缓存存储在 .open-next/cache 文件夹中,并使用文件系统与之交互。它仅用于开发目的。
要求
它需要在本地文件系统上运行,并预期从 OpenNext 输出目录运行。
multi-tier-ddb-s3
由于其工作方式,此实现仅是最终一致的,更新期间的错误可能导致某些实例中的本地缓存与 S3 缓存之间不一致。
如果在低流量的无服务器环境中使用,它最终可能比更简单的实现更慢(且更昂贵)。
MultiTierDdbS3 IncrementalCache 是一个更复杂的实现。
缓存存储在本地内存 LRU 缓存以及 S3 中。DynamoDB 用于保持服务器多个实例之间的本地缓存同步。
它使用 aws4fetch 与 S3 和 DynamoDB 交互。
工作原理
获取时:
- 当请求缓存时,它首先检查本地缓存。如果未找到缓存,它将从 S3 获取并将其存储在本地缓存中。
- 如果此键存在本地缓存,它将检查 DynamoDB 中的元数据以查看缓存是否仍然有效。如果无效,它将从 S3 获取缓存并将其存储在本地缓存中。
- 如果本地缓存有效,它将返回它。
更新时:
- 当更新缓存时,它将首先尝试更新 S3 中的缓存。
- 如果更新成功,它将更新 DynamoDB 中的元数据。
- 最后,它将更新本地缓存。
要求
- 你需要向服务器提供
CACHE_BUCKET_REGION、CACHE_BUCKET_KEY_PREFIX、CACHE_BUCKET_NAME、CACHE_DYNAMO_TABLE、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN、OPEN_NEXT_LOCAL_CACHE_TTL_MS(可选)、OPEN_NEXT_LOCAL_CACHE_SIZE(可选)环境变量。 - DynamoDB 表应该有一个类型为
String的主键path和一个类型为String的排序键tag。(它可以复用默认tagCache使用的同一张表)