Deno Deploy现已支持Web缓存API
构建高性能API、服务器或函数不应该复杂。 Deno Deploy 托管您的代码 靠近全球各地的用户以最大程度地减少延迟,并提供 简单的KV云基本原语,该原语 从最近的数据中心读取数据,这一切只需点击或键入几下。
今天,我们很高兴通过 **Deno Deploy 中对 Web 缓存 API 的 beta 支持**,让您对性能有更多控制。与现代浏览器中提供的 Web 标准 缓存 API 类似,此 API 为请求/响应对提供半持久性存储,使您能够缓存网络请求并提供快速响应。
在本博文中,我们将介绍如何使用缓存 API、性能预期、定价详情等。
🚨️ 在 Deno Deploy 上,只需五分钟即可在云端托管安全、高性能的 JavaScript 或 TypeScript。 立即注册免费帐户。 🚨️
使用缓存 API
要使用缓存 API,您首先需要使用 caches.open()
方法打开一个缓存,该方法返回一个 Promise
,该 Promise
会解析为 Cache
对象。
const cache = await caches.open("my-cache");
要从缓存中检索,您可以使用 cache.match()
方法,该方法接受一个 Request
对象作为参数。
const cachedResponse = await cache.match(request);
最后,要将新的请求/响应对象对添加到缓存中,您可以使用 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;
});
请注意,缓存目前仅支持 Deno Deploy,而不支持 Subhosting。有关使用缓存 API 的更多信息,请参阅我们的 文档,或者要查看所有可用的缓存方法,请参阅 我们的缓存参考文档。
缓存策略
默认情况下,缓存数据会永久保存。虽然我们会定期扫描和删除不活动的项目,但项目通常会在缓存中保留至少 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 缓存 API 的 beta 期间,所有 Deno Deploy 用户都可以免费使用。虽然我们希望保持缓存 API 免费,但我们将在此 beta 期间密切关注其使用情况和产生的成本,以确定是否需要开始收费。
如果您担心在 Deno Deploy 上试用 Web 缓存 API 会在以后产生潜在的成本,那么我们测量的缓存成本大约是 Deno KV 成本的 1/10。如果我们最终对 Web 缓存收费,它将与该比率相似。
如果定价仍然是您项目的担忧或障碍,或阻止您试用 Web 缓存 API,请联系我们。我们希望了解您的用例,并找到对每个人都有效的解决方案。
下一步
虽然我们一直在改进 Web 缓存 API,但它只是提高性能的众多工具之一。我们还致力于在 Deno Deploy 上支持 HTTP 缓存,为您提供更多对如何提供内容和整体性能的细粒度控制。
🚨️ Deno 2 即将推出 🚨️
几天后,Deno 2 的第一个“发布候选版”将发布。
Deno 2 中有一些较小的重大变更。
您可以使用
deno upgrade rc
获取它,但您现在就可以通过添加DENO_FUTURE=1
环境变量来使您的代码面向未来。