Cache je nejefektivnější způsob zrychlení aplikace. Ale špatná cache invalidace je jeden z nejtěžších problémů v CS.
Strategie¶
- Cache-aside: Aplikace čte/zapisuje cache explicitně
- Write-through: Zápis do cache i DB současně
- Write-behind: Zápis do cache, async do DB
- Read-through: Cache automaticky načte z DB
HTTP Cache headers¶
Statické assety — dlouhý cache¶
Cache-Control: public, max-age=31536000, immutable
API response — krátký cache¶
Cache-Control: private, max-age=60
Validace s ETag¶
ETag: “abc123” If-None-Match: “abc123” # 304 Not Modified
Cache-aside pattern¶
async def get_product(product_id):
1. Check cache¶
cached = await redis.get(f”product:{product_id}”) if cached: return json.loads(cached)
2. Cache miss — fetch from DB¶
product = await db.products.find(product_id)
3. Store in cache¶
await redis.setex(f”product:{product_id}”, 3600, json.dumps(product)) return product
Klíčový takeaway¶
Cache-aside pro většinu use cases. HTTP cache headers pro CDN. Invalidace je těžší než se zdá — TTL je nejjednodušší.