GH GambleHub

Stratégies de cache

1) Pourquoi cacheter et où le faire

Cache est une couche de mémoire rapide qui réduit la latence et la charge sur les ressources coûteuses (CPU/OBD/API externes). Objectifs importants :
  • Vitesse (p95/p99), coût (moins d'egress/CPU), stabilité (moins de dépendances sous le pic).
  • Lissage des pics et isolement des « voisins bruyants ».
Niveaux types :

1. Client (navigateur/mobile) - cache HTTP, IndexedDB, stockage local.

2. Edge/CDN - Les nœuds POP sont plus proches de l'utilisateur, mettent en cache la statique et une partie de l'API.

3. L7-gateway/Reverse-proxy - Nginx/Envoy/Varnish (microcash, SWR).

4. Cache de service - Redis/Memcached à l'intérieur du cluster.

5. Intra-process - in-memory (Cafeine/Guava/LRU-map).

6. Cache dans la base de données - vues matérielles, index secondaires.

Règle : fixez le plus près possible du consommateur, mais gardez la vérité une fois.

2) Modèles de cache

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

L'application lit d'abord à partir du cache ; en cas d'échec, à partir de la source, puis écrit dans le cache.
Avantages : simplicité, contrôle. Inconvénients : démarrages froids, fenêtres de désaccord.

2. 2 Read-through

La lecture se fait toujours par l'intermédiaire d'un cache qui se dirige vers la source en cas d'échec (bibliothèque/couche de proxénétisme).
Il est commode de centraliser les politiques de TTL/sérialisation.

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

Write-through : écriture dans le cache et la source synchrone → cohérence supérieure, latence supérieure.
Write-back : écriture dans le cache, écriture flash asynchrone dans la source → rapide, mais risque de perte et de conflit.

2. 4 Refresh-ahead (proactive)

Prédit « TTL expirera bientôt » et met à jour la clé dans le fond, empêchant stampede.

2. 5 Negative caching

Le cache « pas de données/404/vide » sur un court TTL réduit la charge sur la source.

2. 6 Micro-caching

TTL très courts (0. 5-5 c) sur L7 pour « presque dynamique » (listes, principal) - réduit considérablement les queues.

3) HTTP-cache : titres et contrôle

3. 1 Titres de base

`Cache-Control`: `max-age`, `s-maxage` (для shared кэшей), `public/private`, `no-store`, `stale-while-revalidate`, `stale-if-error`.
Validateurs : 'ETag', 'Last-Modified'.
Demandes avec conditions : 'If-None-Match', 'If-Modified-Since' → 304 Not Modified.

3. 2 Vary et clés

« Vary : Accept-Encoding, Autorisation, Cookie, Accept-Language » - forme différentes options de cache. Minimisez 'Vary' pour ne pas « faire sauter » la cardinalité.

3. 3 Exemple de réponse HTTP


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

4) Conception de clés et TTL

4. 1 clés

Structurer : 'tenant : user : {id} : profile : v3' (activer la version du schéma).
Éviter les PII dans la clé.
Pour les collections, clé + paramètres de requête (normalisés et triés).

4. 2 TTL et cohérence

Un court TTL réduit le désaccord, mais augmente les défauts.
Pour les données critiques, les validateurs (« ETag ») et SWR (stale-while-revalidate).
Pour ceux qui changent rarement, un long TTL + « bombes » d'invalidité.

4. 3 Versioning/Basting

Si les modifications ne sont pas compatibles, modifiez le préfixe/version de la clé ('v2 → v3').
Pour les ressources statiques : Contenu hash dans le nom du fichier.

5) Handicap : stratégies et pratiques

5. 1 Suppression directe

'DEL key '/' PURGE 'sur le proxy. Danger : course entre le retrait et les lecteurs multiples.

5. 2 Tags/Clés Surrogate

Associez le document à un jeu de balises (catégorie/auteur). L'invalidité est une étiquette.
В Varnish/Edge — `Surrogate-Key: article:42 tag:author:7` + `BAN tag:author:7`.

