deno.com
在本頁面中

操作

Deno KV API 提供了一組可以在鍵空間上執行的操作。

有兩個操作從儲存區讀取資料,以及五個操作將資料寫入儲存區。

讀取操作可以在強一致性或最終一致性模式下執行。強一致性模式保證讀取操作將返回最近寫入的值。最終一致性模式可能會返回過時的值,但速度更快。

寫入操作始終在強一致性模式下執行。

get Jump to heading

get 操作返回與給定鍵關聯的值和版本戳記。如果值不存在,get 會返回 null 值和版本戳記。

有兩個 API 可用於執行 get 操作。 Deno.Kv.prototype.get(key, options?) API,可用於讀取單個鍵,以及 Deno.Kv.prototype.getMany(keys, options?) API,可用於一次讀取多個鍵。

Get 操作在所有一致性模式下都作為「快照讀取」執行。這表示當一次檢索多個鍵時,返回的值將彼此一致。

const res = await kv.get<string>(["config"]);
console.log(res); // { key: ["config"], value: "value", versionstamp: "000002fa526aaccb0000" }

const res = await kv.get<string>(["config"], { consistency: "eventual" });
console.log(res); // { key: ["config"], value: "value", versionstamp: "000002fa526aaccb0000" }

const [res1, res2, res3] = await kv.getMany<[string, string, string]>([
  ["users", "sam"],
  ["users", "taylor"],
  ["users", "alex"],
]);
console.log(res1); // { key: ["users", "sam"], value: "sam", versionstamp: "00e0a2a0f0178b270000" }
console.log(res2); // { key: ["users", "taylor"], value: "taylor", versionstamp: "0059e9035e5e7c5e0000" }
console.log(res3); // { key: ["users", "alex"], value: "alex", versionstamp: "00a44a3c3e53b9750000" }

list Jump to heading

list 操作返回符合給定選擇器的鍵列表。這些鍵的關聯值和版本戳記也會返回。有 2 種不同的選擇器可用於篩選匹配的鍵。

prefix 選擇器匹配所有以給定前綴鍵部分開頭的鍵,但不包括鍵的完全匹配。前綴選擇器可以選擇性地給定一個 startend 鍵來限制返回的鍵範圍。 start 鍵是包含性的,而 end 鍵是排除性的。

range 選擇器匹配所有按字典順序介於給定 startend 鍵之間的鍵。 start 鍵是包含性的,而 end 鍵是排除性的。

注意:在 prefix 選擇器的情況下,prefix 鍵必須僅包含完整(非部分)鍵部分。例如,如果鍵 ["foo", "bar"] 存在於儲存區中,則前綴選擇器 ["foo"] 將匹配它,但前綴選擇器 ["f"] 將不匹配。

list 操作可以選擇性地給定一個 limit 來限制返回的鍵數量。

List 操作可以使用 Deno.Kv.prototype.list<string>(selector, options?) 方法執行。此方法返回一個 Deno.KvListIterator,可用於迭代返回的鍵。這是一個非同步迭代器,可以與 for await 迴圈一起使用。

// Return all users
const iter = kv.list<string>({ prefix: ["users"] });
const users = [];
for await (const res of iter) users.push(res);
console.log(users[0]); // { key: ["users", "alex"], value: "alex", versionstamp: "00a44a3c3e53b9750000" }
console.log(users[1]); // { key: ["users", "sam"], value: "sam", versionstamp: "00e0a2a0f0178b270000" }
console.log(users[2]); // { key: ["users", "taylor"], value: "taylor", versionstamp: "0059e9035e5e7c5e0000" }

// Return the first 2 users
const iter = kv.list<string>({ prefix: ["users"] }, { limit: 2 });
const users = [];
for await (const res of iter) users.push(res);
console.log(users[0]); // { key: ["users", "alex"], value: "alex", versionstamp: "00a44a3c3e53b9750000" }
console.log(users[1]); // { key: ["users", "sam"], value: "sam", versionstamp: "00e0a2a0f0178b270000" }

// Return all users lexicographically after "taylor"
const iter = kv.list<string>({ prefix: ["users"], start: ["users", "taylor"] });
const users = [];
for await (const res of iter) users.push(res);
console.log(users[0]); // { key: ["users", "taylor"], value: "taylor", versionstamp: "0059e9035e5e7c5e0000" }

// Return all users lexicographically before "taylor"
const iter = kv.list<string>({ prefix: ["users"], end: ["users", "taylor"] });
const users = [];
for await (const res of iter) users.push(res);
console.log(users[0]); // { key: ["users", "alex"], value: "alex", versionstamp: "00a44a3c3e53b9750000" }
console.log(users[1]); // { key: ["users", "sam"], value: "sam", versionstamp: "00e0a2a0f0178b270000" }

// Return all users starting with characters between "a" and "n"
const iter = kv.list<string>({ start: ["users", "a"], end: ["users", "n"] });
const users = [];
for await (const res of iter) users.push(res);
console.log(users[0]); // { key: ["users", "alex"], value: "alex", versionstamp: "00a44a3c3e53b9750000" }

list 操作以批次方式從儲存區讀取資料。每個批次的大小可以使用 batchSize 選項控制。預設批次大小為 500 個鍵。批次中的資料在單個快照讀取中讀取,因此值彼此一致。一致性模式適用於每個批次讀取的資料。跨批次,資料不一致。批次之間的邊界從 API 中不可見,因為迭代器返回單個鍵。

