• 产品简介
  • 快速开始
    • 导入 Git 仓库
    • 从模板开始
    • 直接上传
    • 从 AI 开始
  • 框架指南
    • 前端
      • Vite
      • React
      • Vue
      • Hugo
      • 其他框架
    • 后端
    • 全栈
      • Next.js
      • Nuxt
      • Astro
      • React Router
      • SvelteKit
      • TanStack Start
      • Vike
    • 自定义 404 页面
  • 项目指南
    • 项目管理
    • edgeone.json
    • 缓存配置
    • 构建输出配置
    • 错误码
  • 构建指南
  • 部署指南
    • 概览
    • 触发部署
    • 管理部署
    • 部署按钮
    • 使用 Github Action
    • 使用 Gitlab CI/CD
    • 使用 CNB 插件
    • 使用 IDE 插件
    • 使用 CodeBuddy IDE
  • 域名管理
    • 概览
    • 自定义域名
    • 配置 HTTPS 证书
      • 概览
      • 申请免费证书
      • 使用 SSL 托管证书
    • 配置 DNS 的 CNAME 记录
  • 可观测性
    • 概览
    • 指标分析
    • 日志分析
  • Pages Functions
    • 概览
    • Edge Functions
    • Cloud Functions
      • 概览
      • Node.js
      • Python
      • Go
  • 中间件
  • 存储
    • 概览
    • KV
    • Blob
  • 边缘 AI
  • API Token
  • EdgeOne CLI
  • Copilot
    • 概览
    • 快速开始
  • Pages MCP
  • Pages Skills
  • 消息通知
  • 集成指南
    • AI
      • 对话型大模型集成
      • 图片大模型集成
    • 数据库
      • Supabase 集成
      • Pages KV 集成
    • 电商
      • Shopify 集成
      • WooCommerce 集成
    • 支付
      • Stripe 集成
      • Paddle 集成
    • CMS
      • WordPress 集成
      • Contentful 集成
      • Sanity 集成
      • Payload 集成
    • 身份验证
      • Supabase 集成
      • Clerk 集成
  • 最佳实践
    • AI 对话式部署:使用 Skill 一句话部署项目
    • 使用通用大模型快速搭建 AI 应用
    • 使用边缘 AI 模型快速搭建对话型 AI 站点
    • 使用 Shopify 搭建电商平台
    • 使用 Supabase 和 Stripe 搭建 SaaS 站点
    • 如何快速搭建公司品牌站点
    • 如何快速搭建博客站点
  • 迁移指南
    • 从 Vercel 迁移至 EdgeOne Pages
    • 从 Cloudflare Pages 迁移至 EdgeOne Pages
    • 从 Netlify 迁移至 EdgeOne Pages
  • 排障指南
  • 常见问题
  • 联系我们
  • 产品动态

KV

概述

EdgeOne Pages KV 是多边缘节点部署的键值持久化存储,遵循最终一致性(边缘节点缓存最长 60s),适合存储配置、计数器、Session 等小型数据。
注意:
免费版套餐下单账户存储容量为 1GB。
当前仅支持在 Edge Functions 中使用。

工作原理

KV 采用中心化存储 + 边缘缓存架构,遵循最终一致性:写入会并行落到当前最近边缘节点和中心存储;读取时优先走最近边缘节点的本地缓存,缓存未命中或已过期时(最长 60 秒)回中心存储拉取并刷新缓存。
操作
行为
写入
并行写入当前最近边缘节点和中心存储;写入完成后,同一节点立即可读到最新值。
读取
优先命中最近边缘节点的缓存(毫秒级响应);缓存未命中或已过期时,回中心存储拉取最新值并刷新缓存。
更新 / 删除
当前节点立即生效;其他边缘节点的旧缓存最长 60 秒内自然过期,过期后即可读到最新值。
注意:
写入操作只更新发起请求的节点缓存,其他节点仍可能在最长 60 秒内读到旧值。如果业务需要全局立即一致,请使用 Blob 存储 的强一致模式。

使用场景

计数器

您可以根据业务需求,将某个按钮、页面的点击数存储到 KV,点击时更新 KV 中的键值记录,以便统计和分析点击或访问行为。

密钥库

对于一些敏感性的信息,不方便放置在代码仓库中时,您可以将其存储到 KV 中,动态获取以便更好的保护您的数据。

购物车

KV 可以跨多个页面、多个终端地保留用户数据,可以助您便捷实现用户购物车、用户订单等简单的业务需求。

基础概念

账户

KV 账户是 Pages 业务中 KV 用量统计和计费的最小单位。一个 Pages 账户对应一个 KV 账户,用户在控制台页面开通后创建。账户存储容量 1GB。

命名空间

命名空间(namespace)是 KV 中数据隔离的基本单位。每个命名空间可以看作是一个独立的 database,各个命名空间之间的数据互不干扰。一个账户可以创建 10 个命名空间。

键值对

