[Medium] đ HTTP Caching
1. What is HTTP caching and why is it important?â
Was ist HTTP-Caching? Warum ist es wichtig?
HTTP-Caching ist eine Technik, bei der HTTP-Antworten vorĂŒbergehend auf dem Client (Browser) oder auf Zwischenservern gespeichert werden, damit bei nachfolgenden Anfragen die gecachten Daten direkt verwendet werden können, ohne den Server erneut anzufragen.
Cache vs. temporĂ€re Speicherung: Was ist der Unterschied?â
In technischen Dokumentationen werden diese beiden Begriffe oft synonym verwendet, haben aber tatsÀchlich unterschiedliche Bedeutungen:
Cacheâ
Definition: Datenkopien, die zur Leistungsoptimierung gespeichert werden, mit Schwerpunkt auf âWiederverwendung" und âschnellerem Zugriff".
Merkmale:
- â Ziel ist die Leistungssteigerung
- â Daten können wiederholt verwendet werden
- â Klare Ablaufrichtlinien vorhanden
- â In der Regel Kopien der Originaldaten
Beispiel:
// HTTP Cache - API-Antworten cachen
Cache-Control: max-age=3600 // 1 Stunde cachen
// Memory Cache - Berechnungsergebnisse cachen
const cache = new Map();
function fibonacci(n) {
if (cache.has(n)) return cache.get(n); // Cache wiederverwenden
const result = /* Berechnung */;
cache.set(n, result);
return result;
}
Temporary Storage (TemporĂ€re Speicherung)â
Definition: VorĂŒbergehend gespeicherte Daten, mit Schwerpunkt auf âTemporalitĂ€t" und âwerden gelöscht".
Merkmale:
- â Ziel ist die vorĂŒbergehende Speicherung
- â Wird nicht unbedingt wiederverwendet
- â Lebenszyklus ist in der Regel kurz
- â Kann ZwischenzustĂ€nde enthalten
Beispiel:
// sessionStorage - Benutzereingaben temporÀr speichern
sessionStorage.setItem('formData', JSON.stringify(form)); // Wird beim SchlieĂen des Tabs gelöscht
// Datei-Upload temporÀr speichern
const tempFile = await uploadToTemp(file); // Nach Verarbeitung löschen
await processFile(tempFile);
await deleteTempFile(tempFile);
Vergleichstabelleâ
| Eigenschaft | Cache | Temporary Storage (TemporÀre Speicherung) |
|---|---|---|
| Hauptzweck | Leistungsoptimierung | VorĂŒbergehende Speicherung |
| Wiederverwendung | Ja, mehrfaches Lesen | Nicht unbedingt |
| Lebenszyklus | Richtlinienbasiert | In der Regel kurz |
| Typische Verwendung | HTTP Cache, Memory Cache | sessionStorage, temporÀre Dateien |
| Englische Entsprechung | Cache | Temp / Temporary / Buffer |
Unterschiede in der praktischen Anwendungâ
// ===== Cache-Szenarien =====
// 1. HTTP Cache: API-Antworten wiederverwenden
fetch('/api/users') // Erste Anfrage
.then((response) => response.json());
fetch('/api/users') // Zweite Anfrage aus dem Cache
.then((response) => response.json());
// 2. Berechnungsergebnisse cachen
const memoize = (fn) => {
const cache = new Map();
return (...args) => {
const key = JSON.stringify(args);
if (cache.has(key)) return cache.get(key); // Wiederverwenden
const result = fn(...args);
cache.set(key, result);
return result;
};
};
// ===== Temporary Storage-Szenarien =====
// 1. Formulardaten temporĂ€r speichern (versehentliches SchlieĂen verhindern)
window.addEventListener('beforeunload', () => {
sessionStorage.setItem('formDraft', JSON.stringify(formData));
});
// 2. Upload-Dateien temporÀr speichern
async function handleUpload(file) {
const tempPath = await uploadToTempStorage(file); // TemporÀr speichern
const processed = await processFile(tempPath);
await deleteTempFile(tempPath); // Nach Verwendung löschen
return processed;
}
// 3. Zwischenergebnisse temporÀr speichern
const tempResults = []; // Zwischenergebnisse temporÀr speichern
for (const item of items) {
tempResults.push(process(item));
}
const final = combine(tempResults); // Nach Verwendung nicht mehr benötigt
Anwendung in der Webentwicklungâ
// HTTP Cache - Langzeitspeicherung, Wiederverwendung
Cache-Control: public, max-age=31536000, immutable
// â Browser cached diese Datei ein Jahr lang und verwendet sie wieder
// sessionStorage (temporĂ€re Speicherung) - VorĂŒbergehende Speicherung, beim SchlieĂen gelöscht
sessionStorage.setItem('tempData', data);
// â Nur im aktuellen Tab gĂŒltig, wird beim SchlieĂen gelöscht
// localStorage (Langzeitspeicherung) - Zwischen beiden
localStorage.setItem('userPreferences', prefs);
// â Dauerhafte Speicherung, aber nicht zur Leistungsoptimierung
Warum ist die Unterscheidung dieser beiden Konzepte wichtig?â
-
Designentscheidungen:
- Leistungsoptimierung nötig? â Cache verwenden
- VorĂŒbergehende Speicherung nötig? â TemporĂ€re Speicherung verwenden
-
Ressourcenmanagement:
- Cache: Fokus auf Trefferquote und Ablaufrichtlinien
- TemporÀre Speicherung: Fokus auf Bereinigungszeitpunkt und KapazitÀtsgrenzen
-
Antworten im VorstellungsgesprÀch:
- âWie optimiert man die Leistung" â Cache-Strategien besprechen
- âWie behandelt man temporĂ€re Daten" â TemporĂ€re Speicherlösungen besprechen
In diesem Artikel besprechen wir hauptsÀchlich Cache, insbesondere den HTTP-Caching-Mechanismus.
Vorteile von Cachingâ
- Reduzierung von Netzwerkanfragen: Direkt aus dem lokalen Cache lesen, keine HTTP-Anfragen senden
- Verringerung der Serverlast: Weniger Anfragen, die der Server verarbeiten muss
- Schnellere Seitenladezeiten: Lokaler Cache-Zugriff ist viel schneller als Netzwerkanfragen
- Bandbreiteneinsparung: Reduzierte DatenĂŒbertragung
- Verbesserte Benutzererfahrung: Schnellere Seitenreaktionen, flĂŒssigere Nutzung
Cache-Typenâ
âââââââââââââââââââââââââââââââââââââââ
â Browser-Cache-Hierarchie â
âââââââââââââââââââââââââââââââââââââââ€
â 1. Memory Cache (Speicher-Cache) â
â - Am schnellsten, geringe â
â KapazitĂ€t â
â - Wird beim SchlieĂen des â
â Tabs gelöscht â
âââââââââââââââââââââââââââââââââââââââ€
â 2. Disk Cache (Festplatten-Cache) â
â - Langsamer, groĂe KapazitĂ€t â
â - Dauerhafte Speicherung â
âââââââââââââââââââââââââââââââââââââââ€
â 3. Service Worker Cache â
â - Volle Kontrolle durch â
â Entwickler â
â - UnterstĂŒtzung fĂŒr Offline- â
â Anwendungen â
âââââââââââââââââââââââââââââââââââââââ
2. What are the HTTP caching strategies?â
Welche HTTP-Caching-Strategien gibt es?
Klassifizierung der Cache-Strategienâ
HTTP-Caching-Strategien
âââ Starker Cache (Strong Cache)
â âââ Cache-Control
â âââ Expires
âââ Verhandlungs-Cache (Negotiation Cache)
âââ Last-Modified / If-Modified-Since
âââ ETag / If-None-Match
1. Starker Cache (Strong Cache / Fresh)â
Merkmal: Der Browser liest direkt aus dem lokalen Cache, ohne eine Anfrage an den Server zu senden.
Cache-Control (HTTP/1.1)â
Cache-Control: max-age=3600
HĂ€ufig verwendete Direktiven:
// 1. max-age: Cache-GĂŒltigkeitsdauer (Sekunden)
Cache-Control: max-age=3600 // 1 Stunde cachen
// 2. no-cache: Servervalidierung erforderlich (Verhandlungs-Cache verwenden)
Cache-Control: no-cache
// 3. no-store: Ăberhaupt nicht cachen
Cache-Control: no-store
// 4. public: Kann von jedem Cache gespeichert werden (Browser, CDN)
Cache-Control: public, max-age=31536000
// 5. private: Nur vom Browser cachbar
Cache-Control: private, max-age=3600
// 6. immutable: Ressource Àndert sich nie (mit Hash-Dateiname)
Cache-Control: public, max-age=31536000, immutable
// 7. must-revalidate: Nach Ablauf muss beim Server validiert werden
Cache-Control: max-age=3600, must-revalidate
Expires (HTTP/1.0, veraltet)â
Expires: Wed, 21 Oct 2025 07:28:00 GMT
Probleme:
- Verwendet absolute Zeit, abhÀngig von der Client-Zeit
- Ungenaue Client-Zeit fĂŒhrt zu fehlerhaftem Cache-Verhalten
- Wurde durch
Cache-Controlersetzt
2. Verhandlungs-Cache (Negotiation Cache / Validation)â
Merkmal: Der Browser sendet eine Anfrage an den Server, um zu prĂŒfen, ob die Ressource aktualisiert wurde.
Last-Modified / If-Modified-Sinceâ
# Serverantwort (erste Anfrage)
Last-Modified: Wed, 21 Oct 2024 07:28:00 GMT
# Browseranfrage (nachfolgende Anfrage)
If-Modified-Since: Wed, 21 Oct 2024 07:28:00 GMT
Ablauf:
- Erste Anfrage: Server sendet
Last-Modified - Nachfolgende Anfrage: Browser sendet
If-Modified-Since - Ressource nicht geÀndert: Server antwortet mit
304 Not Modified - Ressource geÀndert: Server antwortet mit
200 OKund neuer Ressource
ETag / If-None-Matchâ
# Serverantwort (erste Anfrage)
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
# Browseranfrage (nachfolgende Anfrage)
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Vorteile:
- Genauer als
Last-Modified - Nicht zeitabhÀngig, verwendet Inhalts-Hash
- Kann Ănderungen unterhalb der Sekundenebene erkennen
Last-Modified vs ETagâ
| Eigenschaft | Last-Modified | ETag |
|---|---|---|
| Genauigkeit | Sekundenebene | Inhalts-Hash, genauer |
| Leistung | Schneller | Hash-Berechnung nötig, langsamer |
| Anwendungsfall | Allgemeine statische Ressourcen | Ressourcen mit prÀziser Kontrolle |
| PrioritÀt | Niedrig | Hoch (ETag hat Vorrang) |
3. How does browser caching work?â
Wie funktioniert Browser-Caching?
VollstĂ€ndiger Cache-Ablaufâ
ââââââââââââââââââââââââââââââââââââââââââââââââ
â Browser-Ressourcenanfrage-Ablauf â
ââââââââââââââââââââââââââââââââââââââââââââââââ
â
1. Memory Cache prĂŒfen
â
âââââââââŽâââââââââ
â Cache gefunden? â
âââââââââŹâââââââââ
Yes â No
â
2. Disk Cache prĂŒfen
â
âââââââââŽâââââââââ
â Cache gefunden? â
âââââââââŹâââââââââ
Yes â No
â
3. Service Worker prĂŒfen
â
âââââââââŽâââââââââ
â Cache gefunden? â
âââââââââŹâââââââââ
Yes â No
â
4. Cache-Ablauf prĂŒfen
â
âââââââââŽâââââââââ
â Abgelaufen? â
âââââââââŹâââââââââ
Yes â No
â
5. Verhandlungs-Cache validieren
â
âââââââââŽâââââââââ
â Ressource â
â geĂ€ndert? â
âââââââââŹâââââââââ
Yes â No (304)
â
6. Neue Ressource vom Server anfragen
â
âââââââââŽâââââââââ
â Neue Ressource â
â zurĂŒckgeben â
â (200 OK) â
ââââââââââââââââââ
Praktisches Beispielâ
// Erste Anfrage
GET /api/data.json
Response:
200 OK
Cache-Control: max-age=3600
ETag: "abc123"
{ data: "..." }
// ========== Erneute Anfrage innerhalb 1 Stunde ==========
// Starker Cache: Direkt lokal lesen, keine Anfrage senden
// Status: 200 OK (from disk cache)
// ========== Erneute Anfrage nach 1 Stunde ==========
// Verhandlungs-Cache: Validierungsanfrage senden
GET /api/data.json
If-None-Match: "abc123"
// Ressource nicht geÀndert
Response:
304 Not Modified
(Kein Body, lokalen Cache verwenden)
// Ressource geÀndert
Response:
200 OK
ETag: "def456"
{ data: "new data" }
4. What are the common caching strategies?â
Welche gÀngigen Cache-Strategien gibt es?
1. Permanente Cache-Strategie (fĂŒr statische Ressourcen)â
// HTML: Nicht cachen, jedes Mal prĂŒfen
Cache-Control: no-cache
// CSS/JS (mit Hash): Permanent cachen
Cache-Control: public, max-age=31536000, immutable
// Dateiname: main.abc123.js
Prinzip:
- HTML wird nicht gecacht, damit Benutzer die neueste Version erhalten
- CSS/JS verwenden Hash-Dateinamen, bei InhaltsÀnderung Àndert sich der Dateiname
- Alte Versionen werden nicht verwendet, neue Versionen werden neu heruntergeladen
2. Strategie fĂŒr hĂ€ufig aktualisierte Ressourcenâ
// API-Daten: Kurzzeit-Cache + Verhandlungs-Cache
Cache-Control: max-age=60, must-revalidate
ETag: "abc123"
3. Strategie fĂŒr Bildressourcenâ
// Benutzer-Avatar: Mittelfristiger Cache
Cache-Control: public, max-age=86400 // 1 Tag
// Logo, Icons: Langfristiger Cache
Cache-Control: public, max-age=2592000 // 30 Tage
// Dynamische Bilder: Verhandlungs-Cache
Cache-Control: no-cache
ETag: "image-hash"
4. Cache-Empfehlungen nach Ressourcentypâ
const cachingStrategies = {
// HTML-Dateien
html: 'Cache-Control: no-cache',
// Statische Ressourcen mit Hash
staticWithHash: 'Cache-Control: public, max-age=31536000, immutable',
// Selten aktualisierte statische Ressourcen
staticAssets: 'Cache-Control: public, max-age=2592000',
// API-Daten
apiData: 'Cache-Control: private, max-age=60',
// Benutzerspezifische Daten
userData: 'Cache-Control: private, no-cache',
// Sensible Daten
sensitive: 'Cache-Control: no-store',
};
5. Service Worker cachingâ
Service Worker Caching
Service Worker bieten die flexibelste Cache-Kontrolle, bei der Entwickler die Cache-Logik vollstÀndig kontrollieren können.
Grundlegende Verwendungâ
// Service Worker registrieren
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js');
}
// sw.js - Service Worker-Datei
const CACHE_NAME = 'my-app-v1';
const urlsToCache = [
'/',
'/styles/main.css',
'/scripts/main.js',
'/images/logo.png',
];
// Install-Event: Statische Ressourcen cachen
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(urlsToCache);
})
);
});
// Anfrage abfangen: Cache-Strategie verwenden
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
// Cache-First-Strategie
return response || fetch(event.request);
})
);
});
// Activate-Event: Alten Cache bereinigen
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames.map((cacheName) => {
if (cacheName !== CACHE_NAME) {
return caches.delete(cacheName);
}
})
);
})
);
});
GĂ€ngige Cache-Strategienâ
1. Cache First (Cache zuerst)â
// Geeignet fĂŒr: Statische Ressourcen
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
return response || fetch(event.request);
})
);
});
2. Network First (Netzwerk zuerst)â
// Geeignet fĂŒr: API-Anfragen
self.addEventListener('fetch', (event) => {
event.respondWith(
fetch(event.request)
.then((response) => {
// Cache aktualisieren
const responseClone = response.clone();
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, responseClone);
});
return response;
})
.catch(() => {
// Netzwerk fehlgeschlagen, Cache verwenden
return caches.match(event.request);
})
);
});
3. Stale While Revalidate (Veraltet wĂ€hrend der Revalidierung)â
// Geeignet fĂŒr: Ressourcen, die schnelle Antworten brauchen, aber aktuell bleiben sollen
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request).then((cachedResponse) => {
const fetchPromise = fetch(event.request).then((networkResponse) => {
caches.open(CACHE_NAME).then((cache) => {
cache.put(event.request, networkResponse.clone());
});
return networkResponse;
});
// Cache zurĂŒckgeben, im Hintergrund aktualisieren
return cachedResponse || fetchPromise;
})
);
});
6. How to implement cache busting?â
Wie implementiert man Cache Busting?
Cache Busting ist eine Technik, die sicherstellt, dass Benutzer die neuesten Ressourcen erhalten.
Methode 1: Dateiname mit Hash (empfohlen)â
// Bundling-Tools wie Webpack/Vite verwenden
// Ausgabe: main.abc123.js
// webpack.config.js
module.exports = {
output: {
filename: '[name].[contenthash].js',
},
};
<!-- Referenz automatisch aktualisieren -->
<script src="/js/main.abc123.js"></script>
Vorteile:
- â Dateiname Ă€ndert sich, erzwingt den Download der neuen Datei
- â Alte Version bleibt im Cache, keine Verschwendung
- â Best Practice
Methode 2: Query String Versionsnummerâ
<!-- Versionsnummer manuell aktualisieren -->
<script src="/js/main.js?v=1.2.3"></script>
<link rel="stylesheet" href="/css/style.css?v=1.2.3" />
Nachteile:
- â Einige CDNs cachen keine Ressourcen mit Query String
- â Manuelle Versionsverwaltung erforderlich
Methode 3: Zeitstempelâ
// FĂŒr die Entwicklungsumgebung
const timestamp = Date.now();
const script = document.createElement('script');
script.src = `/js/main.js?t=${timestamp}`;
document.body.appendChild(script);
Verwendung:
- Cache in der Entwicklungsumgebung vermeiden
- Nicht fĂŒr die Produktionsumgebung geeignet (jedes Mal eine neue Anfrage)
7. Common caching interview questionsâ
HĂ€ufige Caching-Interviewfragen
Frage 1: Wie verhindert man, dass HTML gecacht wird?â
Klicken Sie, um die Antwort anzuzeigen
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Oder mit Meta-Tags:
<meta
http-equiv="Cache-Control"
content="no-cache, no-store, must-revalidate"
/>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
Frage 2: Warum sollte man ETag verwenden und nicht nur Last-Modified?â
Klicken Sie, um die Antwort anzuzeigen
Vorteile von ETag:
- Genauer: Kann Ănderungen unterhalb der Sekundenebene erkennen
- Inhaltsgesteuert: Basiert auf Inhalts-Hash, nicht auf Zeit
- Zeitprobleme vermeiden:
- Dateiinhalt hat sich nicht geÀndert, aber die Zeit schon (z.B. bei Re-Deployment)
- Zyklisch aktualisierte Ressourcen (kehren periodisch zum gleichen Inhalt zurĂŒck)
- Verteilte Systeme: Zeiten verschiedener Server sind möglicherweise nicht synchron
Beispiel:
// Dateiinhalt hat sich nicht geÀndert, aber Last-Modified schon
// 2024-01-01 12:00 - Version A deployen (Inhalt: abc)
// 2024-01-02 12:00 - Version A erneut deployen (Inhalt: abc)
// Last-Modified hat sich geÀndert, aber der Inhalt ist gleich!
// ETag hat dieses Problem nicht
ETag: 'hash-of-abc'; // Immer gleich
Frage 3: Was ist der Unterschied zwischen from disk cache und from memory cache?â
Klicken Sie, um die Antwort anzuzeigen
| Eigenschaft | Memory Cache | Disk Cache |
|---|---|---|
| Speicherort | Arbeitsspeicher (RAM) | Festplatte |
| Geschwindigkeit | Extrem schnell | Langsamer |
| KapazitÀt | Klein (MB-Bereich) | Groà (GB-Bereich) |
| Persistenz | Beim Tab-SchlieĂen gelöscht | Dauerhafte Speicherung |
| PrioritÀt | Hoch (bevorzugt) | Niedrig |
Ladereihenfolge:
1. Memory Cache (am schnellsten)
2. Service Worker Cache
3. Disk Cache
4. HTTP Cache
5. Netzwerkanfrage (am langsamsten)
Auslösebedingungen:
- Memory Cache: KĂŒrzlich aufgerufene Ressourcen (z.B. Seite neu laden)
- Disk Cache: Ressourcen, die vor lĂ€ngerer Zeit aufgerufen wurden, oder groĂe Dateien
Frage 4: Wie erzwingt man das Neuladen von Ressourcen im Browser?â
Klicken Sie, um die Antwort anzuzeigen
Entwicklungsphase:
// 1. Hard Reload (Ctrl/Cmd + Shift + R)
// 2. Cache leeren und neu laden
// 3. Zeitstempel im Code hinzufĂŒgen
const script = document.createElement('script');
script.src = `/js/main.js?t=${Date.now()}`;
Produktionsumgebung:
// 1. Dateiname mit Hash verwenden (Best Practice)
main.abc123.js // Von Webpack/Vite automatisch generiert
// 2. Versionsnummer aktualisieren
<script src="/js/main.js?v=2.0.0"></script>
// 3. Cache-Control setzen
Cache-Control: no-cache // Validierung erzwingen
Cache-Control: no-store // Ăberhaupt nicht cachen
Frage 5: Wie implementiert man PWA Offline-Caching?â
Klicken Sie, um die Antwort anzuzeigen
// sw.js - Service Worker
const CACHE_NAME = 'pwa-v1';
const OFFLINE_URL = '/offline.html';
// Bei Installation Offline-Seite cachen
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll([
OFFLINE_URL,
'/styles/offline.css',
'/images/offline-icon.png',
]);
})
);
});
// Anfrage abfangen
self.addEventListener('fetch', (event) => {
if (event.request.mode === 'navigate') {
event.respondWith(
fetch(event.request).catch(() => {
// Netzwerk fehlgeschlagen, Offline-Seite anzeigen
return caches.match(OFFLINE_URL);
})
);
}
});
VollstÀndige PWA Cache-Strategie:
// 1. Statische Ressourcen cachen
caches.addAll(['/css/', '/js/', '/images/']);
// 2. API-Anfragen: Network First
// 3. Bilder: Cache First
// 4. HTML: Network First, bei Fehler Offline-Seite anzeigen
8. Best practicesâ
Best Practices
â Empfohlene Vorgehensweisenâ
// 1. HTML - Nicht cachen, sicherstellen, dass Benutzer die neueste Version erhalten
// Response Headers:
Cache-Control: no-cache
// 2. CSS/JS (mit Hash) - Permanent cachen
// Dateiname: main.abc123.js
Cache-Control: public, max-age=31536000, immutable
// 3. Bilder - Langfristig cachen
Cache-Control: public, max-age=2592000 // 30 Tage
// 4. API-Daten - Kurzfristiger Cache + Verhandlungs-Cache
Cache-Control: private, max-age=60
ETag: "api-response-hash"
// 5. Service Worker fĂŒr Offline-UnterstĂŒtzung implementieren
â Zu vermeidende Vorgehensweisenâ
// â Schlecht: HTML mit langfristigem Cache
Cache-Control: max-age=31536000 // Benutzer sehen möglicherweise alte Version
// â Schlecht: Expires statt Cache-Control verwenden
Expires: Wed, 21 Oct 2025 07:28:00 GMT // HTTP/1.0, veraltet
// â Schlecht: Ăberhaupt keinen Cache setzen
// Ohne Cache-Header ist das Browserverhalten unbestimmt
// â Schlecht: Gleiche Strategie fĂŒr alle Ressourcen
Cache-Control: max-age=3600 // Sollte je nach Ressourcentyp angepasst werden
Cache-Strategie-Entscheidungsbaumâ
Statische Ressource?
ââ Ja â Dateiname hat Hash?
â ââ Ja â Permanenter Cache (max-age=31536000, immutable)
â ââ Nein â Mittel- bis langfristiger Cache (max-age=2592000)
ââ Nein â Ist es HTML?
ââ Ja â Nicht cachen (no-cache)
ââ Nein â Ist es eine API?
ââ Ja â Kurzfristiger Cache + Verhandlung (max-age=60, ETag)
ââ Nein â Je nach AktualisierungshĂ€ufigkeit entscheiden