出品 | OSC开源社区(ID:oschina2013)
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);
}
详情查看文档:https://deno.com/manual/runtime/kv/operations
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();
详情查看文档:https://deno.com/manual/runtime/kv/transactions
Deno KV 是一个强一致性数据库,提供外部一致性,包括:
// 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。
------
我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!
推荐阅读
刺激!ChatGPT给我虚构了一本书?
ChatGPT 生成的代码比你写的更不安全
Java 17 采用率在一年内增长 430%
··································
你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。