Deno KV 现已进入公开测试阶段
Deno KV 是为您的应用程序添加强一致数据库最快、最简单的方法。 它内置于运行时中,因此您可以跳过配置并直接开始编码。
今天,我们很高兴宣布 **Deno Deploy 上的 Deno KV 现已进入公开测试阶段**。 不再有等待名单,因此您可以通过简单地注册 Deno Deploy 来访问 Deno KV。 对于已经使用 Deno Deploy 的用户,您的项目会自动更新以访问 KV。
除了我们的公告之外,这里还有一些关于 Deno Deploy 上的 Deno KV 的其他激动人心的更新
从 Deno Deploy 外部连接到 KV
为了更轻松地探索、导入、迁移和更新您在 Deno Deploy 上的 KV 数据,您现在可以从命令行直接连接到您的 KV 实例。 只需将 Deno Deploy 个人访问令牌 设置为本地环境变量 DENO_KV_ACCESS_TOKEN
,并将您的数据库 URL 传递给 Deno.openKv()
const kv = await Deno.openKv(
"https://api.deno.com/databases/<database-id>/connect",
);
您可以在 Deno Deploy 项目页面上找到您的数据库 ID、URL 和有关如何连接到您的托管 KV 数据库的更多信息
现在,您可以更轻松地将数据导入生产环境、处理数据迁移、手动检查/修改/探索数据,以及使用全局 Deno KV 进行存储在其他平台上托管 Deno 应用程序
// This script updates the format of the `createdAt` field of all entries under the prefix
// `["items"]` from UNIX millisecond timestamps to ISO date strings.
import { Semaphore } from "https://deno.land/x/[email protected]/semaphore.ts";
const kv = await Deno.openKv(
"https://api.deno.com/databases/<database-id>/connect",
);
const concurrencyLimit = 20;
const sem = new Semaphore(concurrencyLimit);
for await (
const { key, value, versionstamp } of kv.list<any>({ prefix: ["items"] })
) {
if (typeof value?.createdAt === "number") {
value.createdAt = new Date(value.createdAt).toISOString();
const release = await sem.acquire();
(async () => {
await kv.atomic().check({ key, versionstamp }).set(key, value).commit();
release();
})();
}
}
for (let i = 0; i < concurrencyLimit; i++) {
await sem.acquire();
}
console.log("Migration completed!");
了解更多有关从命令行连接到您的全局 Deno KV 的信息 →
想要在 Deno Deploy 上使用 Deno KV,但应用程序托管在 Fly.io 上? 以下是使用 Deno KV 连接进行操作的快速指南
定价
我们很高兴宣布 Deno KV 的透明定价,可根据您的需求进行扩展。 Deno KV 的计费方式包括三个维度:存储、读取单位和写入单位。
存储是指您在一个月内存储在 Deno KV 数据库中的数据量,以 GB 为单位。 读取和写入单位是指您从 Deno KV 数据库中读取和写入数据的次数,分别以 4 KiB 读取单位和 1 KiB 写入单位为单位。 如果您执行 3 个 1 KiB 的读取事务,您将被计费 3 个读取单位。 如果您执行 1 个 4 KiB 的写入事务,您将被计费 4 个写入单位。
写入单位使用量还会乘以您为数据库启用的区域数。 如果您启用了主区域和两个读取副本,您将为每 1 KiB 的写入被计费 3 个写入单位。
对于每个用户,Deno Deploy 的免费层包含 1 GiB 的存储空间、每天 15k 个读取单位和每天 10k 个写入单位。 每天使用量在 UTC 00:00 重置。
对于那些使用 Deno KV 和 Deno Deploy 进行扩展的用户,我们的 Pro 层提供以下内容
- 每月 5 GiB 的存储空间,额外每 GiB 0.75 美元
- 每天 45k 个读取单位,额外每百万次读取 1 美元
- 每天 30k 个写入单位,额外每百万次写入 2.5 美元
以下是完整的价格表,以供您更详细地了解
免费 | Pro | 自定义 | |
---|---|---|---|
KV 存储 | 1 GB | 5GB(然后 0.50 美元/GB) | 自定义 |
**KV 读取单位/天** (4kb) | 15,000 | 45,000(然后 1 美元/M) | 自定义 |
**KV 写入单位/天** (1kb) | 10,000 | 30,000(然后 2.50 美元/M) | 自定义 |
数据库区域数量 | 1 | 自定义 | 自定义 |
选择您的写入区域 | 否 | 否 | 是 |
每月最大使用量 | 免费 | $250 | N/A |
提醒一下,在没有 Deno Deploy 的情况下,在本地使用 Deno KV 将是免费的。
了解更多关于我们的 Deno Deploy 和 Deno KV 定价方案 →
更多读取区域以降低延迟
默认情况下,每个 Deno KV 数据库都带有一个写入区域和一个读取区域。 如果您的用户遍布全球,由于单个读取区域,某些用户可能会遇到较长的延迟。
现在,您可以启用更多读取区域,以将您的数据库扩展到全球范围,从而进一步降低延迟
更强大的原子操作
原子操作是 Deno KV 的一项强大功能,它允许您在单个事务中执行多个操作。 如果任何操作失败,整个事务将回滚,确保您的数据始终保持一致。
以前,您只能在单个事务中执行最多 10 个变异操作。 许多人告诉我们,这个限制太低了,尤其是在处理需要许多辅助索引的复杂数据时。
我们听到了您的声音! **每个原子操作的限制已增加到 1000 个变异**,或 800 KiB 的总原子操作大小,以先到者为准。
OAuth 简化
用户身份验证是任何现代 Web 应用程序的必备条件。 为了尽可能简化将身份验证实现到您的 Deno Deploy 项目中,我们构建了 Deno KV OAuth,这是一个高层级的 OAuth 2.0 包装器,使用 Deno KV 作为后端,并预先配置了许多常见的 OAuth 2.0 提供商,例如 GitHub、Google、Facebook、Slack、Discord 等等。
您可以使用 新的插件 将 OAuth 功能添加到您的 Fresh 项目中
// main.ts
import { start } from "$fresh/server.ts";
import { createGitHubOAuth2Client } from "https://deno.land/x/deno_kv_oauth/mod.ts";
import { kvOAuthPlugin } from "https://deno.land/x/deno_kv_oauth/fresh.ts";
import manifest from "./fresh.gen.ts";
await start(manifest, {
plugins: [
kvOAuthPlugin(createGitHubOAuth2Client()),
],
});
或者,如果您使用的是其他框架,可以使用 Web API
已经有项目使用 Deno KV OAuth 进行身份验证,例如 SaaSKit、KV Sketchbook 等等 更多。
即将推出
我们收到了您的反馈,并正在努力添加有用的功能,使 Deno Deploy 上的 Deno KV 成为为您的全局托管项目添加状态的最简单、最快的方法。
以下是不完整的即将推出的功能预览列表。
expireIn
的密钥 TTL
使用 密钥生存时间 (TTL) 过期是 Redis 中的一项重要功能,它允许您轻松管理用户会话或创建自己的缓存系统。 很快,您就可以使用 expireIn
选项在 Deno KV 中执行相同的操作,该选项接受以毫秒为单位的数字
const db = await Deno.openKv();
await db.set(["a"], 1, { expireIn: 1000 });
在 expireIn
指定的毫秒数过去后,密钥将从数据库中删除。如果未指定 expireIn
,则密钥将不会过期。
注意,此功能已在 Deno 运行时中可用。
S3 备份
每个生产应用程序都需要数据备份,以防出现问题。很快,您将能够将 Deno KV 数据备份到您自己的 S3 存储桶中。
备份是实时的,支持对您的数据进行时间点恢复。最初,您将能够将备份恢复到本地 Deno KV 数据库,并将在不久后支持恢复到托管的 Deno KV 数据库。
主区域选择
Deno KV 使用一个处理写入操作的主区域和多个处理读取操作的读取区域。当发送 write
事务时,它首先在主区域进行处理,然后复制到所有读取区域,从而在所有区域之间实现最终数据一致性。因此,您的 write
延迟会受到您的用户距离主区域有多远的影响,而使用 consistency: "eventual"
时,您的 read
延迟会受到您的用户距离任何读取区域有多远的影响。
很快,您将能够通过选择您的主区域来优化用户延迟和性能。
由于没有适合所有应用程序或业务的配置,因此完全控制数据存储和检索方式以及位置非常重要,以便为用户优化性能。
主区域切换生效时间不到 5 秒,不会导致您的应用程序停机。我们将在未来几周内为 Deno Deploy 用户推出此功能。
下一步是什么?
我们对 Deno Deploy 的愿景是使其成为通过内置云基元(例如Deno KV(以及更多——敬请关注!)托管 JavaScript 最容易的地方。在我们努力实现 Deno KV 和 Deno Deploy 的普遍可用发布时,我们将继续添加功能,使其尽可能简单地构建和托管生产就绪的 JavaScript 应用程序。
我们始终欢迎反馈和功能请求!随时加入我们不断壮大的 Discord或在此创建问题。