Memcache : conseils d’utilisation

Depuis maintenant plusieurs années j’utilise (entre autre choses) Memcache pour l’optimisation des sites sur lesquels je travaille. Ceux d’entre vous qui l’utilisent s’en seront rendus compte, Memcache nous invite rapidement à recontrer, et donc a résoudre, certaines problématiques parmis lesquelles la durée de vie des objets en cache. Voici donc quelques une de ces problématiques et les solutions que je leurs appliquent.

Quoi / quand / comment ?

Le premier reflex que l’on a quand on commence a utiliser le cache (c’est en tout cas celui que j’ai eu et celui que j’observe le plus chez les jeunes developeurs), c’est de mettre en cache les résultats de grosses requêtes pour un durée prédéterminée. Ceci va effectivement permettre d’accroître les performances d’un site, mais ce sera au détriement de la cohérance des données qui ne peut être conservée sans une gestion globale du cache. Le cache doit donc, selon moi, s’appliquer à tous les objets de votre application dés le début. Vos objets intégreront probablement tous les méthodes suivantes :

  • une méthode pou charger l’objet depuis la base de donnée.
  • une méthode de sauvegarde en base pour la création et/ou la modification.
  • une méthode de suppression.

Partant de là il est simple pour chacun d’eux de les mettres en cache au chargement et a la sauvegarde, de mettre à jour les objets en cache à la modification, et de les supprimer du cache lors d’une suppression. Brefs de maintenir synchronisés vos objets en cache avec les objets en base de données.

Maintenant que tous nos objets sont en cache, on peut s’attaquer aux collections d’objets, ces fameuses méthodes search, getAll, loadCollection que nous avons tous déjà implémentées plus ou moins brillament.

Quelles clés de cache utiliser ?

Les clés de cache des collections doivent être basées sur les paramètres que va recevoir la méthode, ceci va permettre de construire les clés dynamiquement et de gérer toutes les différentes collections pouvant être construites a partir d’une même méthode.

Comment gérer l’expiration ?

Choisir de mettre en cache des collections pour une durée définie, est certe efficace dans un premier temps, mais va vite devenir une contrainte forcant parfois à vider tous le cache pour mettre à jour une seule liste. Pour ne jamais se retrouver dans une telle situation, la seule solution est de stocker la totalité des éléments en cache pour une durée infinie, et de spécifier à chaque fois que l’on stocke une collection en cache, de quoi elle dépend et quand elle devra être vidée. En pratiqe cela revient à associer les clés de cache à d’autres clés ou plus généralement à des objets pour dire par exemple que lors de la suppression d’un objet X, il faut vider le cache de la ou des listes d’objets X. Cette association de clés pourra elle aussi être stoker en cache.

Et si on ne peut pas gérer de cache infini ?

C’est que la modélisation est à revoir ! Mais soit, on a tous a gérer un existant plus ou moins lourd, et on ne peut pas tout réécrire. Dans ce cas, je pense qu’il faut préférer des durée de cache plutôt courte afin de ne pas se retrouver dans une situation vous forcant à vider tous le cache sous peines d’avoir un site en « vrac » pendant plusieurs heures. Et, quand c’est possible, par exemple dans le cas ou une cron va mettre à jour vos données tous les jours à une heure données, vous pouvez estimer la durée de validité de vos données et donc la durée du cache.

Il y a surrement d’autres solutions, lesquels utilisez vous ?

About the Author: Guillaume Luchet

Guillaume Luchet est Directeur de la R&D et Lead Développeur chez Bilendi Technology, entrepreneur et développeur freelance.