EmDash のリクエストごとのキャッシュは、1 つのページレンダリング中に同一の読み取りをすでに重複排除しています。オプションのオブジェクトキャッシュは、リクエストをまたいで選択されたクエリ結果を保持し、後のリクエストが同じデータベース読み取りを回避できるようにします。パブリックトラフィックが選択したバックエンドが処理すべき以上のデータベース読み取りを生成する場合に便利です。
データベースが唯一の真実の情報源であり続けます。キャッシュ読み取りはデータベースにフォールバックし、書き込みは影響を受けるキャッシュ名前空間を無効化します。オブジェクトキャッシュはデフォルトで無効です。emdash() インテグレーションに objectCache アダプターを追加して有効にします。
概要
| バックエンド | 最適な用途 | アイソレート間で共有 |
|---|---|---|
| KV | Cloudflare Workers | はい |
| Memory | Node.js、ローカル開発 | いいえ(プロセスごと) |
Cloudflare では、リクエストは複数のリージョンにわたる多数の短命なアイソレートによって処理されます。KV はすべてで共有されるため、あるリクエストでキャッシュされた値は次のリクエストでどこからでも利用できます。メモリバックエンドは単一プロセス内でキャッシュし、長時間実行する Node.js サーバーに適しています。
Cloudflare KV
KV アダプターを設定し、KV バインディングに向けます:
import emdash from "emdash/astro";
import { d1, r2, kvCache } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
storage: r2({ binding: "MEDIA" }),
objectCache: kvCache({ binding: "CACHE" }),
}),
],
});
セットアップ
KV 名前空間を作成し、Wrangler 設定にバインディングを追加します。
npx wrangler kv namespace create CACHE
コマンドは名前空間の id を出力します。kvCache で使用したバインディング名の下に追加します:
wrangler.jsonc
{
"kv_namespaces": [
{
"binding": "CACHE",
"id": "<namespace-id>"
}
]
} wrangler.toml
[[kv_namespaces]]
binding = "CACHE"
id = "<namespace-id>" オプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
binding | string | — | Wrangler 設定の KV バインディング名。必須。 |
defaultTtl | number | 3600 | キャッシュエントリの有効期間(秒)。KV は最低 60 秒を強制します。 |
revalidate | number | 1000 | アイソレートローカルのエポック再利用ウィンドウ(ミリ秒)。鮮度を参照。 |
timeout | number | 2000 | KV 操作を待つ最大時間(ミリ秒)。超えるとキャッシュミスとして扱われます。KV 読み取りの停滞によるリクエストのハングを防ぎます。0 で無効化。 |
keyPrefix | string | "em" | すべてのキャッシュキーのプレフィックス。複数のサイトが 1 つの名前空間を共有する場合は一意の値を設定。 |
Node.js(メモリ)
メモリアダプターはサーバープロセス内でキャッシュします。外部サービスは不要です:
import emdash, { memoryCache } from "emdash/astro";
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
objectCache: memoryCache(),
}),
],
});
オプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
defaultTtl | number | 3600 | キャッシュエントリの有効期間(秒)。 |
revalidate | number | 1000 | アイソレートローカルのエポック再利用ウィンドウ(ms)。 |
maxEntries | number | 1000 | 古いキーが退出される前のキャッシュキーの最大数。 |
keyPrefix | string | "em" | すべてのキャッシュキーのプレフィックス。 |
キャッシュされるもの
オブジェクトキャッシュは、典型的なページレンダリングで実行される読み取りをカバーします:
- コンテンツクエリ:
getEmDashCollection、getEmDashEntry、resolveEmDashPath。 - サイト設定、ナビゲーションメニュー、タクソノミー用語。
管理 API リクエスト、メディアファイル、完全な HTML レスポンスはここでは処理されません。レンダリング済み HTML をエッジでキャッシュする場合は、Cloudflare へのデプロイを参照してください。
オブジェクトキャッシュと HTML エッジキャッシュは異なる問題を解決します。HTML レイヤーでのキャッシュミスでも Worker は実行されます。その場合、オブジェクトキャッシュが繰り返しのコンテンツクエリを防ぐことができます。HTML レイヤーでのキャッシュヒットでは EmDash はまったく実行されません。
鮮度
管理パネルまたは REST API を通じてコンテンツを編集すると、影響を受けるキャッシュエントリが自動的に無効化されます。エントリの作成、更新、公開、削除は、そのコレクションのキャッシュされたクエリをクリアします。著者名やタクソノミー用語を変更すると、それを表示するエントリがクリアされます。
匿名訪問者の場合、すべてのアイソレートが更新されたエポックを取得するまで変更が表示されるまでに時間がかかります。アイソレート内メモリバックエンドでは即座です。Workers KV では、KV のエッジキャッシュ伝播(結果整合性、最大約 60 秒)とアイソレートローカルの revalidate ウィンドウ(デフォルト 1 秒)によって制限されます。キャッシュに対する読み取りが増えるコストで、より速いローカル伝播のために revalidate を下げます。キャッシュをあまり読まないために上げます。
スケジュールコンテンツ
スケジュールされたエントリは公開時間が来ると表示されます。キャッシュされたページは、そのコレクションへの次の変更時、またはキャッシュされたエントリの defaultTtl が経過した時に、新しく公開されたスケジュールエントリを反映します。正確なスケジュール公開がサイトで重要な場合は、より低い defaultTtl を設定してください。