On répète que le cache rend une application rapide. C’est faux, et la nuance n’est pas qu’académique : un cache ne vous fait gagner aucune milliseconde de calcul. Il évite simplement de refaire un calcul que vous avez déjà fait. Si votre lenteur vient d’une requête mal écrite ou d’un traitement intrinsèquement coûteux, le cache la planque derrière un voile tant que la donnée ne change pas. Et il vous la rend en pleine figure la première fois qu’elle change. Garder ça en tête change l’ordre dans lequel on travaille.
Un cache n’accélère pas, il supprime un calcul redondant : on cible ce qui est lu souvent et change rarement, et on écrit la règle d’invalidation avant la première ligne de code, parce que décider quand jeter la valeur concentre presque tout le travail.
Mon ordre de travail, quand j’arrive sur le sujet, ne varie pas.
-
Je mesure avant de cacher quoi que ce soit. Cacher une donnée consultée trois fois par jour ne rapporte rien ; cacher un calcul lourd appelé à chaque page change la vie. Le bon candidat se reconnaît à deux traits : il est lu souvent, il bouge rarement. Une configuration, un catalogue, le résultat d’une agrégation stable. Tant que je n’ai pas les chiffres de lecture sous les yeux, je ne décide rien.
-
Je choisis l’étage en partant de l’utilisateur. La mémoire locale du processus, un service partagé comme Redis, le cache HTTP qui range des réponses entières, le navigateur ou un CDN en bout de chaîne (un réseau de serveurs répartis géographiquement qui sert le contenu au plus près du visiteur) : chaque niveau a sa portée et sa durée de vie.
Plus je me rapproche de l’utilisateur, plus la lecture est rapide, mais plus l’invalidation devient difficile à propager. Je vais aussi loin que le métier le tolère, pas plus.
-
J’écris la règle d’invalidation avant la première ligne de code. C’est l’étape qu’on saute, et c’est celle qui fait mal. Deux options seulement. Soit l’entrée se périme toute seule après une durée fixée, et il faut caler cette durée sur le rythme réel de la donnée. Soit je la vide explicitement à chaque écriture qui la concerne, ce qui donne le contrôle exact contre une rigueur de tous les instants. Dans la plupart des cas, l’expiration automatique suffit. Mais le choix se fait maintenant, pas dans trois semaines.
-
Je note ce que je cache et la règle qui le vide. Une ligne par entrée, quelque part dans le dépôt. Ça paraît bureaucratique jusqu’au jour où quelqu’un d’autre doit comprendre pourquoi un prix promo s’affiche encore.
Sur ce dernier point, j’ai un souvenir précis. Client e-commerce, il y a deux ou trois ans : une promotion qui s’arrêtait à minuit restait visible le lendemain midi. Le cache HTTP était calé sur 24 heures par quelqu’un qui avait quitté la boîte, et personne n’avait relié cette durée au calendrier des promos. Le visiteur lent qui râle, on le récupère. Celui à qui on affiche un faux prix, lui, passe commande — et c’est le service client qui ramasse.
Alors quand je pose une durée d’expiration, j’inscris à côté, en commentaire, la raison du chiffre. Pas « 3600 », mais « 1 h, parce que le catalogue est réindexé toutes les heures à la minute 5 ».