5. 3 Handicaps event-driven

Pub/Sub (Kafka/NATS) : lorsque la source change, nous publions l'événement « invalidate ».
Les conseillers du cache écoutent et suppriment/mettent à jour les clés.

5. 4 Biphasé

D'abord, on marque la clé obsolète (soft TTL), on sert stale, on la met à jour et on la remplace atomiquement.

6) Lutte contre le stampede/dogpile et les clés chaudes

6. 1 Request coalescing (singleflight)

Un producteur met à jour la clé, les autres attendent le résultat (mutex/label « mis à jour »).

6. 2 Jitter к TTL

Ajoutez l'aléa (± 10-20 %) à la TTL pour éviter les protubérances synchrones.

6. 3 Soft-TTL + hard-TTL

Jusqu'à soft-TTL sont servis à partir du cache, parallèlement au trigerim refresh ; sur hard-TTL - nous considérons la faille.

6. 4 Clés chaudes

Caches locaux au-dessus des caches partagés (two-tier).
Réplication de la clé chaude en plusieurs chardes et sélection aléatoire (uniquement pour la lecture seule).
Rate limit pour mettre à jour une clé spécifique.

6. 5 Exemple Redis + Lua (croquis singleflight)

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) Stratégies de déplacement et de réception dans le cache

7. 1 Eviction

LRU : simple et bon pour la localisation.
LFU : mieux avec des clés chaudes « à longue durée de vie ».
ARC/TinyLFU : équilibre recency/frequency.

7. 2 Admission (entrée)

Ne laissez pas entrer les objets rares géants (filtres TinyLFU/Bloom).
Compression de grandes valeurs (LZ4/Zstd) à la frontière « taille/latence ».

8) Chardonnages et topologies

8. 1 Consistent hashing

Répartit les clés de façon stable sur les noeuds, réduit les mouvements lors de la croissance/compression du cluster.

8. 2 Topologies Redis/Memcached

Redis Cluster (slots/chardes), Sentinel (faussaire), réplication read-only.
Memcached est un client-side sharding (ketama hashing), sans réplication au niveau du serveur.

8. 3 Local + distribué

Cascade : in-proc (micro-TTL/LRU) → Redis (TTL plus long) source →.
Faites attention aux deux points TTL et validateurs de cache.

9) Edge, CDN et 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 et conditions)

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)

Utilisez 'Surrogate-Key' et 'ban' par tags pour l'invalidité par lots.

10) Cache et cohérence des données

10. 1 Read-your-writes

Pour les profils/paniers personnalisés, fournissez des TTL courts ou un enregistrement à travers le cache (write-through) ou un marquage client (bypass pour N secondes après l'enregistrement).

10. 2 Eventual vs Strong

Pour les recommandations/analyses - eventual + long TTL.
Pour l'argent/état des commandes - TTL court, validation, parfois sans cache sur les chemins critiques.

10. 3 Invariants

Ne tapez pas les champs qui affectent la sécurité/ACL sans TTL rigoureux et sans revérifier.

11) Observabilité, SLO et contrôle

11. 1 Métriques

hit_ratio (общий и per-route), byte_hit_ratio, miss_rate.
stampede_prevented_total, refresh_ahead_total, ban/purge_total.
Latence : p50/p95/p99 du cache vs de la source.
hot_keys_topN et leurs QPS/octets.

11. 2 Logs et traçages

Loger « X-Cache : HIT/MISS/STALE/UPDATING ».
Dans les tracés, notez la source de la réponse ('cache = vrai', 'tier = edge' service 'local').

11. 3 approche SLO

Exemple : "pour API/catalogue p99 ≤ 250 ms, cache hit ≥ 85 %, stampede ≤ 0. 1 % des requêtes

11. 4 Runbooks

« Les échecs grandissent » → vérifier la TTL, l'échauffement/invalidité, les clés hot, la taille du cache et la politique d'acceptation.

12) Sécurité et multi-ténacité

