Le cache va plus vite. Mais il peut mentir — et savoir quand, c'est tout le sujet.The cache is faster. But it can lie — and knowing when is the whole subject.
Voici le dernier volume, celui de la scalabilité — et il s'ouvre par le pattern le plus rentable de tous, et le plus piégeux. Une requête est lente et appelée sans cesse ? Le réflexe est immédiat : « mets un cache ». Garder le résultat sous la main au lieu de le recalculer divise les temps de réponse par dix ou cent, et soulage la source d'autant. Le gain est si évident qu'on en oublie la contrepartie : dès qu'on copie une donnée, on a deux exemplaires de la vérité — et les garder d'accord est l'un des deux problèmes vraiment durs de l'informatique. Sans stratégie d'invalidation, le cache continue de servir l'ancienne valeur longtemps après que la source a changé : il ment. Le réflexe complet n'est donc pas « mets un cache », c'est « mets un cache, et décide d'avance comment et quand tu le rafraîchis » — et, parce que c'est le volume de la scalabilité, on ne le pose qu'avec un chiffre : un point chaud mesuré, pas une intuition.Here's the final volume, the one on scalability — and it opens with the most profitable pattern of all, and the most treacherous. A query is slow and called constantly? The reflex is immediate: 'add a cache'. Keeping the result on hand instead of recomputing it divides response times by ten or a hundred, and relieves the source by as much. The gain is so obvious you forget its counterpart: the moment you copy a piece of data, you have two copies of the truth — and keeping them in agreement is one of the two genuinely hard problems in computing. Without an invalidation strategy, the cache keeps serving the old value long after the source has changed: it lies. So the full reflex isn't 'add a cache', it's 'add a cache, and decide up front how and when you refresh it' — and, because this is the scalability volume, you only add it with a number: a measured hot path, not a hunch.
# une requête lente, appelée souvent. le réflexe : « mets un cache ». la moitié du geste seulement. cache = {} def get_profile(user_id): if user_id in cache: return cache[user_id] # ✓ rapide : on évite la base row = db.query("SELECT * FROM profiles WHERE id = ?", user_id) # 💥 lent, mais TOUJOURS vrai cache[user_id] = row return row def update_profile(user_id, data): db.update("profiles", user_id, data) # 💥 on écrit la source… et on oublie le cache. # → le cache garde l'ancienne valeur. tous les lecteurs voient le PASSÉ, peut-être pour des heures. # un cache sans stratégie d'invalidation n'est pas un cache : c'est un mensonge qui s'installe.
La source dit toujours la vérité, mais lentement. Le cache répond vite, mais il dit la vérité telle qu'elle était au moment où on l'a copiée — et plus le monde change derrière, plus il s'écarte du vrai. Tout le métier du cache tient dans cet arbitrage : combien de fraîcheur suis-je prêt à sacrifier contre combien de vitesse ? Un cache n'est jamais « activé » ou « désactivé » ; il est réglé sur une tolérance au mensonge — zéro pour un solde bancaire, quelques minutes pour un compteur de vues. Décider cette tolérance, c'est concevoir le cache.The source always tells the truth, but slowly. The cache answers fast, but it tells the truth as it was when you copied it — and the more the world changes behind it, the further it drifts from what's real. The whole craft of caching lives in this trade-off: how much freshness am I willing to sacrifice for how much speed? A cache is never 'on' or 'off'; it's tuned to a tolerance for lying — zero for a bank balance, a few minutes for a view counter. Deciding that tolerance is designing the cache.
Un cache se conçoit en trois temps. La lecture, d'abord : le motif le plus courant est le cache-aside — on regarde le cache, on sert s'il a la valeur (hit), sinon on lit la source, on remplit, on sert (miss). L'écriture, ensuite : c'est là qu'on choisit sa stratégie. Soit on écrit la source puis on invalide l'entrée (le prochain lecteur la rechargera), soit on écrit cache et source en même temps (write-through). L'invalidation, enfin, est le vrai sujet : un TTL borne la durée du mensonge sans rien savoir des écritures ; une invalidation explicite supprime l'entrée dès que la source change ; les deux se combinent souvent. Sauter cette troisième étape, c'est garder un cache qui ment indéfiniment.A cache is designed in three beats. The read, first: the commonest pattern is cache-aside — you check the cache, serve if it has the value (hit), otherwise read the source, fill, serve (miss). The write, next: that's where you choose your strategy. Either you write the source then invalidate the entry (the next reader will reload it), or you write cache and source at once (write-through). Invalidation, finally, is the real subject: a TTL bounds the lie's duration without knowing anything about writes; an explicit invalidation removes the entry the moment the source changes; the two often combine. Skipping that third beat means keeping a cache that lies indefinitely.
La scalabilité est le dernier volume, pas le premier, et pour une raison : c'est le terrain le plus exposé à l'optimisation prématurée. Le cache en est l'exemple parfait — si tentant qu'on le pose par réflexe, sur une requête dont on n'a jamais mesuré le coût ni la fréquence. Or un cache n'est rentable que sur un point chaud : une donnée lue beaucoup plus souvent qu'elle n'est écrite, et assez coûteuse à produire. Sur une donnée froide, il n'évite presque aucun calcul, gonfle la mémoire, et ajoute un risque d'incohérence pour rien. La discipline du volume tient en une phrase : on n'optimise pas une intuition, on optimise un goulot mesuré. Avant tout cache, un profil, un taux de réutilisation, un chiffre. C'est aussi un rappel de « cache invalidation and naming things » — l'une des deux choses vraiment dures, qu'on ne s'inflige pas sans raison chiffrée.Scalability is the last volume, not the first, for a reason: it's the ground most exposed to premature optimization. The cache is its perfect example — so tempting you add it by reflex, on a query whose cost and frequency you never measured. Yet a cache only pays on a hot path: data read far more often than written, and costly enough to produce. On cold data, it avoids almost no computation, bloats memory, and adds an inconsistency risk for nothing. The volume's discipline fits in one sentence: you don't optimize a hunch, you optimize a measured bottleneck. Before any cache, a profile, a reuse ratio, a number. It's also a nod to 'cache invalidation and naming things' — one of the two genuinely hard things, which you don't inflict on yourself without a measured reason.