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