物件快取

本頁內容

EmDash 在每次請求時從資料庫讀取內容和網站設定。物件快取將這些查詢結果儲存在快速的鍵/值儲存中,使得重複請求從快取而非資料庫中提供。它減少了資料庫的讀取負載 — 在 Cloudflare 上特別有用,KV 每秒能服務的請求遠多於 D1。

物件快取是選擇性的,預設停用。透過向 emdash() 整合新增 objectCache 配接器來啟用它。

概覽

後端最適合跨隔離區共享
KVCloudflare Workers
MemoryNode.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>"

選項

選項型別預設值說明
bindingstringWrangler 設定中的 KV 繫結名稱。必填。
defaultTtlnumber3600快取項目的存活時間(秒)。KV 強制最低 60 秒。
revalidatenumber1000隔離區本地的紀元重用視窗(毫秒)。參見新鮮度
timeoutnumber2000等待 KV 操作的最大時間(毫秒),逾時後視為快取未命中。防止停滯的 KV 讀取掛起請求。設為 0 停用。
keyPrefixstring"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(),
		}),
	],
});

選項

選項型別預設值說明
defaultTtlnumber3600快取項目的存活時間(秒)。
revalidatenumber1000隔離區本地的紀元重用視窗(ms)。
maxEntriesnumber1000舊鍵被驅逐前的最大快取鍵數。
keyPrefixstring"em"每個快取鍵的前綴。

快取的內容

物件快取涵蓋典型頁面渲染時執行的讀取:

  • 內容查詢:getEmDashCollectiongetEmDashEntryresolveEmDashPath
  • 網站設定、導覽選單和分類法術語。

管理 API 請求、媒體檔案和完整 HTML 回應不在此處理。要在邊緣快取渲染的 HTML,請參見部署到 Cloudflare

新鮮度

透過管理面板或 REST API 編輯內容會自動使受影響的快取項目失效。建立、更新、發佈或刪除項目會清除其集合的快取查詢;變更署名或分類法術語會清除顯示它的項目。

對於匿名訪客,變更需要一些時間才能在所有隔離區中顯示,因為它們需要取得更新的紀元。使用隔離區內記憶體後端時這是即時的。使用 Workers KV 時,受 KV 的邊緣快取傳播(最終一致性,最多約 60 秒)加上隔離區本地的 revalidate 視窗(預設 1 秒)的限制。降低 revalidate 可加快本地傳播但增加快取讀取次數;提高它可減少快取讀取頻率。

排程內容

排程項目在其發佈時間過後變為可見。快取頁面在其集合的下一次變更時,或當快取項目的 defaultTtl 過期時,反映新發佈的排程項目。如果精確的排程發佈對你的網站很重要,請設定較低的 defaultTtl