这个覆盖实现由 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
文件夹的文件中,并通过文件系统与之交互。仅适用于开发目的。