缓存
缓存策略
对于 Prisma Client 中的所有读取查询,您可以定义 `cacheStrategy` 参数来配置缓存行为。缓存策略允许您定义缓存的两个主要特征
- **生存时间 (TTL):**缓存响应被认为是“新鲜”的持续时间(以秒为单位)。
- **失效时重新验证 (SWR):**缓存响应失效但仍然可以接受的持续时间(以秒为单位),在此期间缓存会在后台刷新。
生存时间 (TTL)
生存时间 (TTL) 决定缓存数据被视为新鲜的时长。通过以秒为单位指定 `ttl`,您可以控制缓存中的数据保持有效的时间段。当执行读取查询时,如果缓存响应在 `ttl` 限制内,Prisma Client 会从缓存中检索数据,而无需查询数据库。如果缓存数据不可用或已过期,Prisma Client 会查询数据库并将结果存储在缓存中,以供将来请求使用。
在 `cacheStrategy` 中使用 `ttl` 并以秒为单位指定查询的 TTL
await prisma.user.findMany({
cacheStrategy: {
ttl: 60,
},
});
在指定 TTL 为 60 秒的情况下,大多数请求将在整个 TTL 持续时间内命中缓存。
TTL 有助于减少数据库负载并降低不需要频繁更新的数据的延迟。
使 TTL 失效并保持缓存的查询结果最新
如果您的应用程序需要实时或接近实时的数据,则缓存失效可确保用户看到最新的数据,即使使用较大的 `ttl`(生存时间)。通过使缓存失效,您可以绕过扩展的缓存时间段,以便在需要时显示实时数据。
例如,如果仪表板显示客户信息,并且客户的联系方式发生更改,则 TTL(生存时间)设置可确保缓存在设定的持续时间后自动过期。这允许系统仅在下次访问时刷新更新的数据,确保支持人员始终看到最新的信息,而无需手动刷新缓存。
但是,在需要在 TTL 过期之前立即更新数据的情况下,缓存失效允许系统主动清除缓存中的特定数据。这会立即强制刷新更新的信息,以便支持人员始终拥有最新的详细信息,而无需等待 TTL 触发。
要使缓存的查询结果失效,您可以添加标签,然后使用 `$accelerate.invalidate` API。
按需缓存失效功能在我们的付费计划中提供。有关更多详细信息,请参阅我们的 定价。
要使以下查询失效,您需要在 `$accelerate.invalidate` API 中提供缓存标签
await prisma.user.findMany({
cacheStrategy: {
ttl: 60,
tags: ["findMany_users"],
},
});
// This is how you would invalidate the cached query above.
await prisma.$accelerate.invalidate({
tags: ["findMany_users"],
});
失效时重新验证 (SWR)
失效时重新验证 (SWR) 允许您控制 Accelerate 在后台获取最新数据时可以服务失效缓存数据的时长。当执行读取查询时,Accelerate 会根据 `swr` 持续时间检查缓存响应的年龄。如果缓存数据在 `swr` 限制内,Accelerate 会服务失效数据,同时通过从数据库获取最新数据来刷新缓存。
在 `cacheStrategy` 中使用 `swr` 并以秒为单位指定查询的 SWR
await prisma.user.findMany({
cacheStrategy: {
swr: 60,
},
});
在指定 SWR 为 60 秒的情况下,缓存会在每次请求后在后台刷新自身之前服务失效数据。
使 SWR 失效并保持缓存的查询结果最新
如果您的应用程序需要实时或接近实时的数据,则缓存失效可确保用户看到最新的数据,即使使用较大的 `swr`(失效时重新验证)。通过使缓存失效,您可以绕过扩展的缓存时间段,以便在需要时显示实时数据。
例如,考虑一个仪表板,该仪表板显示仓库中产品的库存水平。使用 SWR(失效时重新验证)设置,仪表板可以立即显示上次已知的库存数据,即使它稍微过时了,同时在后台获取新数据。这确保了员工可以继续使用最新信息而无需等待,并且库存水平将在重新验证完成后立即更新。
但是,在需要立即更新库存数据的情况下(例如,如果某个产品的库存量不足并且需要实时准确性),缓存失效允许系统主动清除缓存中的特定数据。这会立即强制刷新最新的库存数据,以便员工始终拥有最新的信息,而无需等待 SWR 完成重新验证。
要使缓存的查询结果失效,您可以添加标签,然后使用 `$accelerate.invalidate` API。
按需缓存失效功能在我们的付费计划中提供。有关更多详细信息,请参阅我们的 定价。
要使以下查询失效,您需要在 `$accelerate.invalidate` API 中提供缓存标签
await prisma.user.findMany({
cacheStrategy: {
swr: 60,
tags: ["findMany_users"],
},
});
// This is how you would invalidate the cached query above.
await prisma.$accelerate.invalidate({
tags: ["findMany_users"],
});
选择缓存策略
缓存有助于您提高查询响应时间并减少数据库负载。但是,这也意味着您可能会向客户端提供失效的数据。提供失效数据是否可以接受以及在何种程度上取决于您的用例。`ttl` 和 `swr` 是您可以用来调整缓存行为的参数。
使用 TTL 的缓存策略
当失效的缓存数据可以接受时,使用 TTL 来减少数据库负载。
用例:电子商务应用程序中的产品目录
考虑一个电子商务应用程序,其中产品目录不会频繁更改。通过将 `ttl` 设置为例如 1 小时,Prisma Client 可以在该小时内为后续用户请求提供缓存的产品数据,而无需访问数据库。这大大减少了数据库负载并提高了产品列表页面的响应时间。
**何时失效:**如果目录有重大更新,例如重大价格变动或产品可用性调整,则应立即使缓存失效,以防止客户看到过时信息。
使用 SWR 的缓存策略
使用 SWR 以最少的失效数据快速响应请求。虽然它不会减少数据库负载,但它可以显着提高响应时间。
用例:社交媒体平台中的用户资料
想象一个社交媒体平台,用户资料经常被访问。通过使用持续时间为例如 5 分钟的 `swr`,Accelerate 可以快速提供缓存的用户资料信息,从而减少资料页面的延迟。同时,它在每次请求后在后台刷新缓存,确保对资料所做的任何更新最终都会反映在后续请求中。
**何时失效:**如果用户对其资料进行了重大更新,例如更改其头像或个人简介,则应立即使缓存失效,以确保关注者在无需等待 SWR 刷新即可查看最新的更新。
使用 TTL + SWR 的缓存策略
为了获得非常快的响应时间和减少的数据库负载,请同时使用 TTL 和 SWR。您可以使用此策略来微调应用程序对失效数据的容忍度。
在 `cacheStrategy` 中使用 `ttl` 和 `swr` 并以秒为单位指定查询的 TTL 和 SWR
await prisma.user.findMany({
cacheStrategy: {
ttl: 30,
swr: 60,
},
});
在指定 TTL 为 30 秒和 SWR 为 60 秒的情况下,缓存会在最初的 30 秒内提供新鲜数据。随后,它会在每次请求后在后台刷新自身之前提供失效数据。
用例:新闻文章
考虑一个新闻应用程序,其中文章被频繁访问,但不需要实时更新。通过设置 2 小时的ttl
和 5 分钟的swr
持续时间,Prisma Client 可以快速提供缓存的文章,减少读者延迟。只要文章在ttl
范围内,用户就能获得快速响应。在ttl
过期后,Prisma Client 继续提供过期的文章,最多额外 5 分钟,并在响应新查询时使用数据库中的最新新闻重新验证缓存。这有助于在性能和新鲜度之间取得平衡。
何时失效:如果发布了重要的更新或突发新闻文章,则应立即使缓存失效,以确保读者能够及时看到最新信息,不会出现延迟。这种方法对于某些新闻项目可能需要覆盖正常缓存周期以保证及时性的应用程序特别有用。
按需缓存失效
如果您的应用程序需要实时或接近实时数据,则缓存失效可确保用户即使使用较大的ttl
(生存时间)或swr
(失效时重新验证)缓存策略也能看到最新的数据。通过使缓存失效,您可以绕过扩展的缓存周期,在需要时显示实时数据。
您可以使用$accelerate.invalidate
API使缓存失效。
要以编程方式使缓存查询失效,需要付费计划。请参阅我们的定价了解更多详情。
await prisma.user.findMany({
where: {
email: {
contains: "[email protected]",
},
},
cacheStrategy: {
swr: 60,
ttl: 60,
tags: ["emails_with_alice"],
},
});
您需要在$accelerate.invalidate
API 中提供缓存标签。
try {
await prisma.$accelerate.invalidate({
tags: ["emails_with_alice"],
});
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError) {
// The .code property can be accessed in a type-safe manner
if (e.code === "P6003") {
console.log(
"The cache invalidation rate limit has been reached. Please try again later."
);
}
}
throw e;
}
探索演示应用程序,了解 Prisma Accelerate 中缓存的查询结果如何按需失效,并在清晰的时间轴上显示。
默认缓存策略
为了避免出现意外问题,Accelerate 默认情况下不使用缓存。虽然缓存可以提高性能,但使用不当可能会导致错误。
例如,如果在关键路径上执行查询而未指定缓存策略,则结果可能不正确,并且没有明确的解释。此问题通常出现在意外启用隐式缓存时。
为了避免此类问题,您必须明确选择加入缓存。这确保您知道默认情况下未启用缓存,从而防止潜在的错误。
当未指定缓存策略或发生缓存未命中时,具有 Accelerate 扩展的 Prisma Client 会通过数据库区域附近的连接池实例将所有查询路由到数据库。