GH GambleHub

Caching-Strategien

1) Warum Caching und wo es zu tun

Ein Cache ist eine schnelle Speicherschicht, die die Latenz und Belastung teurer Ressourcen (CPU/DB/externe APIs) reduziert. Wichtige Ziele:
  • Geschwindigkeit (p95/p99 niedriger), Kosten (weniger egress/CPU), Robustheit (weniger Abhängigkeiten unter dem Peak).
  • Glättung von Spitzen und Isolierung von „lauten Nachbarn“.
Typische Ebenen:

1. Client (Browser/Mobile) - HTTP-Cache, IndexedDB, lokaler Speicher.

2. Edge/CDN - POP-Knoten sind näher am Benutzer, zwischenspeichern Statik und Teil der API.

3. L7-Gateway/Reverse-Proxy - Nginx/Envoy/Varnish (Microcache, SWR).

4. Service Cache - Redis/Memcached innerhalb des Clusters.

5. In-process - in-memory (Caffeine/Guava/LRU-map).

6. Cache in der DB - materielle Darstellungen, sekundäre Indizes.

Regel: Caching so nah wie möglich an den Verbraucher, aber die Wahrheit einmal speichern.

2) Caching-Muster

2. 1 Cache-aside (“lazy loading”)

Die Anwendung liest zuerst aus dem Cache; bei einem Fehler - aus der Quelle, schreibt dann in den Cache.
Vorteile: Einfachheit, Kontrolle. Nachteile: Kaltstarts, Fenster der Fehlausrichtung.

2. 2 Read-through

Das Lesen erfolgt immer über einen Cache, der bei einem Fehlschuss selbst zur Quelle geht (Library/Proxy Layer).
Es ist bequem, TTL-Richtlinien/Seralisation zu zentralisieren.

2. 3 Write-through / Write-back (write-behind)

Schreiben durch: Schreiben in Cache und Quelle synchron → Konsistenz höher, Latenz höher.
Write-Back: Schreiben in den Cache, asynchrones Flash-Schreiben in die Quelle → schnell, aber das Risiko von Verlusten und Konflikten.

2. 4 Refresh-ahead (proactive)

Prognostiziert „TTL wird bald ablaufen“ und aktualisiert den Schlüssel im Hintergrund, um Stampede zu verhindern.

2. 5 Negative caching

Caching „keine Daten/404/leer“ auf eine kurze TTL reduziert die Belastung der Quelle.

2. 6 Micro-caching

Sehr kurze TTL (0. 5-5 s) auf L7 für „fast Dynamik“ (Listen, Haupt) - stark reduziert Schwänze.

3) HTTP-Cache: Header und Kontrolle

3. 1 Grundlegende Überschriften

`Cache-Control`: `max-age`, `s-maxage` (для shared кэшей), `public/private`, `no-store`, `stale-while-revalidate`, `stale-if-error`.
Validatoren: 'ETag' (Content Hash), 'Last-Modified'.
Anfragen mit den Bedingungen: „If-None-Match“, „If-Modified-Since“ → 304 Not Modified.

3. 2 Vary und Schlüssel

'Vary: Accept-Encoding, Authorization, Cookie, Accept-Language' - bildet verschiedene Cache-Varianten. Minimieren Sie' Vary', um die Kardinalität nicht zu „sprengen“.

3. 3 Beispiel für eine HTTP-Antwort


Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=60
ETag: "a1b2c3"
Vary: Accept-Encoding

4) Schlüsselentwurf und TTL

4. 1 Schlüssel

Strukturieren Sie: 'tenant: user: {id}: profile: v3' (Schemaversion einschließen).
Vermeiden Sie PII im Schlüssel.
Für Sammlungen - Schlüssel + Abfrageparameter (normalisiert und sortiert).

4. 2 TTL und Konsistenz

Eine kurze TTL reduziert die Fehlausrichtung, erhöht aber die Fehler.
Für kritische Daten: Validatoren ('ETag') und SWR (stale-while-revalidate).
Für selten wechselnde - lange TTL + „Bomben“ Behinderung.

4. 3 Versionierung/Basting

Bei inkompatiblen Änderungen ändern Sie das Präfix/die Version des Schlüssels ('v2 → v3').
Für statische Ressourcen - content hash im Dateinamen.

5) Behinderung: Strategien und Praktiken

5. 1 Direkte Löschung

„DEL-Schlüssel “/„ PURGE“ auf Proxy. Die Gefahr: ein Wettlauf zwischen Löschung und mehrfachen Lesern.

5. 2 Tags/Surrogate keys

Ordnen Sie das Dokument einem Tag-Set (Kategorie/Autor) zu. Behinderung - nach dem Tag.
В Varnish/Edge — `Surrogate-Key: article:42 tag:author:7` + `BAN tag:author:7`.

5. 3 Event-getriebene Behinderung

Pub/Sub (Kafka/NATS): Wenn sich die Quelle ändert, veröffentlichen wir das Ereignis „invalidate“.
Cache-Consumers hören zu und löschen/aktualisieren die Schlüssel.

