缓存与成本:为什么列表实时、单页飞快
三层缓存
| 层 | 缓存什么 | 失效方式 |
|---|---|---|
| 边缘 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 篇就是几百次往返。
现在是:
- 一次
SELECT ... WHERE wp_id IN (...)取出所有文章; - 用
db.batch()分块提交(D1 单次上限 100 条,按 50 切); - R2 操作用并发池(默认 8);
- 渲染上下文(站点、侧边栏、模板)整批只取一次。
实测 10 篇删除约 3 秒,5 篇发布约 2.7 秒。
成本大概是多少
以免费额度为准:
- Workers:10 万请求/天;
- D1:5GB 存储,读按行计费;
- R2:10GB 存储,读操作有免费额度;
- KV:1GB 存储,10 万读/天。
一个日访问几百到几千的个人站,基本跑不出免费额度。真正容易超的是图片流量和高频动态列表,前者可以上 Cloudflare 缓存,后者调大 TTL。
一个容易忽略的点
单页是静态快照。以下操作之后,旧单页不会自动更新:
- 换风格;
- 改站点名 / 描述 / 菜单;
- 改 permalink 结构;
- 改模板。
需要到「批量任务 → 重建全部单页」跑一遍。列表页不受影响,它们每次请求都重新渲染。