跳到主要内容
Introducing Web Cache API support on Deno Deploy

在 Deno Deploy 上引入 Web Cache API 支持

构建高性能的 API、服务器或函数不应该复杂。Deno Deploy 将你的代码托管在世界各地靠近你用户的位置,以最大限度地减少延迟,并提供一个简单的 KV 云原生,它从最近的数据中心读取数据,所有这些只需点击几下或敲击键盘即可完成。

今天,我们非常激动地宣布,通过在 Deno Deploy 中对 Web Cache API 提供 Beta 支持,你可以更好地控制性能。与现代浏览器中可用的 Web 标准 Cache API 非常相似,此 API 为 Request/Response 对提供半持久性存储,使你能够缓存网络请求并提供快速响应。

在这篇博文中,我们将介绍如何使用 Cache API,对性能的期望,有关定价的一些细节,以及更多内容。

🚨️ 在 Deno Deploy 上,在云端托管安全、高性能的 JavaScript 或 TypeScript 代码,只需不到五分钟。立即注册免费帐户。 🚨️

使用 Cache API

为了使用 Cache API,你首先需要使用 caches.open() 方法打开一个缓存,该方法返回一个 Promise,它会解析为 Cache 对象。

const cache = await caches.open("my-cache");

要从缓存中检索数据,你可以使用 cache.match() 方法,该方法接受一个 Request 对象作为参数。

const cachedResponse = await cache.match(request);

最后,要将新的 Request/Response 对象对添加到缓存中,你可以使用 cache.put()

await cache.put(req, res);

在实践中,具有新缓存功能的 Web 服务器可能看起来像这样

const cache = await caches.open("my-cache");

Deno.serve(async (req) => {
  const cached = await cache.match(req);
  if (cached) {
    return cached;
  }

  const res = new Response("cached at " + new Date().toISOString());
  await cache.put(req, res.clone());
  return res;
});

这是一个更复杂的示例,它缓存对外部 API 的调用

const cache = await caches.open("default");

Deno.serve(async (req: Request, ctx) => {
  const clientIp = ctx.remoteAddr.hostname;
  const cacheKey = `http://client-ip.local/${clientIp}`;
  const cached = await cache.match(cacheKey);
  if(cached) return cached;

  const res = await fetch(`https://api.country.is/${clientIp}`);
  if(!res.ok) return res;

  await cache.put(cacheKey, res.clone());
  return res;
});

请注意,Cache 目前仅在 Deno Deploy 中受支持,而 Subhosting 不支持。有关使用 Cache API 的更多信息,请参阅我们的文档,或者要查看所有可用的 Cache 方法,请参阅我们的 Cache 参考文档

缓存策略

默认情况下,缓存的数据会无限期地持久保存。虽然我们会定期扫描和删除不活跃的对象,但一个对象通常会在缓存中保留至少 30 天。

你可以使用标准的 HTTP 标头 ExpiresCache-Control 自定义对象过期时间。

// Expire after 1 hour
const res = new Response("hello cache", {
  headers: {
    "Expires": new Date(Date.now() + 3600 * 1000).toUTCString(),
  },
});
await cache.put(req, res.clone());

/// ... or use `Cache-Control`
const res = new Response("hello cache", {
  headers: {
    "Cache-Control": "max-age=3600",
  },
});
await cache.put(req, res.clone());

性能

在底层,Deno Deploy 缓存 API 由多层 日志结构合并树 (LSM) 存储引擎驱动。缓存的数据以 512KB 的“页”进行管理;根据访问频率,一个页可以驻留在 RAM、本地 NVMe SSD 或云对象存储(如 S3 或 GCS)中的一个或多个位置。缓存服务使用 io_uring 向磁盘发出 I/O 请求,当在 GCP 上的一个 本地 SSD 上运行时,对于随机 I/O 工作负载,实现了 2.4Gbps 的吞吐量和亚毫秒级延迟。

定价

在 Web Cache API 的 Beta 测试期间,它将免费提供给所有 Deno Deploy 用户。虽然我们希望保持 Cache API 免费,但我们将在整个 Beta 测试期间密切监控其使用情况和产生的成本,以确定是否需要开始收费。

如果你担心因未来可能产生的费用而不敢在 Deno Deploy 上尝试 Web Cache API,我们测量的 Cache 成本大约比 Deno KV 低 10 倍。如果我们最终对 Web Cache 收费,其比例也将类似。

如果定价仍然是你的项目的顾虑或阻碍,或者阻止你尝试 Web Cache API,请联系我们。我们很乐意了解更多关于你的用例,并找到一个适合所有人的解决方案。

下一步是什么

在我们继续改进 Web Cache API 的同时,它只是提高性能的众多工具之一。我们还在努力在 Deno Deploy 上支持 HTTP 缓存,以便你更精细地控制内容服务方式和整体性能。

🚨️ Deno 2 即将到来 🚨️

几天后,Deno 2 的第一个“候选版本”将发布。

Deno 2 中存在一些小的破坏性更改。

你将能够使用 deno upgrade rc 获取它,但是你现在就可以通过添加 DENO_FUTURE=1 环境变量来为你的代码进行面向未来的准备。