R2 / D1 / KV:存储与数据库三件套
基于 Cloudflare 官方文档(2025) · 核于 2026-08
速查
- 三大存储:R2(对象存储,类 S3,零出口费)、D1(边缘 SQLite 关系型数据库)、KV(全球键值存储,最终一致)。
- R2 核心卖点:零出口费——存取只收存储费 + 操作费,出口流量免费。对比 AWS S3(出口约 $0.09/GB),存视频/图片供前端访问省巨额成本。
- R2 用法:S3 兼容 API(可用 AWS SDK),或从 Workers 通过绑定原生访问(
env.MY_BUCKET.put/get),无需 API key。 - D1 模型:SQLite 的边缘托管版——写入走主区域(强一致),全球边缘节点缓存只读副本(最终一致),适合读多写少。
- D1 用法:标准 SQL(SQLite 方言),从 Workers 绑定访问(
env.DB.prepare("SELECT...").all()),支持事务、外键、JSON 函数。 - KV 模型:全球分布式键值存储,最终一致(写入秒级传播到全球),读延迟极低(边缘缓存)。
- KV 用法:
env.MY_KV.put/get/list,键值均字符串,list 支持前缀扫描;适合配置、会话、特征开关。 - 一致性选型:要强一致(事务)→ D1;可容忍秒级最终一致 + 超低延迟读 → KV;大文件/媒体 → R2。
- 免费层:R2 10GB 存储 + 零出口;D1 5GB + 500 万读/天;KV 10 万读/天。
- 绑定访问:三者都通过 Workers/Pages 的声明式绑定访问,无需 API key/连接串,代码里直接
env.XXX。
一、R2:零出口费的对象存储
R2 是 Cloudflare 对标 AWS S3 的对象存储,最大差异在出口费:
| 维度 | Cloudflare R2 | AWS S3 |
|---|---|---|
| 存储费 | ~$0.015/GB-月 | ~$0.023/GB-月 |
| 写入(PUT)操作费 | $4.5/百万 | $5/百万 |
| 读取(GET)操作费 | $0.36/百万 | $0.4/百万 |
| 出口流量费 | 免费(零出口费) | ~$0.09/GB(账单大头) |
- 零出口费的意义:一个 1TB 视频库,月访问 10TB 流量,在 S3 出口费约 $900/月,在 R2 出口完全免费——只付存储费(约 $15/月)。这是 R2 的杀手锏。
- S3 兼容:R2 用 S3 兼容 API,AWS SDK(
@aws-sdk/client-s3)改个 endpoint 即可用,迁移成本低。 - Workers 绑定访问:在 Workers 里通过 R2 绑定直接访问,无需 API key:ts
const obj = await env.MY_BUCKET.get("photo.jpg"); return new Response(obj.body); // 直接流式返回 - 典型用途:图片/视频存储与分发、网站静态资源、备份归档、大数据湖、用户上传文件。
二、D1:边缘 SQLite 数据库
D1 是 SQLite 的边缘托管版,2024 GA:
ts
// Workers 里通过 D1 绑定访问
const { results } = await env.DB.prepare(
"SELECT * FROM users WHERE active = ?"
).bind(true).all();
// 事务
await env.DB.batch([
env.DB.prepare("INSERT INTO orders (...) VALUES (...)"),
env.DB.prepare("UPDATE inventory SET stock = stock - 1 WHERE id = ?"),
]);- SQLite 方言:标准 SQL,支持事务、外键、JSON 函数、CTE、窗口函数——轻量但功能完备。
- 架构:一个主区域处理写入(强一致),全球边缘节点维护只读副本(写入后秒级同步)。
- 适合:读多写少(边缘读取快)、中小规模数据(GB 级)、需要 SQL 查询/事务的应用。
- 不适合:超大规模(TB/PB 级)、超高频写入、复杂分布式事务——这些应选传统分布式数据库(PostgreSQL/CockroachDB)。
- 限制:单库默认 10GB(付费可扩),单查询行数/复杂度有限制。
三、KV:全球键值存储
KV 是最终一致的全球分布式键值存储:
ts
// 写入(秒级传播到全球边缘)
await env.MY_KV.put("feature:new-ui", "on");
// 读取(从最近的边缘节点,超低延迟)
const flag = await env.MY_KV.get("feature:new-ui");
// 前缀扫描
const list = await env.MY_KV.list({ prefix: "feature:" });- 一致性:最终一致——写入后全球边缘节点秒级同步,期间可能读到旧值。不能用于需要强一致的场景(如余额扣减)。
- 读延迟:极低(边缘缓存命中时个位数毫秒),适合全球高频读。
- 适合:配置(feature flags)、会话 token、用户偏好、CDN 缓存元数据、查找表。
- 不适合:需要强一致的事务数据、频繁变更的热数据(KV 写入有传播延迟且成本较高)。
- 限制:键值大小有限(值默认 25MB),写入有频率限制。
四、三者选型决策
根据数据特征与一致性需求选型:
| 场景 | 推荐 | 原因 |
|---|---|---|
| 大文件/图片/视频存储分发 | R2 | 零出口费,省巨额带宽成本 |
| 用户上传文件 | R2 | 对象存储天然适合,Workers 原生访问 |
| 需 SQL 查询/事务的关系数据 | D1 | SQLite 全功能 SQL,支持事务 |
| 读多写少的边缘查询 | D1 | 全球只读副本,边缘读取快 |
| 配置/特征开关/会话 | KV | 最终一致可接受,超低延迟读 |
| 强一致全局协调/限流计数 | Durable Objects | D1/KV 都不够强一致时用它 |
- 常见组合:R2(存文件)+ D1(存元数据/订单)+ KV(存配置/缓存)——一个全栈应用的存储层齐了。
- 避免误用:别用 KV 存需要强一致的金融余额(用 D1 事务);别用 D1 存 PB 级大数据(用 R2);别用 R2 存需要 SQL 查询的结构化数据(用 D1)。
五、存储成本对比与省钱技巧
理解全家桶的计费模型,才能控成本:
- R2:存储费($0.015/GB-月)+ 操作费,出口免费——存取越多越比 S3 省。
- D1:存储费 + 读/写行数计费——读多写少的应用成本低,高频写入要留意。
- KV:存储费 + 读/写/列表/删除操作计费——写入比读取贵得多,KV 应主要用于读密集场景。
- 省钱技巧:①大文件一律 R2(别用 KV/D1);②热数据用 Workers 内存或 Cache API 缓存,减少 KV/D1 读;③静态资源走 Pages(无限带宽免费);④feature flags 等配置用 KV(低成本高频读)。
下一步
掌握三大存储后,可结合参考查阅全家桶组件速查、定价对比与易错点,把 Cloudflare 纳入你的云服务选型决策。