Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cache-moi si tu peux : patterns et pièges du ca...

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Cache-moi si tu peux : patterns et pièges du cache en production - Devoxx France 2026 - Conférence

"On va mettre un cache, ça ira plus vite."
Cette phrase a déjà coûté des nuits blanches à bien des équipes.

Le cache est souvent introduit comme une "optimisation" rapide à mettre en place. En réalité, il transforme profondément le comportement d'un système : cohérence éventuelle, données obsolètes, effets de bord distribués... et bugs impossibles à reproduire. Aujourd'hui, ces mêmes défis réapparaissent dans les architectures intégrant des LLMs, avec l'émergence de modèles comme le semantic caching.

Partons ensemble pour un voyage pragmatique dans le monde du cache :

- ce qu'est réellement un cache (et ce qu'il n'est pas),
- les principaux patterns de caching et leurs compromis,
- les anti-patterns classiques qui transforment une application rapide en cauchemar opérationnel,
- un arbre de décision pour choisir la bonne stratégie.

Cette session vous donnera les outils pour construire des systèmes rapides et prévisibles, et vous aidera à ne plus jamais considérer le cache comme un simple détail d'implémentation.

Avatar for Sébastien LECACHEUR

Sébastien LECACHEUR

April 22, 2026

More Decks by Sébastien LECACHEUR

Other Decks in Programming

