快取
快取策略
對於 Prisma Client 中的所有讀取查詢,您可以定義 cacheStrategy
參數來配置快取行為。快取策略允許您定義快取的兩個主要特性
- 存活時間 (TTL): 快取回應被視為新鮮的持續時間,以秒為單位。
- 過時重新驗證 (SWR): 在背景重新整理快取時,可接受過時快取回應的持續時間,以秒為單位
存活時間 (TTL)
存活時間 (TTL) 決定快取資料被視為新鮮的時間長度。透過指定以秒為單位的 ttl
,您可以控制快取中資料保持有效的持續時間。當執行讀取查詢時,如果快取的回應在 ttl
限制內,Prisma Client 會從快取中檢索資料,而無需查詢資料庫。如果快取資料不可用或已過期,Prisma Client 會查詢資料庫,並將結果儲存在快取中以供未來請求使用。
在 cacheStrategy
中使用 ttl
並以秒為單位指定查詢的 TTL
await prisma.user.findMany({
cacheStrategy: {
ttl: 60,
},
});
在指定的 60 秒 TTL 下,大多數請求將在整個 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,
},
});
當指定 60 秒的 SWR 時,快取會提供過時資料,直到快取在每次請求後在背景重新整理自身
使 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 可以快速回應請求,並盡可能減少過時資料。雖然它不會減少資料庫負載,但可以顯著縮短回應時間。
使用案例:社群媒體平台中的使用者個人資料
想像一個社群媒體平台,使用者個人資料經常被存取。透過利用 swr
,持續時間設定為 5 分鐘,Accelerate 可以快速提供快取的使用者個人資料資訊,從而縮短個人資料頁面的延遲。同時,在背景中,它會在每次請求後重新整理快取,確保對個人資料所做的任何更新最終都會反映在後續請求中。
何時失效: 如果使用者對其個人資料進行重大更新,例如變更個人資料圖片或個人簡介,則應立即使快取失效,以確保追蹤者看到最新的更新,而無需等待 SWR 重新整理。
使用 TTL + SWR 的快取策略
為了獲得非常快速的回應時間並減少資料庫負載,請同時使用 TTL 和 SWR。您可以使用此策略來微調應用程式對過時資料的容忍度。
在 cacheStrategy
中使用 ttl
和 swr
,並以秒為單位指定查詢的 TTL 和 SWR
await prisma.user.findMany({
cacheStrategy: {
ttl: 30,
swr: 60,
},
});
當指定 30 秒的 TTL 和 60 秒的 SWR 時,快取會在最初的 30 秒內提供新鮮資料。隨後,它會提供過時資料,直到快取在每次請求後在背景重新整理自身
使用案例:新聞文章
考慮一個新聞應用程式,文章經常被存取,但不需要即時更新。透過設定 2 小時的 ttl
和 5 分鐘的 swr
持續時間,Prisma Client 可以快速提供快取的文章,從而縮短讀者的延遲。只要文章在 ttl
範圍內,使用者就會獲得快速回應。在 ttl
過期後,Prisma Client 會繼續提供過時的文章長達額外 5 分鐘,並在回應新查詢時從資料庫重新驗證快取中的最新新聞。這有助於在效能和新鮮度之間保持平衡。
何時失效: 如果發布重大更新或突發新聞文章,則應立即使快取失效,以確保讀者立即看到最新的資訊,而不會延遲。這種方法對於某些新聞項目可能需要覆蓋正常快取週期以確保及時性的應用程式特別有用。
隨需快取失效
如果您的應用程式需要即時或近乎即時的資料,即使在使用較大的 ttl
(存活時間) 或 swr
(過時重新驗證) 快取策略時,快取失效也能確保使用者看到最新的資料。透過使快取失效,您可以繞過延長的快取期間,以便在需要時顯示即時資料。
您可以使用 $accelerate.invalidate
API 使快取失效
若要以程式設計方式使快取查詢失效,需要付費方案。請參閱我們的定價以取得更多詳細資訊。
await prisma.user.findMany({
where: {
email: {
contains: "alice@prisma.io",
},
},
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 會將所有查詢透過靠近資料庫區域的連線池執行個體路由到資料庫。