键值对是一种用户存储数据的结构,其中每个数据项由两个部分组成:键(Key)和值(Value)。键是唯一的标识符,用于标识值,值是与键相关联的数据。

变量名

变量名是绑定项目跟命名空间时定义的运行时环境变量名称。在使用命名空间数据之前,需要先将命名空间跟 Pages 项目进行绑定。命名空间跟项目的绑定关系为多对多,在绑定时通过不同的运行时环境变量名称来区分使用。

快速开始

初始化账户

1. 进入控制台:切换到“存储 - KV”页面。
2. 申请开通账户:单击立即申请




创建命名空间

1. 进入命名空间列表:开通 KV 账户后,在“KV 存储”页面,单击创建命名空间



2. 创建命名空间:输入需要创建的命名空间名称后,单击创建,等待创建完成。



3. 创建完成:创建完成后,可以在命名空间列表页,查看创建好的命名空间。




添加记录

1. 进入命名空间详情:在命名空间列表中,点击对应命名空间名称,进入命名空间详情。



2. 添加记录:单击新建记录



3. 创建完成:创建完成后,可以在记录列表中查看添加好的记录。




绑定命名空间

命名空间与项目间的绑定,在“项目”和“KV 存储”中,都可以进行绑定。
KV 存储中绑定
1. 进入关联项目:在命名空间详情页,点击关联项目选项卡。



2. 绑定项目:单击绑定项目



3. 绑定成功:绑定成功后,在绑定项目列表可以查看绑定好的项目。



项目中绑定
1. 进入项目-KV 存储:进入项目详情后,点击KV 存储菜单。
2. 绑定命名空间:单击绑定命名空间



3. 绑定成功:绑定成功后,在绑定命名空间列表可以查看绑定好的命名空间。




API

说明:以下示例的 my_kv 是您绑定项目跟命名空间时的变量名。
目前提供了一组 KV 存储操作方法供 Pages Functions 使用,具体方法如下:

put

写入 KV 数据,用户创建新的键值对后者更新已有键值对的值。
put(key: string,value: string | ArrayBuffer | ArrayBufferView | ReadableStream): Promise<void>;
参数
key:需要创建或更新的键,长度小于等于 512 B,仅支持数字、字母及下划线。
value:需要写入的数据,数据长度小于等于 25 MB。
返回值
返回一个 Promise,需要 awaitPromise 以验证写入是否成功。
使用示例
await my_kv.put(key, value);

get

根据特定的 key 读取 KV 中的数据,并根据指定类型返回数据。
get(key:string, object?:{type:string}): Promise<value:string|object|ArrayBuffer|ReadableStream>
参数
key:指定获取数据的 key。
type:用于指定返回的 value 类型,默认为 text。
textString,将 value 转成 string 的形式返回。
jsonObject,用户将 json 反序列化为 object 形式返回。
arrayBufferArrayBuffer,用户将二进制的 value 转换为 ArrayBuffer 返回。
streamReadableStream,通常用于 value 较大的场景。
返回值
返回一个 Promise,需要 awaitPromise 以获取 value。如果 key 不存在或 value 为空时,则返回 null。
使用示例
let value = await my_kv.get(key);
let value = await my_kv.get(key, "json");
let value = await my_kv.get(key, {type: "json"});

delete

从 KV 中删除指定的 key。
delete(key: string): Promise<void>;
参数
key : 需要删除的键值对的 key。
返回值
返回一个 Promise,需要 awaitPromise 以验证删除是否成功。
使用示例
await my_kv.delete(key);

list

用于遍历 KV 中的所有 key。
list({prefix?: string, limit?: number, cursor?: string}): Promise<ListResult>;
参数
prefix:用于过滤指定前缀的键。默认为空时,按照字典序排序返回。
limit:返回的 key 的最大数量,用于分页。默认值为 256,上限为 256。
cursor:游标,从指定键开始遍历,用于分页。默认为空。
返回值
返回一个 Promise,需要 awaitPromise 以获取 ListResult:
class ListResult {
complete: Boolean;
cursor: String;
keys: Array<ListKey>;
}

class ListKey {
key: String;
}
complete:标记 list 操作是否完成,true 完成,false 未完成。
cursor:游标,为下一页的第一个 key,当 list 遍历完成时为 null。
keys:描述每个 key 的 object 数组。
使用示例
// 通过 list 获取部分数据
let result = await kv.list({ "prefix": "a", "limit": 10, "cursor": "abc" });

// 通过 list 遍历所有数据
let result;
let cursor;
do {
result = await kv.list(options);
cursor = result.cursor;
} while (result && !result.complete);

示例

export async function onRequest({ request, params, env }) {
// 获取变量名为 my_kv 的命名空间 key
let count = await my_kv.get("count");
count = Number(count) + 1;
// 重新写入 visitCount 键值
await my_kv.put("count", String(count));

return new Response("ok", {});
}

示例模板

使用 KV 记录页面访问数:
ai-agent
你可以这样问我
如何开始使用 EdgeOne Pages?