Skip to main content
Introducing Web Cache API support on Deno Deploy

Introducing Web Cache API support on Deno Deploy

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.

🚨️ 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:

// 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());

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.