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 新增一個「分數」。
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://deno-docs.dev.org.tw/examples/scripts/kv.ts