Caching Architecture

Back

Loading concept...

🏪 The Library That Never Forgets: Next.js Caching Architecture

Imagine you run a magical library. Every time someone asks for a book, you could:

  1. Run to the warehouse (slow! 🐢)
  2. Check if you already have it on your desk (fast! 🚀)

Next.js caching is like having multiple desks at different spots in your library — each one remembering things so you don’t have to run to the warehouse every time!


🎯 The Big Picture: Four Magic Desks

graph TD A["User Asks for Data"] --> B["🧠 Request Memoization"] B --> C["📦 Data Cache"] C --> D["🏠 Full Route Cache"] D --> E["🧭 Router Cache"] E --> F["User Sees Page Fast!"]

Think of it like this:

  • Request Memoization = Your personal sticky note (lasts a few seconds)
  • Data Cache = The library’s filing cabinet (lasts a long time)
  • Full Route Cache = Pre-made gift boxes (ready to go!)
  • Router Cache = Your browser’s memory (remembers where you’ve been)

🧠 Request Memoization: The Sticky Note

What is it?

Imagine you’re making a birthday card. You need to write “Happy Birthday” three times. Do you:

  • A) Look up how to spell “Birthday” THREE times? 🙄
  • B) Look it up ONCE, remember it, write it three times? ✅

Request Memoization = Option B!

When your page needs the same data multiple times during ONE request, Next.js remembers it automatically.

Simple Example

// In your page, you call this:
async function getUser(id) {
  const res = await fetch(
    `https://api.com/user/${id}`
  );
  return res.json();
}

// Page calls it twice:
const user1 = await getUser(1);
const user2 = await getUser(1); // Same ID!
// Result: Only ONE fetch happens! 🎉

When Does It Work?

✅ Works ❌ Doesn’t Work
Same URL Different URLs
Same request Different methods
GET requests POST requests

💡 Key Point

Sticky notes get thrown away when you finish your task. Request Memoization only lasts for ONE page render!


📦 Data Cache: The Filing Cabinet

What is it?

Your library has a filing cabinet. When you find a book’s information, you save a copy there. Next time anyone asks? Just open the drawer!

Data Cache = Saves fetch results on the server — even between different users!

Simple Example

// This result gets saved automatically!
const data = await fetch(
  'https://api.com/products'
);

// Want fresh data instead?
const fresh = await fetch(
  'https://api.com/products',
  { cache: 'no-store' }
);

How Long Does It Last?

// Forever (until you rebuild)
fetch(url);

// Revalidate every 60 seconds
fetch(url, {
  next: { revalidate: 60 }
});

// Never cache
fetch(url, { cache: 'no-store' });
graph TD A["First Request"] --> B{Data in Cache?} B -->|No| C["Fetch from API"] C --> D["Save to Cache"] D --> E["Return Data"] B -->|Yes| F{Still Fresh?} F -->|Yes| E F -->|No| C

🏠 Full Route Cache: Pre-Made Gift Boxes

What is it?

Imagine wrapping the same birthday gift 100 times. Exhausting! 😓

What if you could wrap it ONCE and make copies? 🎁

Full Route Cache = Next.js pre-builds your pages so it doesn’t have to build them again!

How It Works

At build time, Next.js:

  1. Renders your static pages
  2. Saves the HTML and React Server Component Payload
  3. Serves these pre-made boxes instantly!
graph TD A["Build Time"] --> B["Render Page"] B --> C["Save HTML"] B --> D["Save RSC Payload"] E["User Visit"] --> F{Page Cached?} F -->|Yes| G["Serve Instantly! ⚡"] F -->|No| H["Render Fresh"]

What Gets Cached?

Cached at Build NOT Cached
Static pages Dynamic routes
Pages with no dynamic data Pages with cookies/headers
generateStaticParams pages Pages with searchParams

Simple Example

// This page gets cached at build!
export default function About() {
  return <h1>About Us</h1>;
}

// This page is dynamic (not cached)
export default function Profile() {
  const user = cookies().get('user');
  return <h1>Hi {user}</h1>;
}

🧭 Router Cache: Your Browser’s Memory

What is it?

You visit your friend’s house. You remember the way, right? You don’t need a map the second time!

Router Cache = Your browser remembers pages you visited so going back is instant!

How It Works

When you navigate in a Next.js app:

  1. First visit → Fetches from server
  2. Second visit → Uses cached version
  3. Back button → Instant! ⚡
graph TD A["Click Link"] --> B{Page in Browser Cache?} B -->|Yes| C["Show Instantly!"] B -->|No| D["Fetch from Server"] D --> E["Save to Cache"] E --> C

Cache Duration

Type Duration
Dynamic pages 30 seconds
Static pages 5 minutes
Prefetched pages 5 minutes

💡 Key Point

The Router Cache lives in the browser, not the server! It resets when you refresh the page.


🚪 Opting Out of Caching

Sometimes you NEED fresh data. Like checking if the pizza shop is still open!

Method 1: No-Store Fetch

// Tell fetch to skip the cache
const data = await fetch(url, {
  cache: 'no-store'
});

Method 2: Dynamic Route Segment

// At the top of your page/layout
export const dynamic = 'force-dynamic';

Method 3: Revalidate on Demand

// In a Server Action or Route Handler
import { revalidatePath } from
  'next/cache';

revalidatePath('/products');

Method 4: Revalidate Tags

// When fetching, add a tag
fetch(url, {
  next: { tags: ['products'] }
});

// Later, invalidate that tag
import { revalidateTag } from
  'next/cache';

revalidateTag('products');

Quick Reference

I Want To… Use This
Never cache this fetch cache: 'no-store'
Make whole page dynamic dynamic = 'force-dynamic'
Refresh after X seconds revalidate: X
Refresh on demand revalidatePath()
Refresh specific data revalidateTag()

🎬 The Complete Picture

graph TD A["User Requests Page"] --> B["🧭 Router Cache"] B -->|Hit| Z["Show Page Instantly"] B -->|Miss| C["🏠 Full Route Cache"] C -->|Hit| Z C -->|Miss| D["Render Page"] D --> E["🧠 Request Memoization"] E --> F["📦 Data Cache"] F -->|Hit| G["Use Cached Data"] F -->|Miss| H["Fetch from API"] H --> I["Save to Data Cache"] G --> J["Finish Rendering"] I --> J J --> K["Save to Full Route Cache"] K --> L["Save to Router Cache"] L --> Z

🌟 Remember This!

Cache Layer Where? Lasts? What?
🧠 Request Memo Server 1 request Duplicate fetches
📦 Data Cache Server Forever* Fetch results
🏠 Full Route Server Forever* Built pages
🧭 Router Cache Browser 30s-5min Visited pages

*Until revalidated or rebuilt


🎯 One Last Analogy

Think of visiting a coffee shop:

  1. Router Cache = You remember your usual order (browser memory)
  2. Full Route Cache = They have pre-made drinks ready (pre-built pages)
  3. Data Cache = They remember today’s specials (cached API data)
  4. Request Memoization = Barista doesn’t ask your name twice in one order (same request)

You now understand Next.js caching! 🎉

The key is knowing WHICH cache to use for WHAT situation. Fresh data? Opt out. Static content? Let it cache. Going back and forth? Router cache saves the day!


You’ve got this! Caching makes your app FAST, and now you know exactly how it works. 🚀

Loading story...

Story - Premium Content

Please sign in to view this story and start learning.

Upgrade to Premium to unlock full access to all stories.

Stay Tuned!

Story is coming soon.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.