EmDashはリクエストごとにデータベースからコンテンツとサイト設定を読み取ります。オブジェクトキャッシュはこれらのクエリ結果を高速なキー/バリューストアに保存するため、繰り返しのリクエストはデータベースの代わりにキャッシュから提供されます。データベースへの読み取り負荷を軽減します — Cloudflareでは、KVがD1よりもはるかに多くのリクエスト/秒を処理できるため特に有用です。
オブジェクトキャッシュはオプションで、デフォルトでは無効です。emdash()インテグレーションにobjectCacheアダプターを追加して有効にします。
概要
| バックエンド | 最適な用途 | アイソレート間で共有 |
|---|---|---|
| KV | Cloudflare Workers | はい |
| Memory | Node.js、ローカル開発 | いいえ(プロセスごと) |
Cloudflareでは、リクエストはリージョンをまたがる多数の短命なアイソレートによって処理されます。KVはすべてのアイソレート間で共有されるため、1つのリクエストでキャッシュされた値は次のリクエストでどこでも利用可能です。メモリバックエンドは単一プロセス内でキャッシュし、長時間稼働する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へのデプロイを参照してください。
鮮度
管理パネルまたはREST APIを通じてコンテンツを編集すると、影響を受けるキャッシュエントリが自動的に無効化されます。エントリの作成、更新、公開、削除はそのコレクションのキャッシュされたクエリをクリアします。署名やタクソノミー用語の変更は、それを表示するエントリをクリアします。
匿名の訪問者にとって、変更がすべてのアイソレートに反映されるには、各アイソレートが更新されたエポックを取得するまで時間がかかります。アイソレート内メモリバックエンドではこれは即座です。Workers KVでは、KVのエッジキャッシュ伝搬(結果整合性、最大約60秒)に加えてアイソレートローカルのrevalidateウィンドウ(デフォルト1秒)で制限されます。revalidateを下げるとローカル伝搬が速くなりますがキャッシュへの読み取りが増えます。上げるとキャッシュの読み取り頻度が下がります。
スケジュールされたコンテンツ
スケジュールされたエントリは、公開時刻が過ぎると表示されます。キャッシュされたページは、そのコレクションへの次の変更時、またはキャッシュされたエントリのdefaultTtlが期限切れになった時に、新しく公開されたスケジュール済みエントリを反映します。サイトで正確なスケジュール公開が重要な場合は、defaultTtlを低く設定してください。