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。