此覆盖实现由 OpenNext 提供给 NextServer 的 cache
适配器 (opens in a new tab)使用。当配置中 enableCacheInterception
设为 true
时,OpenNext 也会使用此实现。
它用于检索和更新 ISR/SSG 缓存以及 Next.js 使用的 fetch 缓存。不处理任何与缓存标签相关的功能(即 revalidateTag
和 revalidatePath
)。
如果你想更好地理解如何实现自己的 IncrementalCache,最简单的方法是查看现有的 内置 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
使用的同一张表)