deno.com

Deno KV:键/值数据库

在 Github 上编辑

警告:这是一个不稳定的 API,随时可能更改或删除。
Deno KV 是一个内置于 Deno 运行时的键/值数据库,可在 Deno Deploy 上零配置工作。它非常适合需要快速读取且不需要 SQL 数据库查询灵活性的用例。

打开默认数据库
const kv = await Deno.openKv();
在 TypeScript 中为我们的数据定义接口
enum Rank {
  Bronze,
  Silver,
  Gold,
}

interface Player {
  username: string;
  rank: Rank;
}
创建一些实例用于测试
const player1: Player = { username: "carlos", rank: Rank.Bronze };
const player2: Player = { username: "briana", rank: Rank.Silver };
const player3: Player = { username: "alice", rank: Rank.Bronze };
使用 “set” 操作在 Deno KV 中存储对象数据。键可以分层排列,类似于 REST API 中的资源。
await kv.set(["players", player1.username], player1);
await kv.set(["players", player2.username], player2);
await kv.set(["players", player3.username], player3);
“set” 操作用于创建和更新给定键的数据
player3.rank = Rank.Gold;
await kv.set(["players", player3.username], player3);
使用 “get” 操作按键获取单个对象
const record = await kv.get(["players", "alice"]);
const alice: Player = record.value as Player;
console.log(record.key, record.versionstamp, alice);
使用 “getMany” 按键获取多个对象
const [record1, record2] = await kv.getMany([
  ["players", "carlos"],
  ["players", "briana"],
]);
console.log(record1, record2);
按键前缀列出多个记录 - 请注意,结果按字典顺序排序,因此我们的玩家将按 “alice”、“briana”、“carlos” 的顺序获取
const records = kv.list({ prefix: ["players"] });
const players = [];
for await (const res of records) {
  players.push(res.value as Player);
}
console.log(players);
删除给定键的值
await kv.delete(["players", "carlos"]);
Deno.KvU64 对象是 64 位整数 (BigInt) 的包装器,因此您可以快速更新非常大的数字。让我们为 alice 添加一个 “score”。
const aliceScoreKey = ["scores", "alice"];
await kv.set(aliceScoreKey, new Deno.KvU64(0n));
为了准备原子事务以更新分数,首先我们需要检查自我们读取分数以来分数是否已被修改。我们可以使用 versionstamp 来检查自我们读取值以来该值是否已被修改。
const aliceScoreEntry = await kv.get<Deno.KvU64>(aliceScoreKey);
const atomicCheck = {
  key: aliceScoreEntry.key,
  versionstamp: aliceScoreEntry.versionstamp,
};
在原子事务中将玩家的分数加 10
const res = await kv.atomic()
  .check(atomicCheck)
  .mutate({
    type: "sum",
    key: aliceScoreKey,
    value: new Deno.KvU64(10n),
  })
  .commit();
检查事务是否成功
if (res.ok) {
  const newScore = (await kv.get<Deno.KvU64>(aliceScoreKey)).value;
  console.log("Alice's new score is:", newScore);
} else {
  console.error("Transaction failed ");
可选地,实现重试逻辑或处理冲突
}

使用 Deno CLI 在本地运行 此示例

deno run --unstable-kv https://docs.deno.org.cn/examples/scripts/kv.ts

你找到你需要的东西了吗?

隐私政策