在 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 标头 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 上运行时,对于随机 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
环境变量来为你的代码进行面向未来的准备。