メインコンテンツにスキップ

キャッシング

キャッシュ戦略

Prisma Client のすべての読み取りクエリに対して、キャッシュの動作を設定する cacheStrategy パラメータを定義できます。キャッシュ戦略では、キャッシュの 2 つの主な特性を定義できます。

  • Time-to-live (TTL): キャッシュされたレスポンスが新鮮と見なされる秒単位の期間。
  • Stale-while-Revalidating (SWR): キャッシュがバックグラウンドでリフレッシュされている間、古いキャッシュレスポンスが許容可能と見なされる秒単位の期間

Time-to-live (TTL)

Time-to-Live (TTL) は、キャッシュされたデータが新鮮と見なされる期間を決定します。秒単位で ttl を指定することにより、キャッシュ内のデータが有効な期間を制御できます。読み取りクエリが実行されると、キャッシュされたレスポンスが ttl の制限内であれば、Prisma Client はデータベースにクエリを実行せずにキャッシュからデータを取得します。キャッシュされたデータが利用できない場合、または期限切れになっている場合、Prisma Client はデータベースにクエリを実行し、将来のリクエストのために結果をキャッシュに保存します。

cacheStrategyttl を使用し、クエリの TTL を秒単位で指定します

await prisma.user.findMany({
cacheStrategy: {
ttl: 60,
},
});

TTL を 60 秒に指定すると、ほとんどのリクエストは TTL 期間全体でキャッシュヒットになります

TTL

TTL は、頻繁な更新を必要としないデータのデータベース負荷とレイテンシを削減するのに役立ちます。

TTL を無効にして、キャッシュされたクエリ結果を最新の状態に保ちます

アプリケーションがリアルタイムまたはほぼリアルタイムのデータを必要とする場合、キャッシュの無効化により、大きな ttl (Time-To-Live) を使用している場合でも、ユーザーは最新のデータを確実に確認できます。キャッシュを無効にすることで、延長されたキャッシュ期間をバイパスして、必要なときにいつでもライブデータを表示できます。

たとえば、ダッシュボードに顧客情報が表示され、顧客の連絡先の詳細が変更された場合、TTL (Time-To-Live) 設定により、キャッシュは設定された期間後に自動的に期限切れになります。これにより、システムは次回のアクセス時に更新されたデータのみをリフレッシュできるため、サポートスタッフはキャッシュを手動でリフレッシュすることなく、常に最新の情報を確認できます。

ただし、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"],
});

Stale-While-Revalidate (SWR)

Stale-While-Revalidate (SWR) を使用すると、Accelerate がバックグラウンドで新しいデータをフェッチしている間、古いキャッシュデータをどのくらいの期間提供できるかを制御できます。読み取りクエリが実行されると、Accelerate はキャッシュされたレスポンスの経過時間を swr 期間と比較して確認します。キャッシュデータが swr の制限内にある場合、Accelerate は古いデータを提供すると同時に、データベースから最新のデータをフェッチしてキャッシュをリフレッシュします。

cacheStrategyswr を使用し、クエリの SWR を秒単位で指定します

await prisma.user.findMany({
cacheStrategy: {
swr: 60,
},
});

SWR を 60 秒に指定すると、キャッシュは各リクエスト後にバックグラウンドでキャッシュ自体をリフレッシュするまで古いデータを提供します

SWR

SWR を無効にして、キャッシュされたクエリ結果を最新の状態に保ちます

アプリケーションがリアルタイムまたはほぼリアルタイムのデータを必要とする場合、キャッシュの無効化により、大きな swr (Stale-While-Revalidate) を使用している場合でも、ユーザーは最新のデータを確実に確認できます。キャッシュを無効にすることで、延長されたキャッシュ期間をバイパスして、必要なときにいつでもライブデータを表示できます。

たとえば、倉庫内の製品の在庫レベルを表示するダッシュボードを考えてみましょう。SWR (Stale-While-Revalidate) 設定を使用すると、ダッシュボードは、わずかに古い場合でも、最後に既知の在庫データをすぐに表示でき、新しいデータはバックグラウンドでフェッチされます。これにより、スタッフは待つことなく最新の情報を使用して作業を継続でき、再検証が完了するとすぐに在庫レベルが更新されます。

ただし、在庫データ​​をすぐに更新する必要がある場合、たとえば、製品の在庫が少なく、リアルタイムの精度が必要な場合など、キャッシュの無効化により、システムはキャッシュから特定のデータをプロアクティブにクリアできます。これにより、最新の在庫データ​​が即座にリフレッシュされるため、スタッフは 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"],
});

