EmDash 的每請求快取已經在一次頁面渲染期間對相同的讀取進行了去重。可選的物件快取在請求之間保留選定的查詢結果,使後續請求能夠避免相同的資料庫讀取。當公開流量產生的資料庫讀取超出所選後端應處理的量時,它很有用。
資料庫仍然是唯一的事實來源。快取讀取在失敗時回退到資料庫,寫入會使受影響的快取命名空間失效。物件快取預設停用;透過向 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" | 每個快取鍵的前綴。多個站點共用一個命名空間時設定唯一值。 |
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 視窗(預設一秒)。降低 revalidate 以更快的本機傳播為代價增加對快取的讀取;提高它以減少快取讀取頻率。
排程內容
排程條目在其發佈時間過後變得可見。快取頁面在其集合的下一次變更時或快取條目的 defaultTtl 到期時反映新發佈的排程條目。如果精確的排程發佈對你的站點很重要,請設定較低的 defaultTtl。