对象缓存

本页内容

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