配置对象缓存

本页内容

EmDash 的每请求缓存已经在一次页面渲染期间对相同的读取进行了去重。可选的对象缓存在请求之间保留选定的查询结果,使后续请求能够避免相同的数据库读取。当公共流量产生的数据库读取超出所选后端应处理的量时,它很有用。

数据库仍然是唯一的事实来源。缓存读取在失败时回退到数据库,写入会使受影响的缓存命名空间失效。对象缓存默认禁用;通过向 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

对象缓存和 HTML 边缘缓存解决不同的问题。HTML 层的缓存未命中仍然执行 Worker;对象缓存可以防止重复的内容查询。HTML 层的缓存命中则完全不执行 EmDash。

新鲜度

通过管理面板或 REST API 编辑内容会自动使受影响的缓存条目失效。创建、更新、发布或删除条目会清除其集合的缓存查询;更改作者名或分类术语会清除显示它的条目。

对于匿名访客,随着各隔离获取更新的纪元,更改需要一段时间才能在所有隔离中显示。使用隔离内内存后端这是即时的。使用 Workers KV 时,受限于 KV 的边缘缓存传播(最终一致性,最多约 60 秒)加上隔离本地的 revalidate 窗口(默认一秒)。降低 revalidate 以更快的本地传播为代价增加对缓存的读取;提高它以减少缓存读取频率。

计划内容

计划条目在其发布时间过后变得可见。缓存页面在其集合的下一次更改时或缓存条目的 defaultTtl 到期时反映新发布的计划条目。如果精确的计划发布对你的站点很重要,请设置较低的 defaultTtl