list 操作可以通過將 reverse 選項設置為 true 來以相反的順序執行。這將以字典順序降序返回鍵。 startend 鍵仍然分別是包含性和排除性的,並且仍然被解釋為按字典順序升序。

// Return all users in reverse order, ending with "sam"
const iter = kv.list<string>({ prefix: ["users"], start: ["users", "sam"] }, {
  reverse: true,
});
const users = [];
for await (const res of iter) users.push(res);
console.log(users[0]); // { key: ["users", "taylor"], value: "taylor", versionstamp: "0059e9035e5e7c5e0000" }
console.log(users[1]); // { key: ["users", "sam"], value: "sam", versionstamp: "00e0a2a0f0178b270000" }

注意:在上面的範例中,我們將 start 鍵設置為 ["users", "sam"],即使返回的第一個鍵是 ["users", "taylor"]。這是因為 startend 鍵始終以字典順序升序評估,即使 list 操作以相反的順序執行(這會以字典順序降序返回鍵)。

set Jump to heading

set 操作設置儲存區中鍵的值。如果鍵不存在,則會創建它。如果鍵已存在,則其值將被覆寫。

set 操作可以使用 Deno.Kv.prototype.set(key, value) 方法執行。此方法返回一個 Promise,它解析為一個 Deno.KvCommitResult 物件,其中包含提交的 versionstamp

Set 操作始終在強一致性模式下執行。

const res = await kv.set(["users", "alex"], "alex");
console.log(res.versionstamp); // "00a44a3c3e53b9750000"

delete Jump to heading

delete 操作從儲存區中刪除一個鍵。如果鍵不存在,則操作為空操作。

delete 操作可以使用 Deno.Kv.prototype.delete(key) 方法執行。

Delete 操作始終在強一致性模式下執行。

await kv.delete(["users", "alex"]);

sum Jump to heading

sum 操作以原子方式將值添加到儲存區中的鍵。如果鍵不存在,則使用 sum 的值創建它。如果鍵已存在,則其值將添加到 sum 中。

sum 操作只能作為原子操作的一部分執行。 Deno.AtomicOperation.prototype.mutate({ type: "sum", value }) 方法可用於將 sum 突變添加到原子操作。

sum 操作只能對 Deno.KvU64 類型的值執行。操作數和儲存區中的值都必須是 Deno.KvU64 類型。

如果鍵的新值大於 2^64 - 1 或小於 0,則 sum 操作會環繞。例如,如果儲存區中的值為 2^64 - 1 且操作數為 1,則新值將為 0

Sum 操作始終在強一致性模式下執行。

await kv.atomic()
  .mutate({
    type: "sum",
    key: ["accounts", "alex"],
    value: new Deno.KvU64(100n),
  })
  .commit();

min Jump to heading

min 操作以原子方式將鍵設置為其當前值和給定值中的最小值。如果鍵不存在,則使用給定值創建它。如果鍵已存在,則其值將設置為其當前值和給定值中的最小值。

min 操作只能作為原子操作的一部分執行。 Deno.AtomicOperation.prototype.mutate({ type: "min", value }) 方法可用於將 min 突變添加到原子操作。

min 操作只能對 Deno.KvU64 類型的值執行。操作數和儲存區中的值都必須是 Deno.KvU64 類型。

Min 操作始終在強一致性模式下執行。

await kv.atomic()
  .mutate({
    type: "min",
    key: ["accounts", "alex"],
    value: new Deno.KvU64(100n),
  })
  .commit();

max Jump to heading

max 操作以原子方式將鍵設置為其當前值和給定值中的最大值。如果鍵不存在,則使用給定值創建它。如果鍵已存在,則其值將設置為其當前值和給定值中的最大值。

max 操作只能作為原子操作的一部分執行。 Deno.AtomicOperation.prototype.mutate({ type: "max", value }) 方法可用於將 max 突變添加到原子操作。

max 操作只能對 Deno.KvU64 類型的值執行。操作數和儲存區中的值都必須是 Deno.KvU64 類型。

Max 操作始終在強一致性模式下執行。

await kv.atomic()
  .mutate({
    type: "max",
    key: ["accounts", "alex"],
    value: new Deno.KvU64(100n),
  })
  .commit();

watch Jump to heading

watch 操作接受一個鍵陣列,並返回一個 ReadableStream,每當任何被監視的鍵更改其 versionstamp 時,它都會發出一個新值。發出的值是一個 Deno.KvEntryMaybe 物件陣列。

請注意,返回的流不會返回被監視鍵的每個單獨中間狀態,而是讓您及時了解鍵的最新狀態。這表示如果一個鍵被快速修改多次,您可能不會收到每次更改的通知,而是鍵的最新狀態。

const db = await Deno.openKv();

const stream = db.watch([["foo"], ["bar"]]);
for await (const entries of stream) {
  entries[0].key; // ["foo"]
  entries[0].value; // "bar"
  entries[0].versionstamp; // "00000000000000010000"
  entries[1].key; // ["bar"]
  entries[1].value; // null
  entries[1].versionstamp; // null
}

你找到需要的資訊了嗎?

隱私權政策