キャッシュ戦略の選択

キャッシングは、クエリの応答時間を改善し、データベースの負荷を軽減するのに役立ちます。ただし、古いデータをクライアントに提供する可能性があることも意味します。古いデータの提供が許容できるかどうか、またどの程度まで許容できるかは、ユースケースによって異なります。ttlswr は、キャッシュの動作を微調整するために使用できるパラメータです。

TTL を使用したキャッシュ戦略

古いキャッシュデータが許容できる場合は、TTL を使用してデータベースの負荷を軽減します。

ユースケース: e コマースアプリケーションの製品カタログ

頻繁に変更されない製品カタログを備えた e コマースアプリケーションを考えてみましょう。たとえば、1 時間の ttl を設定すると、Prisma Client はその時間内に後続のユーザーリクエストに対してキャッシュされた製品データを提供でき、データベースにアクセスする必要はありません。これにより、データベースの負荷が大幅に軽減され、製品リストページの応答時間が向上します。

無効にするタイミング: 主要な価格変更や製品の在庫状況の調整など、カタログに重要な更新がある場合は、顧客に古い情報が表示されないように、キャッシュをすぐに無効にする必要があります。

SWR を使用したキャッシュ戦略

最小限の古いデータでリクエストに迅速に応答するには、SWR を使用します。データベースの負荷は軽減されませんが、応答時間を大幅に改善できます。

ユースケース: ソーシャルメディアプラットフォームのユーザープロファイル

ユーザープロファイルへのアクセスが頻繁に行われるソーシャルメディアプラットフォームを想像してみてください。たとえば、5 分の期間で swr を活用することにより、Accelerate はキャッシュされたユーザープロファイル情報を迅速に提供し、プロファイルページのレイテンシを短縮できます。一方、バックグラウンドでは、リクエストごとにキャッシュをリフレッシュし、プロファイルに加えられた更新が後続のリクエストに最終的に反映されるようにします。

無効にするタイミング: ユーザーがプロファイル写真や自己紹介を変更するなど、プロファイルに重要な更新を加えた場合、フォロワーが SWR リフレッシュを待たずに最新の更新を確認できるように、キャッシュをすぐに無効にする必要があります。

TTL + SWR を使用したキャッシュ戦略

非常に高速な応答時間とデータベース負荷の軽減を実現するには、TTL と SWR の両方を使用します。この戦略を使用して、アプリケーションの古いデータに対する許容度を微調整できます。

cacheStrategyttlswr を使用し、クエリの TTL と SWR を秒単位で指定します

await prisma.user.findMany({
cacheStrategy: {
ttl: 30,
swr: 60,
},
});

TTL を 30 秒、SWR を 60 秒に指定すると、キャッシュは最初の 30 秒間は新鮮なデータを提供します。その後、各リクエスト後にバックグラウンドでキャッシュ自体をリフレッシュするまで、古いデータを提供します

ttl_and_swr.png

ユースケース: ニュース記事

記事へのアクセスが頻繁に行われるが、リアルタイムの更新を必要としないニュースアプリケーションを考えてみましょう。ttl を 2 時間、swr 期間を 5 分に設定すると、Prisma Client はキャッシュされた記事を迅速に提供し、読者のレイテンシを短縮できます。記事が ttl 内にある限り、ユーザーは高速な応答を得られます。ttl の期限が切れた後も、Prisma Client はさらに 5 分間古い記事を提供し続け、新しいクエリへの応答としてデータベースからの最新ニュースでキャッシュを再検証します。これは、パフォーマンスと鮮度のバランスを維持するのに役立ちます。

無効にするタイミング: 重大な更新や速報ニュース記事が公開された場合、読者が遅延なく最新の情報を確認できるように、キャッシュをすぐに無効にする必要があります。このアプローチは、特定のニュース項目がタイムリーに通常のキャッシュサイクルをオーバーライドする必要があるアプリケーションで特に役立ちます。

オンデマンドキャッシュの無効化

アプリケーションがリアルタイムまたはほぼリアルタイムのデータを必要とする場合、キャッシュの無効化により、大きな ttl (Time-To-Live) または swr (Stale-While-Revalidate) キャッシュ戦略を使用している場合でも、ユーザーは最新のデータを確実に確認できます。キャッシュを無効にすることで、延長されたキャッシュ期間をバイパスして、必要なときにいつでもライブデータを表示できます。

$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 は、データベースリージョン付近のコネクションプールインスタンスを介してすべてのクエリをデータベースにルーティングします。