AWS
覆盖
标签缓存

这个覆盖实现由 OpenNext 提供给 NextServer 的 cache 适配器 (opens in a new tab)使用。当配置中 enableCacheInterception 设为 true 时,OpenNext 也会使用它,同时 initializationFunction 也会用它来预填充缓存。

它主要用于处理缓存标签(即 revalidateTagrevalidatePath)。它不处理任何与 ISR/SSG 缓存或 Next.js 使用的 fetch 缓存相关的内容。 其主要作用是判断路径是否过期(基于标签),以及在调用 revalidateTag 时更新标签缓存。

当前实现与 Next.js standalone 处理缓存标签的方式不同。在 standalone 版本中,缓存标签存储在文件中,每次访问缓存条目时都需要检查每个标签是否过期。这种方法读取压力很大,不适合 DynamoDB 这样的数据库。 我们选择了另一种方式:为缓存中存在的每个路径存储标签。这样只需检查路径本身就能轻松判断是否过期,而不需要检查使用的每个标签。这种方式写入压力更大,但这是我们愿意做出的权衡。 这种方式的缺点是需要用 initializationFunction 预填充应用中使用的所有标签。

未来我们可能会根据 TagCache 的实现允许选择如何处理缓存标签。如果你需要此功能,欢迎在 GitHub 仓库 (opens in a new tab) 提交 issue。

如果你想更好地理解如何实现自己的 TagCache,最简单的方法是查看现有的 内置 TagCache (opens in a new tab)

内置 TagCache

dynamodb

DynamoDB TagCache 会将缓存标签存储在一个 DynamoDB 表中。如果配置中没有提供任何 TagCache,默认会使用此实现。 它使用 @aws-sdk/client-dynamodb 来与 DynamoDB 交互。

要求
  • 需要为服务器提供 CACHE_DYNAMO_TABLECACHE_BUCKET_REGION 环境变量
  • DynamoDB 表需要有一个主键 path(类型为 String)和一个排序键 tag(类型为 String)(可以复用默认 tagCache 使用的同一张表)

dynamodb-lite

DynamoDBLite TagCache 会将缓存标签存储在一个 DynamoDB 表中。 这个实现是 dynamodb TagCache 的轻量版本,因为它使用 aws4fetch 来与 DynamoDB 交互。

要求
  • 需要为服务器提供 CACHE_DYNAMO_TABLECACHE_BUCKET_REGIONAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 环境变量
  • DynamoDB 表需要有一个主键 path(类型为 String)和一个排序键 tag(类型为 String)(可以复用默认 tagCache 使用的同一张表)

dynamodb-nextMode

待完善

dummy

Dummy TagCache 是一个会抛出异常的虚拟实现。除非你想禁用缓存标签,否则不应使用它。

fs-dev

FsDev TagCache 是一个简单实现,它将缓存标签存储在 .open-next/cache 文件夹的文件中,并通过文件系统与之交互。仅适用于开发目的。