Cache ist der effektivste Weg, eine Anwendung zu beschleunigen. Aber schlechte Cache-Invalidierung ist eines der schwierigsten Probleme in der Informatik.
Strategien¶
- Cache-aside: Anwendung liest/schreibt Cache explizit
- Write-through: Schreibt gleichzeitig in Cache und DB
- Write-behind: Schreibt in Cache, asynchron in DB
- Read-through: Cache lädt automatisch aus der DB
HTTP-Cache-Header¶
Caching-Strategien¶
Cache-Control: public, max-age=31536000, immutable
API-Response — kurzer Cache¶
Cache-Control: private, max-age=60
Validierung mit ETag¶
ETag: “abc123” If-None-Match: “abc123” # 304 Not Modified
Cache-aside-Pattern¶
async def get_product(product_id):
1. Cache prüfen¶
cached = await redis.get(f”product:{product_id}”) if cached: return json.loads(cached)
2. Cache Miss — aus DB laden¶
product = await db.products.find(product_id)
3. Im Cache speichern¶
await redis.setex(f”product:{product_id}”, 3600, json.dumps(product)) return product
Wichtigste Erkenntnis¶
Cache-aside für die meisten Anwendungsfälle. HTTP-Cache-Header für CDN. Invalidierung ist schwieriger als gedacht — TTL ist am einfachsten.