这个覆盖实现由 OpenNext 提供给 NextServer 的 cache 适配器 (opens in a new tab)使用。当配置中 enableCacheInterception 设为 true 时,OpenNext 也会使用它,同时 initializationFunction 也会用它来预填充缓存。
它主要用于处理缓存标签(即 revalidateTag 和 revalidatePath)。它不处理任何与 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_TABLE和CACHE_BUCKET_REGION环境变量 - DynamoDB 表需要有一个主键
path(类型为String)和一个排序键tag(类型为String)(可以复用默认tagCache使用的同一张表)
dynamodb-lite
DynamoDBLite TagCache 会将缓存标签存储在一个 DynamoDB 表中。
这个实现是 dynamodb TagCache 的轻量版本,因为它使用 aws4fetch 来与 DynamoDB 交互。
要求
- 需要为服务器提供
CACHE_DYNAMO_TABLE、CACHE_BUCKET_REGION、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN环境变量 - DynamoDB 表需要有一个主键
path(类型为String)和一个排序键tag(类型为String)(可以复用默认tagCache使用的同一张表)
dynamodb-nextMode
待完善
dummy
Dummy TagCache 是一个会抛出异常的虚拟实现。除非你想禁用缓存标签,否则不应使用它。
fs-dev
FsDev TagCache 是一个简单实现,它将缓存标签存储在 .open-next/cache 文件夹的文件中,并通过文件系统与之交互。仅适用于开发目的。