EmDash 在每次请求时从数据库读取内容和站点配置。对象缓存将这些查询结果存储在快速的键/值存储中,使得重复请求从缓存而非数据库中提供。它减少了数据库的读取负载 — 在 Cloudflare 上特别有用,KV 每秒能服务的请求远多于 D1。
对象缓存是可选的,默认禁用。通过向 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。
新鲜度
通过管理面板或 REST API 编辑内容会自动使受影响的缓存条目失效。创建、更新、发布或删除条目会清除其集合的缓存查询;更改署名或分类法术语会清除显示它的条目。
对于匿名访问者,更改需要一些时间才能在所有隔离区中显示,因为它们需要获取更新的纪元。使用隔离区内内存后端时这是即时的。使用 Workers KV 时,受 KV 的边缘缓存传播(最终一致性,最多约 60 秒)加上隔离区本地的 revalidate 窗口(默认 1 秒)的限制。降低 revalidate 可加快本地传播但增加缓存读取次数;提高它可减少缓存读取频率。
定时内容
定时条目在其发布时间过后变为可见。缓存页面在其集合的下一次更改时,或当缓存条目的 defaultTtl 过期时,反映新发布的定时条目。如果精确的定时发布对你的站点很重要,请设置较低的 defaultTtl。