Bonjour,

Je suis en train de mettre en place un système de cache pour mon site, et je me pose des questions concernant la meilleure façon de gérer ce cache et son invalidation. Mon but est de ne pas se baser sur une durée de vie du cache pour le mettre à jour, mais bien sur la modification des données.

Voici deux exemples de requêtes que je souhaite mettre en cache:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT *
FROM product_models
WHERE productId IN (1,2,3,4,5,....)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
SELECT *
FROM product_models
WHERE price > 5
LIMIT 0,500
Je vois trois possibilités, avec chacun des avantages et inconvénients:

1/ L'approche la plus "basique", à savoir mettre en cache le résultat de chaque requête, tel quel. C'est simple, mais la gestion de l'invalidation est plus complexe car comme un même fichier de cache contient différents enregistrements, il est difficile de définir quel cache doit être actualisé et quel cache est toujours valide.

2/ Je peux choisir de mettre en cache l'ensemble des enregistrements de ma table product_models, et utiliser PHP pour filtrer les résultats en fonction des clauses WHERE et LIMIT. Dans ce cas, toutes mes requêtes liées à ma table product_models utiliseraient le même fichier de cache - facile donc d'invalider le cache et de le re-générer puisqu'il n'y aurait un seul fichier par table. Par contre j'ai quelques doutes concernant l'impact sur les performances - Si mon cache contient 50 000 modèles et que je demande à PHP de vérifier plusieurs conditions (prix, LIMIT, ORDER, GROUP...), ça me semble assez lourd à mettre en place et à exécuter.

3/ Ma dernière idée est de créer un cache par enregistrement. Ainsi si ma requête retourne 500 enregistrements de ma table product_models, PHP va lire 500 fichiers de cache associés à ces 500 enregistrements. Là encore la gestion de l'invalidation est facile puisque si je modifie un modèle, je sais quel cache doit être recréé. Par contre si je veux retourner 500 modèles, il faudra vérifier l’existence de 500 fichiers, et faire 500 unserialize() ce qui me semble assez moyen en terme de performance... Pire, dans ce genre de scénario, il faudrait lire tous les caches afin de pouvoir définir quels modèles ont un prix > 5.

Pour le moment, la première solution me semble la plus viable, même si la gestion de l'invalidation va être assez fastidieuse. Mais j'aimerais savoir si d'autres personnes ont déjà réfléchi à cette problématique, et quels ont été leurs choix.

Bonne journée!