AWS
覆盖
增量缓存

此覆盖实现由 OpenNext 提供给 NextServer 的 cache 适配器 (opens in a new tab)使用。当配置中 enableCacheInterception 设为 true 时,OpenNext 也会使用此实现。

它用于检索和更新 ISR/SSG 缓存以及 Next.js 使用的 fetch 缓存。不处理任何与缓存标签相关的功能(即 revalidateTagrevalidatePath)。

如果你想更好地理解如何实现自己的 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_REGIONCACHE_BUCKET_KEY_PREFIXCACHE_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 交互。

工作原理

获取缓存时:

  1. 当请求缓存时,首先检查本地缓存。如果未找到缓存,将从 S3 获取并存储到本地缓存中。
  2. 如果本地缓存存在该键值,会检查 DynamoDB 中的元数据以确认缓存是否仍然有效。如果无效,将从 S3 获取缓存并存储到本地。
  3. 如果本地缓存有效,则直接返回。

更新缓存时:

  1. 当更新缓存时,首先尝试更新 S3 中的缓存。
  2. 如果更新成功,将更新 DynamoDB 中的元数据。
  3. 最后更新本地缓存。
要求
  • 需要向服务器提供以下环境变量:CACHE_BUCKET_REGIONCACHE_BUCKET_KEY_PREFIXCACHE_BUCKET_NAMECACHE_DYNAMO_TABLEAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN,以及可选的 OPEN_NEXT_LOCAL_CACHE_TTL_MSOPEN_NEXT_LOCAL_CACHE_SIZE
  • DynamoDB 表应具有类型为 String 的主键 path 和类型为 String 的排序键 tag。(可以复用默认 tagCache 使用的同一张表)