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