5. 4 Zweiphasig

Zuerst markieren wir den Schlüssel als veraltet (soft TTL), warten den Stale, im Hintergrund erneuern wir ihn und ersetzen ihn atomar.

6) Kampf gegen stampede/dogpile und heiße Schlüssel

6. 1 Request coalescing (singleflight)

Ein Produzent aktualisiert den Schlüssel, der Rest wartet auf das Ergebnis (mutex/label „update“).

6. 2 Jitter к TTL

Fügen Sie der TTL Zufälligkeit (± 10-20%) hinzu, um synchrones Schwinden zu vermeiden.

6. 3 Soft-TTL + hard-TTL

Vor Soft-TTL bedienen wir aus dem Cache, parallel zu den Refresh-Triggern; von hard-TTL - wir halten das für einen Ausrutscher.

6. 4 Hot Keys

Lokale Caches über gemeinsamen Caches (zwei-Tier).
Replikation des Hotkeys in mehrere Shards und Zufallsauswahl (nur für Read-Only).
Rate Limit für die Aktualisierung eines bestimmten Schlüssels.

6. 5 Beispiel Redis + Lua (Singleflight-Skizze)

lua
-- SETNX lock with TTL to avoid deadlocks local ok = redis. call("SET", KEYS[1], "1", "NX", "EX", ARGV[1])
if ok then return "LOCKED"
else return "WAIT"
end

7) Push-Richtlinien und Cache-Empfang

7. 1 Eviction

LRU: einfach und gut für die Lokalität.
LFU: besser mit „langlebigen“ Hot Keys.
ARC/TinyLFU: recency/frequency balance.

7. 2 Zulassung (Einlass)

Lassen Sie keine riesigen seltenen Objekte (TinyLFU/Bloom-Filter) hinein.
Kompression großer Werte (LZ4/Zstd) an der Grenze „Größe/Latenz“.

8) Sharding und Topologien

8. 1 Consistent hashing

Verteilt Schlüssel stabil auf Knoten, reduziert Bewegungen beim Wachstum/Komprimieren des Clusters.

8. 2 Redis/Memcached Topologien

Redis Cluster (Slots/Shards), Sentinel (Failover), nur lesen Replikation.
Memcached ist ein Sharding-Client-Side (Ketama-Hashing) ohne Replikation auf Serverebene.

8. 3 Lokal + verteilt

Kaskade: in-proc (micro-TTL/LRU) → Redis (TTL länger) → Quelle.
Seien Sie vorsichtig mit TTL-Doppelpunkten und Cache-Validierern.

9) Edge, CDN und L7-Cache

9. 1 Micro-cache на Nginx

nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m inactive=10m;
map $request_method $skip_cache { default 0; POST 1; PUT 1; DELETE 1; }

server {
location /api/list {
if ($skip_cache) { add_header Cache-Control "no-store"; }
proxy_cache api;
proxy_cache_valid 200 2s;       # micro-cache proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on;   # SWR add_header X-Cache $upstream_cache_status;
proxy_pass http://upstream;
}
}

9. 2 Envoy (SWR und Bedingungen)

yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. http. cache. file_system_http_cache. v3. FileSystemHttpCacheConfig cache_path: "/var/cache/envoy"

9. 3 Varnish (Surrogate keys)

Verwenden Sie' Surrogate-Key 'und' ban 'durch Tags für Paket-Behinderung.

10) Cache und Datenkonsistenz

10. 1 Read-your-writes

Stellen Sie für benutzerdefinierte Profile/Warenkörbe entweder eine kurze TTL oder eine Aufzeichnung durch den Cache (write-through) oder eine Clientkennzeichnung (bypass für N Sekunden nach der Aufzeichnung) bereit.

10. 2 Eventual vs Strong

Für Empfehlung/Analyse - eventual + long TTL.
Für Geld/Auftragsstatus - kurze TTL, Validierung, manchmal ohne Cache auf kritischen Pfaden.

10. 3 Invarianten

Keine Felder, die die Sicherheit/ACL beeinflussen, ohne strenge TTL und erneute Überprüfung zwischenspeichern.

11) Beobachtbarkeit, SLO und Management

11. 1 Metriken

hit_ratio (общий и per-route), byte_hit_ratio, miss_rate.
stampede_prevented_total, refresh_ahead_total, ban/purge_total.
Latenz: p50/p95/p99 aus dem Cache vs von der Quelle.
hot_keys_topN und ihre QPS/Bytes.

11. 2 Protokolle und Traces

Loggen Sie' X-Cache: HIT/MISS/STALE/UPDATING'.
Markieren Sie in Traces die Quelle der Antwort ('cache = true', 'tier = edge' service' local').

11. 3 SLO-Ansatz

Beispiel: "für API/Katalog p99 ≤ 250 ms, Cache-Hit ≥ 85%, Stampede ≤ 0. 1% der Anfragen".

11. 4 Runbooks

