Skip to content

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 R2AWS 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 查询/事务的关系数据D1SQLite 全功能 SQL,支持事务
读多写少的边缘查询D1全球只读副本,边缘读取快
配置/特征开关/会话KV最终一致可接受,超低延迟读
强一致全局协调/限流计数Durable ObjectsD1/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 纳入你的云服务选型决策。