Deno推出高性能键值数据库Deno KV

2023-05-16

出品 | OSC开源社区(ID:oschina2013)

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

fb944a8796592f4b9322450319f7f3b4.png

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

  • 原子性事务 (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();

详情查看文档:https://deno.com/manual/runtime/kv/transactions

  • 强一致性和高性能

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。

------

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!

推荐阅读

  • 刺激!ChatGPT给我虚构了一本书?

  • ChatGPT 生成的代码比你写的更不安全

  • Java 17 采用率在一年内增长 430% 

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Deno推出高性能键值数据库Deno KV 的相关文章

  • rust axum 项目实践 deno js运行时集成

    rust axum使用deno runtime 使用场景 xff1a 例如在创建订单的过程中 订单创建完成之后 需要根据订单的金额 和订单下单数量进行 1 xff1a 增加用户积分 2 xff1a 赠送优惠券 3 xff1a 消息推送 对于
  • Deno推出高性能键值数据库Deno KV

    出品 OSC开源社区 xff08 ID xff1a oschina2013 Deno 团队宣布推出 Deno KV xff0c 并称其是具备强一致性的键值数据库 xff0c 支持在全局范围复制以在全球 35 个地区实现低延迟读取 Deno
  • 如何在 DENO 中使用 npm 模块?

    德诺超级酷 我早上看到了 现在想迁移到 deno 我试图将现有的 Nodejs 脚本移至 deno 任何人都可以帮助我如何在 deno 中使用 npm 模块 我需要 esprima 模块 这个有包https github com denol
  • 如何使用 deno 的 Oak 提供图像?

    Deno 似乎针对文本文件 但我还需要为网站提供图像文件 您可以使用send 功能send 旨在将静态内容作为 中间件功能 在最直接的用法中 根是 提供给该功能的请求得到满足 本地文件系统中相对于根目录的文件 请求的路径 const app
  • 无法创建 deno docker 镜像

    我想创建deno使用 Dockerfile 生成 docker 镜像 FROM alpine latest WORKDIR RUN apk update apk upgrade RUN apk add curl RUN curl fsSL
  • 如何让网络工作者同时执行多项任务?

    我试图让 Web Worker 管理其状态 同时服务多个异步请求 工人 ts 文件 let a 0 this is my worker s state let worker self as unknown as Worker worker
  • 如何从 Deno 运行任意 shell 命令?

    我想从 Deno 运行任意 bash 命令 就像使用child process在节点中 这在 Deno 中可能吗 Deno 1 28 0 添加了一个新的 API 来运行 shell 命令 Deno Command https deno la
  • Deno 顶级等待

    正在阅读homepage https deno land 新的 JS 运行时 deno 我看到了下面的代码 import serve from https deno land email protected cdn cgi l email
  • Deno 允许所有权限

    我经常发现自己在使用 Deno 时至少输入两到三个权限选项 deno run allow net allow read allow env app ts 有一种方法可以逃避显式权限 您可以使用 allow all或短选项 A允许所有权限 请
  • tsc 编译使用文件扩展名导入的打字稿

    我以独立于生态系统的方式编写打字稿代码 我决定在导入中包含文件扩展名 以匹配 Web 和 Deno import xyz from foo ts 我怎样才能获得打字稿编译器 tsc 编译这些文件不会出现以下错误 error TS2691 A
  • deno 捆绑失败。类型“ReadableStream”上不存在属性“getIterator”

    使用捆绑包运行 deno 失败并出现以下错误 error TS2339 ERROR Property getIterator does not exist on type ReadableStream
  • 测试用例在 deno 上泄漏异步操作

    我从 Drash 下载了示例应用程序 https github com drashland eno drash https github com drashland deno drash deno run allow run allow r
  • Node.js Buffer.from(string) 的 Deno 等价物是什么

    如何将字符串转换为缓冲区 我试过 Uint8Array from hello world 但它不起作用 相当于Buffer from Hello World is const encoder new TextEncoder const bu
  • 如何使用 Deno VSCode 扩展进行保存时格式化?

    我正在使用vscode deno https marketplace visualstudio com items itemName denoland vscode deno扩展 尽管我打开了deno enable deno lint an
  • 未捕获的 InvalidData:数据与未标记的枚举 ArgsEnum 的任何变体都不匹配

    我对 Deno 很感兴趣 所以我正在尝试一下 找到了有关构建 REST API 的教程here https blog logrocket com creating your first rest api with deno and post
  • Deno 脚本与 Node.js 兼容吗?

    据我所知 大多数 npm 包由于使用而与 Deno js 不兼容require 至少那些不在de land x https deno land x 但相反的情况可能吗 Deno js 脚本可以在 Node js 项目中使用吗 如果是 那么如
  • 在哪里可以看到 deno 下载的软件包?

    我是新来的deno目前正在探索 deno 的最小可行项目 我想要喜欢 npm 它会下载文件夹内的 npm 包node modules 同样我想看到迪诺包在一个目录中 在我当前的项目中 我没有看到任何下载的包 请建议我在哪里寻找 deno 软
  • 如何在 Deno 中下载大文件?

    我试图下载一个 10GB 的文件 但只有 4GB 保存到磁盘上 而且内存增长了很多 const res await fetch https speed hetzner de 10GB bin const file await Deno op
  • Deno 中子进程如何向父进程发送消息?

    From 这个答案 https stackoverflow com a 62085642 6587634 我知道父进程可以与子进程通信 但是反过来呢 从工人那里你必须使用Worker postMessage https developer
  • deno 安装和 deno 编译之间有什么区别?

    If I do deno help表明 编译 将脚本编译成独立的可执行文件 install 将脚本安装为可执行文件 这两个命令有什么区别 Command Output Self contained 1 Deno runtime integr

随机推荐