Caching in Node.js: Redis und Alternativen zur Beschleunigung von Anwendungen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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 redis


const 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-cache


Anwendungsbeispiel

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.

Empfehlungen