跳到主要内容
Deno 2.4 发布,带来了 deno bundle、bytes/text imports、稳定的 OTel 以及更多新特性
了解更多
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,该 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 上运行时,可实现 2.4Gbps 的吞吐量和亚毫秒级的随机 I/O 工作负载延迟。

定价

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

如果您担心 Web Cache API 在 Deno Deploy 上未来可能产生费用,我们测得的 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 环境变量来让您的代码面向未来。