Mise en cache en JavaScript : Redis, Memcached et solutions intégrées : de A à Z
\n\nLa mise en cache est l'un des outils clés pour améliorer les performances des applications web. Dans le contexte de JavaScript et Node.js, une mise en cache judicieuse permet de réduire la charge sur les bases de données, de diminuer le temps de réponse des API et d'améliorer l'expérience utilisateur. Dans cet article, nous aborderons trois approches principales : la mise en cache intégrée en mémoire du processus, Memcached et Redis. Vous apprendrez quand choisir quel outil et obtiendrez des exemples de code prêts à l'emploi.
\n\nPourquoi la mise en cache dans Node.js ?
\nNode.js est un environnement monothread avec des entrées-sorties asynchrones. Chaque requête vers une base de données ou une API externe prend du temps. La mise en cache permet de stocker les données fréquemment demandées dans un stockage rapide (mémoire vive) et de les restituer sans répéter des opérations lourdes. Ceci est particulièrement important pour :
\n- \n
- Réduire les latences lors des requêtes répétées \n
- Diminuer la charge sur les bases de données (PostgreSQL, MongoDB, etc.) \n
- Économiser les ressources de calcul du serveur \n
- Augmenter le débit de l'application \n
Mise en cache intégrée dans Node.js (In-Memory Cache)
\nLa méthode la plus simple consiste à utiliser un objet Map ou Object dans la portée globale. Cela convient aux petits projets ou aux données qui vivent au sein d'un seul processus.
Exemple : Cache simple avec Map
\nconst cache = new Map();\n\nfunction getCachedData(key) {\n if (cache.has(key)) {\n const entry = cache.get(key);\n if (Date.now() < entry.expiry) {\n return entry.data;\n } else {\n cache.delete(key); // supprime les données expirées\n }\n }\n return null;\n}\n\nfunction setCachedData(key, data, ttlMs = 60000) {\n cache.set(key, {\n data,\n expiry: Date.now() + ttlMs\n });\n}\n\n// Utilisation :\nsetCachedData('user:123', { name: 'Alice' }, 30000);\nconst user = getCachedData('user:123');\nconsole.log(user); // { name: 'Alice' }\n\nAvantages : simplicité, latence réseau nulle, ne nécessite pas l'installation de services supplémentaires.
\nInconvénients : les données ne sont pas partagées entre plusieurs processus/serveurs, limitées par la mémoire d'un seul processus.
Memcached : mise en cache distribuée
\nMemcached est un système de mise en cache distribué en mémoire haute performance. Il est simple, rapide et bien adapté au stockage de petits volumes de données (par exemple, sessions ou fragments HTML). Pour Node.js, il existe un module populaire memcached.
Installation et connexion
\nnpm install memcached\n\nExemple de travail avec Memcached
\nconst Memcached = require('memcached');\nconst memcached = new Memcached('localhost:11211');\n\n// Écriture de données avec TTL (en secondes)\nmemcached.set('user:456', { name: 'Bob' }, 3600, (err) => {\n if (err) console.error('Erreur d\'écriture :', err);\n});\n\n// Lecture de données\nmemcached.get('user:456', (err, data) => {\n if (err) {\n console.error('Erreur de lecture :', err);\n } else if (data) {\n console.log('Données du cache :', data);\n } else {\n console.log('Cache vide — données non trouvées');\n }\n});\n\n// Fermeture de la connexion à la fin\nprocess.on('SIGINT', () => {\n memcached.end();\n});\n\nAvantages : simplicité de l'API, haute vitesse, distribution entre serveurs.
\nInconvénients : pas de réplication intégrée, perte de données au redémarrage, ensemble limité de types de données.
Redis : mise en cache puissante avec des fonctionnalités avancées
\nRedis n'est pas seulement un cache, mais un véritable stockage de données en mémoire prenant en charge des structures complexes (chaînes, listes, ensembles, hachages). Il prend en charge la persistance, la réplication et les transactions. Pour Node.js, nous utilisons la bibliothèque redis.
Installation
\nnpm install redis\n\n