惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
aimingoo的专栏
aimingoo的专栏
Microsoft Azure Blog
Microsoft Azure Blog
A
About on SuperTechFans
J
Java Code Geeks
G
Google Developers Blog
N
Netflix TechBlog - Medium
Vercel News
Vercel News
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
I
InfoQ
Stack Overflow Blog
Stack Overflow Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
罗磊的独立博客
GbyAI
GbyAI
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

Deno

Deno 2.8 | Deno Claw Patrol: an open-source security firewall for agents | Deno Fresh 2.3: Zero JS by default, View Transitions, and Temporal support | Deno Deno 2.7: Temporal API, Windows ARM, and npm overrides | Deno Build a dinosaur runner game with Deno, pt. 6 | Deno Build a dinosaur runner game with Deno, pt. 5 | Deno Deno Deploy is Generally Available | Deno Introducing Deno Sandbox | Deno Build a dinosaur runner game with Deno, pt. 4 | Deno Build a dinosaur runner game with Deno, pt. 3 | Deno Build a dinosaur runner game with Deno, pt. 2 | Deno React / Next.js Denial-of-Service Vulnerability: Deno Deploy users protected | Deno Deno 2.6: dx is the new npx | Deno Build a dinosaur runner game with Deno, pt. 1 | Deno React Server Functions / Next.js Vulnerability: Deno Deploy users protected | Deno My highlights from the new Deno Deploy | Deno Deno's Other Open Source Projects | Deno How Deno protects against npm exploits | Deno Help Us Raise $200k to Free JavaScript from Oracle | Deno Deno 2.5: Permissions in the config file | Deno Fresh 2.0 Graduates to Beta, Adds Vite Support | Deno Deno 2.4: deno bundle is back | Deno JavaScript™ Trademark Update | Deno What's coming to JavaScript | Deno A brief history of JavaScript | Deno Reports of Deno's Demise Have Been Greatly Exaggerated | Deno An Update on Fresh | Deno How Plaid migrated 100 services to a new database platform 5x faster with Deno | Deno Deno 2.3: Improved deno compile, local npm packages, and more | Deno Add JSR packages with pnpm and Yarn | Deno
Introducing Web Cache API support on Deno Deploy | Deno
2024-08-27 · via Deno

Building a performant API, server, or function should not be complicated. Deno Deploy hosts your code close to your users around the world to minimize latency, and provides a simple KV cloud primitive that reads data from the closest data center, all with just a few clicks or keystrokes.

Today, we’re thrilled to give you even more control over performance with beta support for the Web Cache API in Deno Deploy. Much like the web standard Cache API available in modern browsers, this API offers semi-persistent storage for Request/Response pairs, enabling you to cache network requests and provide fast responses.

In this blog post, we’ll go over how to use the Cache API, what to expect from performance, some details on pricing, and more.

  • Using the Cache API
  • Cache Policy
  • Performance
  • Pricing
  • What’s next

🚨️ Host secure, performant JavaScript or TypeScript in the cloud in less than five minutes on Deno Deploy. Sign up for a free account today. 🚨️

Using the Cache API

In order to use the Cache API, you first open a cache with caches.open() method, which returns a Promise that resolves with the Cache object.

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

To retrieve from cache, you can use the cache.match() method, which accepts a Request object as a parameter.

const cachedResponse = await cache.match(request);

Finally, to add a new Request/Response object pair into cache, you can use cache.put():

await cache.put(req, res);

In practice, your web server with the new cache capabilities might look something like this:

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;
});

Here’s a more sophisticated example that caches a call to an external 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;
});

Note that Cache is currently only supported for Deno Deploy and not Subhosting. For more information on using the Cache API, please refer to our documentation or to see all available Cache methods, please refer to our Cache reference documentation.

Cache Policy

By default, cached data is persisted for an indefinite period of time. While we periodically scan and delete inactive objects, an object is usually kept in cache for at least 30 days.

You can customize object expiration with standard HTTP headers Expires and Cache-Control:


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


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

Performance

Under the hood, the Deno Deploy cache API is powered by a multi-tier log-structured merge-tree (LSM) storage engine. Cached data is managed as 512KB “pages”; depending on frequency of access, a page can reside in one or more locations among RAM, local NVMe SSD, or a cloud object store like S3 or GCS. The cache service issues I/O requests to the disk using io_uring, achieving 2.4Gbps throughput and sub-millisecond latency for random I/O workloads when running on one local SSD on GCP.

Pricing

During Web Cache API’s beta period, it will be available for all Deno Deploy users at no cost. While we hope to keep the Cache API free, we’ll closely monitor its usage and incurred costs throughout this beta period to determine if we need to start charging.

If you’re concerned about trying out the Web Cache API on Deno Deploy due to potential costs later, our measured cost of Cache is about 10x lower than that of Deno KV. In the event we end up charging for Web Cache, it will be in a similar ratio.

If pricing remains a concern or blocker for your project or preventing you from trying the Web Cache API, please get in touch. We’d love to learn more about your use case and find a solution that works for everyone.

What’s next

While we continue to improve the Web Cache API, it’s just one of many tools to improve performance. We’re also working to support HTTP caching on Deno Deploy, offering you even more fine grained control over how you serve content and overall performance.

🚨️ Deno 2 is right around the corner 🚨️

In a few days the first “Release Candidate” of Deno 2 will be released.

There are some minor breaking changes in Deno 2.

You’ll be able to get it using deno upgrade rc, but you can already future proof your code by adding the DENO_FUTURE=1 env var today.