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 头 Expires
和 Cache-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
环境变量来让您的代码面向未来。