CFCF Static Export ProDEMO

缓存与成本:为什么列表实时、单页飞快

三层缓存

层 缓存什么 失效方式
边缘 assets CSS / JS / 字体 / 主题图片 重新部署
Cache API 列表页、侧边栏、RSS TTL / 主动删除
KV 只存 site:ctx 改设置时重建

单页不进缓存层:它本身就是 R2 里的静态文件。

为什么把缓存搬出 KV

KV 的读写便宜,但 list 很贵。

早期版本用 KV 存列表页缓存,清理时要先 list 出所有键再逐个 delete。一次批量删除 500 篇文章,可能产生上千次 list + delete,免费额度很快就满了。

现在:

  • 列表缓存用 Cache API,键是内部 URL,没有列举能力,所以只删已知的固定键(home:page:1、sidebar:data、rss:feed 等),动态分页靠 TTL;
  • KV 只剩 site:ctx 一个键,站点设置快照,30 秒内存缓存 + 变更时主动清;
  • 批量任务进度、permalink 旧键清单从 KV 移到 D1。

结果是:发布/删除文章不再产生任何 KV 操作。

TTL 怎么设

后台 → 设置 → 缓存:

项 建议 说明
列表页 60–300 秒 越小越实时,越大越省 D1
侧边栏 300–3600 秒 分类/标签/归档变化不频繁
RSS 600–3600 秒 阅读器会自己轮询
站点信息 30–60 秒 改设置后最多等这么久

把某一项设为 0 表示关闭缓存、每次直查 D1。调试阶段可以这么做,稳定后建议开回来。

批量操作为什么变快了

旧实现是逐篇串行:查一次、写两次、删 R2 一次,100 篇就是几百次往返。

现在是:

  1. 一次 SELECT ... WHERE wp_id IN (...) 取出所有文章;
  2. 用 db.batch() 分块提交(D1 单次上限 100 条,按 50 切);
  3. R2 操作用并发池(默认 8);
  4. 渲染上下文(站点、侧边栏、模板)整批只取一次。

实测 10 篇删除约 3 秒,5 篇发布约 2.7 秒。

成本大概是多少

以免费额度为准:

  • Workers:10 万请求/天;
  • D1:5GB 存储,读按行计费;
  • R2:10GB 存储,读操作有免费额度;
  • KV:1GB 存储,10 万读/天。

一个日访问几百到几千的个人站,基本跑不出免费额度。真正容易超的是图片流量和高频动态列表,前者可以上 Cloudflare 缓存,后者调大 TTL。

一个容易忽略的点

单页是静态快照。以下操作之后,旧单页不会自动更新:

  • 换风格;
  • 改站点名 / 描述 / 菜单;
  • 改 permalink 结构;
  • 改模板。

需要到「批量任务 → 重建全部单页」跑一遍。列表页不受影响,它们每次请求都重新渲染。

发表评论

邮箱不会被公开。带 * 的为必填项。