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 添加一个“score”。
const aliceScoreKey = ["scores", "alice"];
await kv.set(aliceScoreKey, new Deno.KvU64(0n));
在原子事务中将玩家的得分增加 10
await kv.atomic()
.mutate({
type: "sum",
key: aliceScoreKey,
value: new Deno.KvU64(10n),
})
.commit();
const newScore = (await kv.get(aliceScoreKey)).value;
console.log("Alice's new score is: ", newScore);
使用 Deno CLI 在本地运行 此示例
deno run --unstable-kv https://docs.deno.org.cn/examples/kv.ts