Caching-Strategie
Regeln
- Cache auf jeder Ebene: Browser (Cache-Control), CDN (Edge), Anwendung (Redis), Datenbank (Query-Cache)
- Verwende
stale-while-revalidate für Inhalte, die leicht veraltet sein dürfen – schnell ausliefern, im Hintergrund aktualisieren
- Cache-Control-Header:
public, max-age=31536000, immutable für gehashte statische Assets; public, s-maxage=60, stale-while-revalidate=300 für dynamische Seiten
- Redis-Caching: in JSON serialisieren, TTL für jeden Schlüssel setzen, namensbasierte Schlüssel verwenden (
cache:users:123)
- React Query / TanStack Query:
staleTime (wie lange Daten frisch sind) und gcTime (wie lange sie im Speicher bleiben) setzen
- Bei Schreibvorgängen invalidieren – wenn sich Daten ändern, den Cache-Eintrag sofort löschen oder aktualisieren
- Cache-Aside-Muster verwenden: zuerst Cache prüfen, bei Fehlschlag aus der Quelle holen, in den Cache schreiben
- Für Next.js: ISR (
revalidate), unstable_cache und Fetch-Cache für Server-Komponenten nutzen
- Tag-basierte Invalidierung: Cache-Einträge nach Entitätstyp taggen, bei Mutation alle Einträge für ein Tag invalidieren
Muster
async function getCachedUser(id: string) {
const cached = await redis.get(`user:${id}`);
if (cached) return JSON.parse(cached);
const user = await db.user.findUnique({ where: { id } });
await redis.set(`user:${id}`, JSON.stringify(user), "EX", 3600);
return user;
}
Vermeiden
- Caching ohne TTL – veraltete Daten bleiben unbegrenzt bestehen
- Benutzerspezifische Daten im gemeinsam genutzten CDN-Cache zwischenspeichern –
private oder Vary-Header verwenden
- Cache-Stampede: Locking oder
stale-while-revalidate verwenden, um Überlastung zu vermeiden
- Fehlerantworten cachen – nur erfolgreiche Ergebnisse cachen