Caching in JavaScript (Node.js): Redis und andere
Caching ist eines der wichtigsten Werkzeuge zur Leistungssteigerung von Webanwendungen auf Node.js. Es ermöglicht, die Serverantwortzeit zu verkürzen, die Last auf Datenbanken und externe APIs zu reduzieren und die Benutzererfahrung zu verbessern. In diesem Artikel betrachten wir beliebte Bibliotheken und Ansätze zum Caching: von integrierten Lösungen bis hin zu leistungsstarkem Redis.
Warum ist Caching in Node.js notwendig?
Ohne Caching kann jede Anfrage an den Server zu wiederholten Berechnungen, Datenbankabfragen oder Aufrufen externer Dienste führen. Dies erhöht die Antwortzeit und den Ressourcenverbrauch. Der Cache speichert häufig angeforderte Daten in einem schnellen Speicher (RAM oder In-Memory-DB), was Folgendes ermöglicht:
- Schnellere Antworten — Lesen aus dem Speicher ist 100-1000 Mal schneller als von der Festplatte.
- Reduzierte Last — Die Datenbank verarbeitet weniger Anfragen.
- Kosteneinsparungen — Weniger Ressourcen für Cloud-Dienste.
1. Redis — Industriestandard
Redis ist ein leistungsstarkes In-Memory-Datenspeicher, das Datenstrukturen (Strings, Hashes, Listen, Sets) unterstützt. Für Node.js wird das Paket redis oder ioredis verwendet.
Installation und Verbindung
npm install redisconst redis = require('redis');const client = redis.createClient({ url: 'redis://localhost:6379'});
client.on('error', (err) => console.error('Redis Client Error', err));client.connect();Basisoperationen
// Schreiben mit TTL (Lebensdauer)await client.setEx('user:123', 3600, JSON.stringify({name: 'Alice', role: 'admin'}));
// Lesenconst cached = await client.get('user:123');if (cached) { console.log('Aus dem Cache:', JSON.parse(cached));} else { // Datenbankabfrage}Erweiterte Funktionen
- Musterbasierte Invalidierung — Löschen aller Schlüssel mit dem Präfix
user:*. - Pub/Sub — Benachrichtigungen über Cache-Änderungen zwischen Instanzen.
- Redis Cluster — Horizontale Skalierung.
2. node-cache — In-Memory-Cache ohne externe Abhängigkeiten
Für kleine Projekte oder Prototypen eignet sich die Bibliothek node-cache. Sie arbeitet innerhalb eines einzelnen Node.js-Prozesses und erfordert keine Redis-Installation.
Installation
npm install node-cacheAnwendungsbeispiel
const NodeCache = require('node-cache');const myCache = new NodeCache({ stdTTL: 600, checkperiod: 120 });
// Daten speichernmyCache.set('posts:recent', postsData, 3600);
// Lesenconst cached = myCache.get('posts:recent');if (cached) { return cached;} else { const fresh = await fetchPostsFromDB(); myCache.set('posts:recent', fresh); return fresh;}Besonderheiten
- Einfache TTL-Konfiguration (Time-to-Live).
- Automatische Bereinigung abgelaufener Einträge.
- Nicht geeignet für verteilte Systeme (Daten leben nur in einem Prozess).
3. memory-cache — Leichte Alternative
memory-cache ist ein weiterer einfacher In-Memory-Cache für Node.js. Er zeichnet sich durch eine minimalistische API aus.
const cache = require('memory-cache');
// Schreibencache.put('api:weather', weatherData, 300000); // 5 Minuten
// Lesenconst data = cache.get('api:weather');if (!data) { // Erneute Abfrage}4. Caching-Strategien
Die Wahl der Strategie hängt vom Datentyp und den Anforderungen an die Aktualität ab:
- Cache-Aside (Lazy Loading) — Die Anwendung prüft zuerst den Cache, lädt bei einem Fehlschlag die Daten und speichert sie im Cache. Der beliebteste Ansatz.
- Write-Through — Daten werden gleichzeitig in den Cache und die Datenbank geschrieben.