Caching
Control the Data Cache and Full Route Cache with revalidation and tags
Overview
The App Router layers several caches: the Request Memoization cache dedupes fetch calls per render, the Data Cache persists fetch results across requests, and the Full Route Cache stores rendered routes. Understanding when each applies — and how to invalidate them with time-based or on-demand revalidation — is key to serving fresh data without sacrificing performance.
Syntax / Usage
Configure caching per fetch, or invalidate on demand with revalidatePath and revalidateTag.
// Time-based revalidation (ISR): refresh at most every 60s
const res = await fetch('https://api.example.com/feed', {
next: { revalidate: 60 },
})
// Tag a request so it can be invalidated by name
const products = await fetch('https://api.example.com/products', {
next: { tags: ['products'] },
})
'use server'
import { revalidateTag } from 'next/cache'
export async function updateProduct(id: string, data: ProductInput) {
await db.product.update({ where: { id }, data })
revalidateTag('products') // purge all fetches tagged 'products'
}
Examples
Cache an expensive non-fetch computation with unstable_cache:
import { unstable_cache } from 'next/cache'
const getTopAuthors = unstable_cache(
async () => db.author.findMany({ orderBy: { sales: 'desc' }, take: 10 }),
['top-authors'],
{ revalidate: 3600, tags: ['authors'] }
)
Force a route to be dynamic, disabling the Full Route Cache:
// app/dashboard/page.tsx
export const dynamic = 'force-dynamic'
// or opt a specific fetch out: fetch(url, { cache: 'no-store' })
Common Mistakes
- Expecting
revalidatePathto update data across every deployment region instantly - Mixing
cache: 'no-store'withnext: { revalidate }on the same fetch - Forgetting that database queries are not cached in the Data Cache unless wrapped
- Assuming a page is dynamic when a cached
fetchsilently makes it static - Over-tagging or forgetting to call
revalidateTagafter a mutation, serving stale data
See Also
nextjs-data-fetching nextjs-route-handlers nextjs-server-actions