Stratégie de Mise en Cache
Règles
- Mettez en cache à chaque couche : navigateur (Cache-Control), CDN (edge), application (Redis), base de données (cache de requêtes)
- Utilisez
stale-while-revalidate pour le contenu pouvant être légèrement obsolète — servez rapidement, rafraîchissez en arrière-plan
- En-têtes Cache-Control :
public, max-age=31536000, immutable pour les ressources statiques hachées ; public, s-maxage=60, stale-while-revalidate=300 pour les pages dynamiques
- Mise en cache Redis : sérialiser en JSON, définir un TTL sur chaque clé, utiliser des clés avec espace de noms (
cache:users:123)
- React Query / TanStack Query : définir
staleTime (combien de temps les données sont fraîches) et gcTime (combien de temps les conserver en mémoire)
- Invalider à l'écriture — lorsque les données changent, supprimez ou mettez à jour immédiatement l'entrée du cache
- Utilisez le modèle cache-aside : vérifiez d'abord le cache, récupérez depuis la source en cas d'échec, écrivez dans le cache
- Pour Next.js : exploitez ISR (
revalidate), unstable_cache, et le cache de fetch pour les composants serveur
- Invalidation basée sur les tags : étiquetez les entrées mises en cache par type d'entité, invalidez toutes les entrées d'un tag lors d'une mutation
Modèles
async function getCachedUser(id: string) {
const cached = await redis.get(`user:${id}`);
if (cached) return JSON.parse(cached);
const user = await db.user.findUnique({ where: { id } });
await redis.set(`user:${id}`, JSON.stringify(user), "EX", 3600);
return user;
}
À Éviter
- Mise en cache sans TTL — les données obsolètes persisteront indéfiniment
- Mise en cache de données spécifiques à l'utilisateur dans un cache CDN partagé — utilisez les en-têtes
private ou Vary
- Cache stampede : utilisez le verrouillage ou
stale-while-revalidate pour empêcher l'effet de troupeau
- Mise en cache des réponses d'erreur — ne mettez en cache que les résultats réussis