„Fehler wachsen“ → Überprüfen Sie die TTL, Aufwärmen/Invalidität, Hot-Keys, Cache-Größe und Akzeptanzrichtlinien.

12) Sicherheit und Multi-Tenant

Betten Sie tenant-id in die Schlüssel ein (und in 'Vary' unter HTTP).
Geben Sie keine privaten Antworten als' öffentlich 'ein.
Verschlüsseln Sie den Cache mit sensiblen Daten oder speichern Sie nur Nicht-PII/ID.

13) Typische Rezepte

13. 1 Katalog/Band (fast Dynamik)

Edge-Microcache 1-3 mit + SWR, innen Redis für 15-60 s, Behinderung durch Update-Events.

13. 2 Benutzerprofil

Cache-aside mit TTL 30-120 s, bypass 5-10 s nach Profilaktualisierung (Cookie/Header) oder write-through.

13. 3 Valuto-Kurse/Handbücher

Lange TTL (Minuten-Stunden) + gezielte Behinderung bei der Veröffentlichung neuer Daten; 'ETag' für bedingte GETs.

13. 4 Suchausgabe

Edge-Microcache 1-2 s, innen refresh-ahead und coalescing, Normalisierung der Query-Parameter im Schlüssel.

14) Anti-Muster

Cash ohne Behinderung: Hoffnung nur auf TTL → lange Fenster der Irrelevanz.
Giant 'Vary': „Explosion“ von Optionen → niedrige Trefferquote.
Ein einziger Cache für prod/experiments → Kontamination.
Kein Schutz vor Stampede → Peaks an der Quelle, wenn die TTL abläuft.
Geld/Rechte/ACL-Cache ohne strenge Garantien.
Kompression „nur in einer Reihe“ - zusätzliche CPUs, Verschlechterung p99 auf kleinen Objekten.

15) Checkliste Umsetzung

  • Definieren Sie die Cache-Ebenen und ihre Ziele (edge/service/local).
  • Schlüssel entwerfen (Versionierung, Tenant, Normalisierung der Parameter).
  • Wählen Sie ein Muster aus (cache-aside/read-through/refresh-ahead).
  • TTL/soft-TTL/jitter einrichten, SWR einschalten.
  • Implementiere Coalescing/Singleflight, Schutz vor Stampede.
  • Behinderung organisieren (Events, Tags, Purge/Ban).
  • Geben Sie Hit-Ratio/Latenzmetriken und 'X-Cache' Dashboards ein.
  • Führen Sie Lasttests mit Hot Keys durch.
  • Schreiben Sie SLOs und Runbooks.
  • Überprüfen Sie die Sicherheit/tenant-Isolierung und 'Vary'.

16) FAQ

F: Was soll ich wählen - Cache-Aside oder Read-Through?
A: Für einfache Dienste - cache-aside. Wir brauchen Zentralisierung und eine einheitliche Politik - read-through.

F: Wie kann man die optimale TTL verstehen?
A: Verlassen Sie sich auf die zulässige Veralterung, die Häufigkeit der Aktualisierungen und die Zieltrefferquote; fügen Sie jitter hinzu und beobachten Sie p95/p99/Kosten.

F: Wann ist Write-Back angemessen?
A: Für hochbelastete Ströme, bei denen eine eventuelle Konsistenz akzeptabel ist und es eine zuverlässige Warteschlange/ein Protokoll zum „Beenden“ gibt.

F: Können autorisierte Antworten zwischengespeichert werden?
A: Ja, aber markieren Sie' privat 'und/oder schließen Sie tenant/user in den/' Vary' Schlüssel ein. Für truly-private - Client-Cache.

F: Wie kann ich meinen Cache aufwärmen?
A: Listen von beliebten Schlüsseln, Hintergrund-Wormer, Replay von Protokollen, Aufwärmen vor Release/Peak (Black Friday, etc.).

17) Ergebnisse

Effektives Caching ist Schlüsseldesign + vernünftige TTL + ein geschickt ausgewähltes Muster, verstärkt durch Behinderung durch Events, SWR/refresh-ahead und Schutz vor Stampede. Ordnen Sie den Cache nach Ebenen (Client/Edge/Service), fügen Sie Beobachtbarkeit und SLO hinzu - und erhalten Sie stabile Latenzschwänze, vorhersehbare Kosten und Widerstandsfähigkeit gegen Spitzenlasten.

Contact

Kontakt aufnehmen

Kontaktieren Sie uns bei Fragen oder Support.Wir helfen Ihnen jederzeit gerne!

Telegram
@Gamble_GC
Integration starten

Email ist erforderlich. Telegram oder WhatsApp – optional.

Ihr Name optional
Email optional
Betreff optional
Nachricht optional
Telegram optional
@
Wenn Sie Telegram angeben – antworten wir zusätzlich dort.
WhatsApp optional
Format: +Ländercode und Nummer (z. B. +49XXXXXXXXX).

Mit dem Klicken des Buttons stimmen Sie der Datenverarbeitung zu.