Mise en cache en TypeScript : Redis, Memcached et solutions en mémoire
La mise en cache est l'un des mécanismes clés pour optimiser les performances des applications web. Dans l'écosystème TypeScript et Node.js, il existe plusieurs approches éprouvées pour organiser la mise en cache : des solutions simples en mémoire aux systèmes distribués basés sur Redis et Memcached. Dans cet article, nous analyserons en détail les bibliothèques populaires, leur installation, leur configuration et des exemples d'utilisation.
Pourquoi la mise en cache est-elle nécessaire ?
La mise en cache permet de réduire le temps de réponse du serveur, de diminuer la charge sur les bases de données et les API externes, et d'améliorer l'expérience utilisateur. Les principaux cas d'utilisation :
- Sauvegarde des résultats de calculs coûteux
- Mise en cache des réponses des API externes
- Stockage des sessions utilisateur
- Mise en cache de fragments de pages HTML
1. ioredis — client avancé pour Redis
ioredis est la bibliothèque la plus populaire pour travailler avec Redis dans Node.js et TypeScript. Elle prend en charge le clustering, Pub/Sub, les transactions et la reconnexion automatique.
Installation :
npm install ioredisnpm install @types/ioredis --save-devUtilisation de base avec TypeScript :
import Redis from 'ioredis';
// Connexion à Redis localconst redis = new Redis({ host: 'localhost', port: 6379, retryStrategy: (times) => Math.min(times * 50, 2000)});
// Fonction pour mettre en cache des donnéesasync function getCachedData(key: string): Promise<string | null> { const cached = await redis.get(key); if (cached) { console.log('Données du cache'); return cached; } // Simulation de récupération de données depuis la base const data = `Data for ${key} at ${new Date().toISOString()}`; await redis.setex(key, 3600, data); // TTL 1 heure return data;}
// Exemple d'utilisation(async () => { const result = await getCachedData('user:123'); console.log(result);})();Mise en cache d'objets :
interface User { id: number; name: string; email: string;}
async function cacheUser(user: User): Promise<void> { await redis.setex(`user:${user.id}`, 3600, JSON.stringify(user));}
async function getUserFromCache(id: number): Promise<User | null> { const cached = await redis.get(`user:${id}`); return cached ? JSON.parse(cached) : null;}2. node-cache — mise en cache simple en mémoire
node-cache est une bibliothèque légère pour stocker des données dans la mémoire vive du processus Node.js. Idéale pour les petits projets ou les prototypes où une mise en cache distribuée n'est pas nécessaire.
Installation :
npm install node-cachenpm install @types/node-cache --save-devExemple d'utilisation :
import NodeCache from 'node-cache';
const myCache = new NodeCache({ stdTTL: 600, // durée de vie par défaut (secondes) checkperiod: 120 // période de vérification des clés expirées});
// Sauvegarde et récupération de donnéesmyCache.set('key1', { value: 42 });const value = myCache.get('key1');console.log(value); // { value: 42 }
// Vérification de l'existence d'une cléif (myCache.has('key1')) { console.log('La clé existe');}
// Suppression par clémyCache.del('key1');
// Obtention des statistiquesconst stats = myCache.getStats();console.log(`Clés dans le cache : ${stats.keys}`);3. lru-cache — cache avec politique LRU
lru-cache est une implémentation de cache avec l'algorithme d'éviction Least Recently Used. Il limite le nombre d'entrées stockées en supprimant automatiquement les plus anciennes. Idéal pour la mise en cache avec une taille fixe.
Installation :
npm install lru-cacheAussi dans la bibliothèque
Recommendations