Transcript

  1. @slecache.com .bsky.social #DevoxxFR #cache Cache -moi si tu peux :

    patterns et pièges du cache en production Sébastien Lecacheur 🏢 Matmut 📅 22/04/26 ⌚ 13h30 📍 Devoxx France 🚪 Salle Neuilly 252AB
  2. @slecache.com .bsky.social #DevoxxFR #cache There are only two hard things

    in computer science: cache invalidation and naming things . — Phil Karlton
  3. @slecache.com .bsky.social #DevoxxFR #cache Anomalies seulement en production • 💥

    Symptômes ◦ Bug aléatoire en recette ou production • 🏞 Contexte ◦ Application OK en dev et intégration ◦ Tests automatiques au vert • 🔎 Analyse ◦ Cas 1 : Cache pas activé en développement -> bug lié au cache ◦ Cas 2 : Cache local avec une seule instance en dev et plusieurs en recette -> caches désynchronisés v?
  4. @slecache.com .bsky.social #DevoxxFR #cache Un plantage à retardement • 💥

    Symptômes ◦ Erreurs 500 en production • 🏞 Contexte ◦ Migration d’une app et templating PHP 5 vers PHP 7 ◦ Développement OK ◦ Mise en production OK • 🔎 Analyse ◦ Le cache des templates compilés invalidé juste avant l’incident ◦ Bug non détecté en développement -> impossible de compiler certains templates
  5. @slecache.com .bsky.social #DevoxxFR #cache Redémarrage impossible • 💥 Symptômes ◦

    Application qui n’arrive pas à redémarrer ◦ Redémarrage en boucle des instances • 🏞 Contexte ◦ Données invalides dans le cache ◦ Pas de procédure d’invalidation • 🔎 Analyse ◦ Cache local et distribué -> redémarrage massif pour invalider ◦ Volume de données trop long à charger au démarrage quand le cache est vide ◦ Source de données sous pression et lente ◦ Démarrage qui plante ou tombe en timeout
  6. @slecache.com .bsky.social #DevoxxFR #cache Désindexation des moteurs de recherche •

    💥 Symptômes ◦ Pages déréférencées • 🏞 Contexte ◦ Gros catalogue produit en ligne ◦ Du cache à tous les niveaux ◦ Temps de chargement <100 ms si cache sinon ~2-3 s voire +10 s • 🔎 Analyse ◦ Caches invalidés après chaque mise à jour du catalogue ◦ Premiers chargements lents ◦ Si chargement initié par un indexeur, alors timeout et donc pénalisation voire désindexation “Ca plante. — C’est normal. Attends que le cache chauffe…”
  7. @slecache.com .bsky.social #DevoxxFR #cache Fuite de données personnelles • 💥

    Symptômes ◦ Tous les utilisateurs ont le même nom • 🏞 Contexte ◦ Site web avec du cache du HTML pré-généré ◦ Cache seulement pour les fragments paratageables • 🔎 Analyse ◦ Evolution pour ajouter une donnée personnelle dans un composant “cachable” ◦ Tout le monde avait le nom du premier utilisateur à charger une page
  8. @slecache.com .bsky.social #DevoxxFR #cache Définition Un cache est un composant

    matériel ou logiciel qui stocke temporairement des données , afin d'accélérer les accès futurs à ces mêmes données. — Wikipedia https://en.wikipedia.org/wiki/Cache_(computing)
  9. @slecache.com .bsky.social #DevoxxFR #cache Pourquoi ? • Il sert à

    éviter des calculs ou lectures répétées depuis une source plus lente. • Il améliore la rapidité d'accès grâce à la conservation locale des informations fréquemment utilisées. • Il implique des compromis sur la taille, la cohérence et la gestion de l'obsolescence des données. https://en.wikipedia.org/wiki/Cache_(computing)
  10. @slecache.com .bsky.social #DevoxxFR #cache 3 raisons principales d’utiliser un cache

    1. Temps de réponse ⏱ 2. Coût des traitements 💸 3. Capacité de traitement ⚙
  11. @slecache.com .bsky.social #DevoxxFR #cache Du cache partout ! 1) En

    mémoire de la DB -> éviter les accès disques et calculs 2) Distant entre l'app et la DB -> éviter les connexions et requêtes DB 3) En mémoire sur l'appli -> éviter les appels réseaux en backend 4) Sur un CDN -> réduire le temps de réponse utilisateur et éviter de solliciter les backends 5) Dans le navigateur -> éviter les appels réseaux en frontend
  12. @slecache.com .bsky.social #DevoxxFR #cache Accès à la donnée • Clé

    dans une base clé/valeur ◦ Identifiant technique/fonctionnel ◦ Construit par l’application ◦ Exemples ▪ cache.set('user-1234',user) ▪ cache.get('user-1234') ▪ cache.get('all-currencies') • Requête via un proxy ◦ Client ou serveur ◦ Exemples ▪ proxy.query('SELECT * FROM users WHERE id=1234') ▪ proxy.request('https://api.example.org/v1/users/1234') ◦ 💡 scope de la requête pour éviter les appels doublons
  13. @slecache.com .bsky.social #DevoxxFR #cache Métriques & indicateurs • Cache miss

    : absente du cache • Cache hit : présente dans le cache • Temps de réponse du cache => Cache Hit Ratio (CHR) hits / (hits + misses)
  14. @slecache.com .bsky.social #DevoxxFR #cache Les compromis Choisissez-en deux, jamais trois

    ! Exemples • stocks -> P+F • devises -> P+S • solde bancaire -> F+S
  15. @slecache.com .bsky.social #DevoxxFR #cache Les 3 questions clés • Que

    se passe-t-il si le cache est vide ? ◦ cache-miss -> latence plus élévée ◦ fallback • Que se passe-t-il si le cache est faux ? ◦ stale data ou cache poisoning ◦ bug ◦ tolérance à l’obsolescence ou invalidation • Qui est responsable de l'invalidation ? ◦ qui, quand et comment ? ◦ stratégie : TTL, événement ou manuelle ◦ principale source des problèmes en production
  16. @slecache.com .bsky.social #DevoxxFR #cache Local vs distant Modèle Avantages Inconvénients

    Local (in-memory) • Très rapide • Très simple • Consommation mémoire • Incohérence • Capacité limitée • Taux de hit réduit • Volatile Local (réseau) • Peu de latence • Incohérence réduite • (Semi-)Persistant • Nouvel élément dans l’infrastructure Distant • Meilleur taux de hit • Cohérence • Scalable • (Semi-)Persistant • Plus lent • Infrastructure plus complexe
  17. @slecache.com .bsky.social #DevoxxFR #cache Caractéristiques des patterns Quand ? •

    A la lecture (read) • A l’écriture (write) • Pré-chargement (prefetching) • A intervales réguliers Comment ? • Par l’application (aside) • Par le cache (inline) • Par un processus dédié X
  18. @slecache.com .bsky.social #DevoxxFR #cache Cache aside 💡Application en service même

    quand stockage en panne ⚠ Double peine si le cache est en panne.
  19. @slecache.com .bsky.social #DevoxxFR #cache Comparatif des patterns Attributs Avantages Inconvénients

    Read Consomme que le nécessaire Cache miss lent Obscolescence de la donnée Write Pas de cache miss Cohérence des données Chargement initial pas évident Charge toutes les données Prefetching Pas de cache miss Charge toutes les données Aside Universel Découplé Plus de contrôle Complexité dans l’application Inline L’application reste simple Disponibilité Couplage avec une solution tiers
  20. @slecache.com .bsky.social #DevoxxFR #cache Invalidation vs Eviction “Tout limiter dans

    le temps et l’espace.” Invalidation Eviction Motivation Cohérence Capacité Déclencheur Modification de donnée TTL, contrainte mémoire Initiateur Application, métier Système, infrastructure Résultat Donnée retirée car périmée Donnée retirée pour faire de la place
  21. @slecache.com .bsky.social #DevoxxFR #cache Contre-mesures • Random jitter sur le

    TTL -> aléatoire • Request coalescing (Single flight) -> file d’attente • Stale While Revalidate (SWR) -> données obsolètes • Circuit breaker -> protection de la source • Warm-up -> préchargement
  22. @slecache.com .bsky.social #DevoxxFR #cache Les anti-patterns • Un cache devant

    tout ◦ complexité inutile ◦ incohérences ◦ surcoût de maintenance • Même TTL partout (par facilité ou habitude) ◦ données obsolètes trop vite ou trop lentement et donc incohérences • Cache partagé entre services non coordonnés ◦ incohérences ◦ invalidations imprévues ◦ fuites de données • Cache sans stratégie de warm-up (thundering herd ou dogpile) ◦ surcharge de la source d'origine ◦ ralentissements ou pannes • Pas de monitoring du cache ◦ problèmes non détectés : cache non utilisé, taux de hit/miss anormal, saturation mémoire
  23. @slecache.com .bsky.social #DevoxxFR #cache Posez-vous d’abord 4 questions Critère Haute

    priorité Basse priorité Critiques ? Données sensibles (paiement, santé, sécurité) Données non sensibles (stats, listes) Souvent modifiées ? Changent en continu Stables dans le temps Partagées entre services ? Plusieurs services/instances Une seule source (instance) Acceptables si obsolètes ? Non, cohérence requise Oui, staleness tolérable
  24. @slecache.com .bsky.social #DevoxxFR #cache Scénario Caractéristiques Recommandation TTL Pattern Données

    de référence Non critiques, rarement changées, partagées, obsolescence acceptable Cache local Long (15min-1h) Cache-aside Données utilisateur critiques Critiques, modifiées souvent, pas partagées Pas de cache N/A Accès direct Configuration / metadata Non critiques, jamais changées, partagées Cache distribué Très long Read-through Stock / inventaire Critiques, modifiées très souvent, partagées Cache distribué + invalidation événementielle Court (5-30s) Write-through Résultats de recherche Non critiques, modifications rares, partagées Cache local + TTL Moyen (5-15min) Cache-aside Exemples En cas de doute : pas de cache d'abord, puis ajouter si nécessaire.
  25. @slecache.com .bsky.social #DevoxxFR #cache Bonnes pratiques • Définir un timeout

    (court) • Fallback quand le cache tombe • Versionner les clés pour les montées de version • Pas d'informations personnellement identifiables (PII) • Définir un scope : préfixe et des droits d’accès sur les clés • Métriques et monitoring • Random jitter (cf. thundering herd ou dogpile) • Documenter (ADR + inventaire des cas d’usage) • Tests avec cache désactivé et activé , vide et chargé • Chaos engineering sur le cache
  26. @slecache.com .bsky.social #DevoxxFR #cache Le problème • Requête 1 :

    "Quel est le salaire moyen ?" • Requête 2 : "Quel est le salaire moyen?" • Requête 3 : "À combien s'élève le salaire moyen ?" => Clés/requêtes différentes → Cache miss → Triple calcul/appel API Impact économique : Coûts API triplés, latence augmentée.
  27. @slecache.com .bsky.social #DevoxxFR #cache L’idée : le semantic caching Cacher

    non pas par la clé exacte , mais par la similarité du sens (sémantique) : 1. Utiliser les embeddings (vecteurs de représentation sémantique) 2. Comparer les requêtes par similitude vectorielle (cosine similarity) plutôt que par égalité exacte 3. Stocker le résultat associé au vecteur 4. Nouvelle requête similaire ? Servir le résultat du cache.
  28. @slecache.com .bsky.social #DevoxxFR #cache Points clés • Cache HIT :

    ~X ms (embedding + recherche HNSW + cache lookup) • Cache MISS : ~X s (embedding + recherche HNSW + appel LLM + stockages) • UUID comme lien : jointure Vector DB et Cache • Pas de duplication : Le vecteur de la requête courante ne se stocke QUE si c'est un MISS.
  29. @slecache.com .bsky.social #DevoxxFR #cache Cas d’usage principal : chat bot

    interne Requête utilisateur A: "Comment changer son mot de passe ?" → Embedding + Semantic search → ✗ Not found → Appel API LLM → Résultat stocké en cache Requête utilisateur B: "Je veux changer mon password." → Embedding + Vérifier similarité (cosine similarity > 0.85) → ✓ Match! → Retourner le cache (économie d'appel API)
  30. @slecache.com .bsky.social #DevoxxFR #cache Défis & pièges • Qualité de

    l'embedding : Mauvais embeddings → mauvaise similarité → cache inefficace • Seuil de similarité (0,85-0,95) : Trop haut (rigidité), trop bas (cache invalide) • Coût des embeddings : Générer et comparer des embeddings a aussi son coût • Hallucination cachée : Une mauvaise réponse reste en cache plus longtemps • Gestion de l'invalidation : TTL ou événement ? Plus complexe qu'avant Règle d'or : Semantic cache est utile seulement si le coût des embeddings < coût des appels LLM .
  31. @slecache.com .bsky.social #DevoxxFR #cache Bonnes pratiques pour le semantic caching

    • Mesurer la similarité réelle : Logger tous les matchs/misses • Tester votre seuil : Vérifier le seuil sur des requêtes de production réelles • Approche hybride : Exact match d'abord, semantic cache en seconde passe • Génération périodique : Re-générer embeddings pour tenir compte de l'évolution du modèle • Monitoring : Hit ratio, latence, temps de génération des embeddings
  32. @slecache.com .bsky.social #DevoxxFR #cache Avant de l'ajouter, posez-vous 3 questions

    • Que se passe-t-il si le cache est vide ? → Définissez votre fallback. • Que se passe-t-il si le cache est faux ? → Définissez votre tolérance à l'obsolescence. • Qui invalide ? → Désignez un responsable. Dès maintenant !
  33. @slecache.com .bsky.social #DevoxxFR #cache Le cache Bien utilisé, c'est votre

    meilleur allié . Mal utilisé, c'est une bombe à retardement silencieuse.
  34. @slecache.com .bsky.social #DevoxxFR #cache En cas de doute : pas

    de cache d'abord . Ajoutez-le quand vous savez pourquoi vous en avez besoin.
  35. @slecache.com .bsky.social #DevoxxFR #cache Et si vous ne pouvez pas

    répondre aux 3 questions ? Vous n'êtes pas encore prêt à cacher .
  36. @slecache.com .bsky.social #DevoxxFR #cache Aller plus loin • Thèmes non

    abordés 📝 ◦ Sharding ◦ Cache poisoning ◦ LRU, LFU, FIFO • Outils 🧰 ◦ sentences-transformers + all-MiniLM-L6-v2 • Ressources (bibliographiques) 🌐 ◦ Offline cookbook : https://jakearchibald.com/2014/offline-cookbook/ ◦ A Hitchhiker’s Guide to Caching Patterns : https://hazelcast.com/blog/a-hitchhikers-guide-to-caching-patterns/
  37. @slecache.com .bsky.social #DevoxxFR #cache Ressources • Google font : Architects

    Daughter • JetBrains Mono Font • Flaticons: black hand drawn