首页    新闻    小组    威客    人才    下载    博客    代码贴    在线编程    论坛
Deno 推出高性能键值数据库 Deno KV
2023年5月3日 17:21 | 阅读 1621 次

Deno 团队宣布推出 Deno KV,并称其是具备强一致性的键值数据库,支持在全局范围复制以在全球 35 个地区实现低延迟读取。

Deno KV 重要特性包括:

  • 支持在本地运行或托管

Deno KV 支持无缝集成到开源 Deno runtime 中,允许在本地运行它或将其部署为零配置的托管服务。

在本地运行的时候,Deno KV 由 SQLite 提供支持,为本地开发、测试或单区域生产系统提供轻量级且易于使用的解决方案。

当将应用程序部署到 Deno Deploy 时,Deno KV 数据库会自动由 FoundationDB 提供支持。该托管解决方案由 Deno 公司运营,无需开发者手动配置或维护即可确保高性能和可靠性。

  • 简单但强大

Deno KV 专为 JavaScript 设计,可以存储任何 JavaScript 结构化的可序列化值,例如对象、数组、BigInts、日期等。

const kv = await Deno.openKv();

const key = ["users", crypto.randomUUID()];
const value = { name: "Alice", created: new Date() };
await kv.set(key, value);

const result = await kv.get(key);
console.log(result.value);
// { name: "Alice", created: 2023-05-01T09:24:07.620Z }

比如使用kv.list()操作列出与特定选择器匹配的所有键。在下面的示例中,所有以特定前缀开头的键都被选中。

await kv.set(["users", "alice"], { birthday: "January 1, 1990" });
await kv.set(["users", "sam"], { birthday: "February 14, 1985" });
await kv.set(["users", "taylor"], { birthday: "December 25, 1970" });

// List out all entries with keys starting with `["users"]`
const iter = kv.list({ prefix: ["users"] });
for await (const entry of iter) {
  console.log(entry.key);
  console.log(entry.value);
}

详情查看文档

  • 原子性事务 (Atomic transactions)

Deno KV 使用kv.atomic()创建跨多个键的强一致性事务,这些键在默认情况下可立即持久化:

const kv = await Deno.openKv();
const change = 10;

const bob = await kv.get(["balance", "bob"]);
const liz = await kv.get(["balance", "liz"]);
if (liz.value < change) {
  throw "not enough balance";
}

const success = await kv.atomic()
  .check(bob, liz) // balances did not change
  .set(["balance", "bob"], bob.value - change)
  .set(["balance", "liz"], liz.value + change)
  .commit();

详情查看文档

  • 强一致性和高性能

Deno KV 是一个强一致性数据库,提供外部一致性,包括:

  • 可串行化 (Serializability):事务的最高级别隔离,确保并发事务执行导致系统状态等同于这些事务的顺序。
  • 线性化 (Linearizability):保证诸如读取和写入之类的操作立即出现并实时发生。写入操作完成后,所有后续读取操作都会返回更新后的值,从而确保强大的实时排序。
// Read with eventual consistency from the nearest region
await db.get(["my-key"], { consistency: "eventual" });

// Read with strong consistency from the primary region
await db.get(["my-key"], { consistency: "strong" });

使用示例

下面代码使用 Deno KV 创建了全局一致的持久计数器:

import { serve } from "/std@0.155.0/http/server.ts";

const db = await Deno.openKv();

serve(async (req: Request) => {
  await db.atomic().sum(["views"], 1n).commit();
  const res = await db.get(["views"]);
  const views = res.value.value;
  return new Response(`Views: ${views}`);
});

目前要体验 Deno KV,需要排队等候 waitlist 通过:https://deno.com/kv

(文/开源中国)    




评论 (0)
游客请输入验证码
最新评论
0
0
收藏