OpenNext + Workers KV 跑 Next.js ISR:缓存为什么永不过期,以及怎样给它封顶
Meathill 把自己站点的 KV 存储超额追到 OpenNext 的 KV 增量缓存:写入不带 TTL,且每次部署按 Build ID 前缀留下一整份快照;文章给出他重建缓存生命周期的做法。
- 适用产品
- WorkersKV
- 来源
- 作者经验Meathill 的博客
- 作者
- Meathill(@meathill1)
要点
- 作者发现 OpenNext 的 KV 增量缓存调用 kv.put() 时没有传 expirationTtl(源码里仍留着关于 KV TTL 的 TODO),页面的 revalidate 并不会让 KV 条目过期。
- 每次 opennextjs-cloudflare deploy 都会执行 populateCache,把所有预渲染页面的 HTML 与 RSC Payload 以新的 Build ID 为前缀批量写入;旧前缀不再被读取却一直留存。数十次发布后他的命名空间涨到 24 GB,计费周期显示存储 3.59 GB-month。
- 他的处理:换用新命名空间并删除旧命名空间;包装缓存,让每次写入都带 expirationTtl = min(7 天, max(60 秒, 2 × revalidate));并给批量写入步骤补上 expiration_ttl 604800。
- 官方 KV 文档(2026-10-14 复核):Workers Paid 含 1 GB 存储,超出后每 GB-month 0.50 美元;REST 批量写入里每个键各算一次写入;expirationTtl 最小 60 秒,过期删除的键不再计入存储。
原始来源
发布
OpenNext + Workers KV 跑 Next.js ISR:缓存为什么永不过期,以及怎样给它封顶
打开原始来源Meathill 把自己站点的 KV 存储超额追到 OpenNext 的 KV 增量缓存:写入不带 TTL,且每次部署按 Build ID 前缀留下一整份快照;文章给出他重建缓存生命周期的做法。
作者在 𝕏 分享本文,并按月列出 2026 年被账单“背刺”的经历:七月图片转换、八月容器、九月 prefetch 自我 DDoS、十月 KV 缓存。
到 𝕏 阅读Meathill
@meathill1 · 𝕏 原帖
作为Cloudflare资深用户,我的独立开发生涯不断被账单背刺: - 七月:图片转换被坑 - 八月:容器使用被坑 - 九月:prefetch DDOS 自己 - 十月:KV 缓存爆炸 这次分享的,就是我本以为开源框架应该已经做好了,但实际上 // TODO 多年的一个缓存陷阱: https://t.co/NjRzSo510W
其他推荐阅读
作者经验Workers +4
Cloudflare 每月 5 美元,账单却没有跟着封顶
不追高(@Ariella1213)在 X 长文中说明 Workers Paid 的 5 美元是每月最低收费,各产品限制和预算告警都不封顶账户账单,并讨论 denial-of-wallet、写入放大、延迟停机与后台重试如何增加费用。
Durable Objects
Jiuhong:vibe coding 引入 Durable Objects 缺陷,一夜 600 多刀,作者称退回 80% 至账户抵扣。
Jiuhong(@indiehacker9527)在 X 上 shmily7 的帖下回复称,几个月前在 Durable Objects 中 vibe coding 出的缺陷一夜产生 600 多刀账单。经多轮交涉(强调系统缺陷)后,他称退了 80%,但不是退回银行卡,而是退到账户用于后续抵扣;Cloudflare 承诺改进产品,并另送了 startup 礼包。