deno.com

Deno KV:键/值数据库

警告:这是一个不稳定的 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 添加一个“分数”。
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

您找到所需内容了吗?

隐私政策