Incorporez tenant-id dans les clés (et dans « Vary » en HTTP).
Ne jetez pas les réponses privées comme 'public'.
Crypter le cache avec des données sensibles ou ne stocker que les non-PII/ID.

13) Recettes types

13. 1 Catalogue/bande (presque dynamique)

Edge-microcash 1-3 avec + SWR, à l'intérieur - Redis de 15-60 s, handicapé par les événements de renouvellement.

13. 2 Profil de l'utilisateur

Cache-aside avec TTL 30-120 s, bypass 5-10 s après mise à jour du profil (cookie/header), ou write-through.

13. 3 Cours/manuels de valeur

Long TTL (minutes-heures) + handicap ciblé lors de la publication de nouvelles données ; 'ETag'pour les GET conditionnels.

13. 4 Délivrance de recherche

Edge-microcash 1-2 s, à l'intérieur - refresh-ahead et coalescing, normaliser les paramètres query dans la clé.

14) Anti-modèles

Cache sans handicap : l'espoir n'est que TTL → de longues fenêtres d'inattention.
Gigantesque « Vary » : « explosion » des options → hit-rate bas.
Cache unique pour prod/experiments → la pollution.
Pas de protection contre le stampede → des pics à la source à l'expiration de la TTL.
Cash argent/droits/ACL sans garanties strictes.
Compression « total consécutif » - CPU superflu, détérioration p99 dans les petites installations.

15) Chèque de mise en œuvre

  • Définir les niveaux de cache et leurs objectifs (edge/service/local).
  • Concevoir les clés (versioning, tenant, normaliser les paramètres).
  • Sélectionnez un modèle (cache-aside/read-through/refresh-ahead).
  • Configurez TTL/soft-TTL/jitter, activez le SWR.
  • Implémentez coalescing/singleflight, protection contre le stampede.
  • Organiser un handicap (événements, tags, purge/ban).
  • Entrez les métriques « hit-ratio/latence » et « X-Cache ».
  • Effectuer des tests de charge avec des clés chaudes.
  • Laissez tomber SLO et runbooks.
  • Vérifier la sécurité/tenant-isolation et 'Vary'.

16) FAQ

Q : Que choisir - cache-aside ou read-through ?
R : Pour des services simples - cache-aside. Il faut une centralisation et une politique unique - read-through.

Q : Comment comprendre la TTL optimale ?
R : Repoussez-vous de l'obsolescence admissible, de la fréquence des mises à jour et de la cible hit-rate ; ajoutez jitter et observez p95/p99/coût.

Q : Quand le write-back est-il approprié ?
R : Pour les flux fortement chargés, où la consistance eventuelle est acceptable et il y a une file d'attente/log fiable pour la « finalisation ».

Q : Les réponses autorisées peuvent-elles être cachées ?
A : Oui, mais marquer 'private'et/ou inclure tenant/user dans la clé/' Vary '. Pour truly-private, le cache client.

Q : Comment chauffer le cache ?
R : Listes de clés populaires, background-wormer, répliques des logs, échauffement avant la sortie/pic (Black Friday, etc.).

17) Résultats

La mise en cache efficace est la conception de clés + TTL + raisonnable, un modèle bien choisi, renforcé par un handicap par événement, SWR/refresh-ahead et une protection contre le stampede. Séparez le cache en niveaux (client/edge/service), ajoutez l'observabilité et le SLO - et obtenez des queues de latence stables, un coût prévisible et une résistance aux pics de charge.

Contact

Prendre contact

Contactez-nous pour toute question ou demande d’assistance.Nous sommes toujours prêts à vous aider !

Telegram
@Gamble_GC
Commencer l’intégration

L’Email est obligatoire. Telegram ou WhatsApp — optionnels.

Votre nom optionnel
Email optionnel
Objet optionnel
Message optionnel
Telegram optionnel
@
Si vous indiquez Telegram — nous vous répondrons aussi là-bas.
WhatsApp optionnel
Format : +code pays et numéro (ex. +33XXXXXXXXX).

En cliquant sur ce bouton, vous acceptez le traitement de vos données.