Wenn Datenbankabfragen zur Flaschenhals werden, Millionen von Session-Tokens verwaltet werden müssen oder Echtzeit-Benachrichtigungen über mehrere Server hinweg fließen sollen, ist Redis die Antwort. Der Name steht für „Remote Dictionary Server" – und genau das ist Redis im Kern: ein äußerst schnelles Schlüssel-Wert-System, das alle Daten im Arbeitsspeicher hält. Die Latenz liegt im Mikrosekundenbereich, der Durchsatz bei Hunderttausenden Operationen pro Sekunde auf Standard-Hardware.
Was ist Redis?
Redis ist eine Open-Source-In-Memory-Datenstruktur-Engine, die 2009 von Salvatore Sanfilippo entwickelt wurde. Im Gegensatz zu einem reinen Caching-System wie Memcached unterstützt Redis eine Vielzahl von Datenstrukturen, kann Daten optional auf Disk persistieren und bietet Funktionen wie Pub/Sub, Lua-Scripting und Transaktionen. Seit 2024 steht Redis wieder unter der AGPL-Lizenz (Redis 8), ältere Versionen unter RSALv2/SSPLv1. Mit dem Valkey-Fork existiert zudem eine BSD-lizenzierte Alternative unter dem Dach der Linux Foundation.
Die wichtigsten Datenstrukturen
Redis unterscheidet sich von anderen Key-Value-Stores dadurch, dass der „Value" kein einfacher String sein muss, sondern eine von mehreren komplexen Datenstrukturen sein kann:
- String – Einfachster Typ, bis zu 512 MB pro Wert. Für Zahlen: atomares Inkrement mit
INCR. - Hash – Schlüssel-Wert-Paare innerhalb eines Keys. Ideal für Objekte wie Nutzerprofildaten.
- List – Doppelt verknüpfte Liste. Unterstützt Push/Pop von beiden Enden – perfekt für Queues.
- Set – Ungeordnete Menge einzigartiger Strings. Für Tag-Systeme oder Mengenoperationen (Union, Intersection).
- Sorted Set (ZSet) – Set mit Score-Wert pro Element. Für Ranglisten und zeitbasierte Abfragen.
- Stream – Append-only Log-Struktur, ähnlich Kafka. Für Event-Sourcing und Message-Queues mit Consumer Groups.
Grundlegende Befehle
Die Redis-CLI ist der schnellste Weg zum Experimentieren. Nach der Installation per redis-cli stehen alle Befehle direkt zur Verfügung:
# String setzen und lesen
SET benutzername "anna"
GET benutzername
# → "anna"
# Wert mit Ablaufzeit (TTL in Sekunden)
SET session:abc123 "{\"userId\":42}" EX 3600
TTL session:abc123
# → 3599
# Hash für Nutzerprofil
HSET user:42 name "Anna" email "[email protected]" punkte 1500
HGET user:42 name
# → "Anna"
HGETALL user:42
# Sorted Set für Rangliste
ZADD highscores 5200 "anna" 4800 "bob" 6100 "charlie"
ZRANGE highscores 0 2 WITHSCORES REV
# → charlie 6100, anna 5200, bob 4800
session:<id>, user:<id> oder cache:product:<id>. Redis unterstützt keine echten Namespaces, aber Doppelpunkte als Trennzeichen werden von vielen GUI-Tools wie Redis Insight zur Baumdarstellung genutzt.
Anwendungsfälle in der Praxis
Session Store: Mit SET session:<token> <json> EX 86400 werden Sessions schnell und ohne Datenbankbelastung gespeichert. Skaliert horizontal, da alle Server auf dieselbe Redis-Instanz zugreifen.
Cache-Layer: Datenbankabfragen werden gecacht: Vor dem DB-Zugriff prüft die Anwendung, ob das Ergebnis in Redis existiert. Trifft es zu (Cache Hit), entfällt die teure SQL-Abfrage komplett.
Rate Limiting: Mit INCR und EXPIRE lässt sich ein einfaches Rate-Limit implementieren: Zähle API-Aufrufe pro Minute pro IP-Adresse; wenn der Zähler das Limit überschreitet, weise die Anfrage ab.
Pub/Sub: Redis ermöglicht Echtzeit-Messaging zwischen Prozessen. Ein Publisher schreibt auf einen Channel (PUBLISH events "neueNachricht"), alle Subscriber empfangen die Nachricht sofort.
Job Queues: Lists mit LPUSH (Job hinzufügen) und BRPOP (blockierendes Pop für Worker) bilden eine einfache, aber robuste Task-Queue. Für komplexere Anforderungen eignen sich Bibliotheken wie BullMQ, die auf Redis aufbauen.
Redis vs. Memcached
| Merkmal | Redis | Memcached |
|---|---|---|
| Datenstrukturen | String, Hash, List, Set, ZSet, Stream u.a. | Nur String |
| Persistenz | Ja (RDB + AOF) | Nein |
| Pub/Sub | Ja | Nein |
| Replikation | Ja (Master/Replica) | Nein |
| Lua-Scripting | Ja | Nein |
| Multi-Threading | Teilweise (I/O-Threads) | Vollständig |
| Idealer Einsatz | Sessions, Queues, Leaderboards, Cache | Einfacher Objekt-Cache |
Redis Sentinel vs. Redis Cluster
Redis Sentinel überwacht Redis-Instanzen und führt automatisch ein Failover durch, wenn der Master ausfällt. Es erhöht die Verfügbarkeit, aber nicht die Kapazität – alle Daten liegen nach wie vor auf einem einzigen Shard.
Redis Cluster verteilt Daten automatisch über mehrere Nodes (Sharding). Das erhöht sowohl die Verfügbarkeit als auch den Datendurchsatz horizontal. Ab Datenmengen, die nicht mehr in den RAM eines einzelnen Servers passen, ist Redis Cluster die richtige Wahl.
Für Cloud-Nutzer bietet Redis Cloud einen kostenlosen Plan mit 30 MB RAM – ausreichend für Entwicklungsumgebungen und kleine Projekte.
Node.js Integration
Die populärste Node.js-Bibliothek ist ioredis. Die Integration ist kompakt:
import Redis from "ioredis";
const redis = new Redis({
host: "localhost",
port: 6379,
});
// Cache-Funktion mit TTL
async function getOrCache(key, ttl, fetchFn) {
const cached = await redis.get(key);
if (cached) return JSON.parse(cached);
const data = await fetchFn();
await redis.set(key, JSON.stringify(data), "EX", ttl);
return data;
}
// Nutzung
const produkt = await getOrCache(
"cache:product:42",
300, // 5 Minuten
() => db.findProductById(42)
);
Häufige Fragen zu Redis
- Wie hoch ist die maximale Datengröße eines einzelnen Redis-Werts?
- Ein einzelner String-Wert kann bis zu 512 MB groß sein. In der Praxis sollten Werte deutlich kleiner gehalten werden – große Objekte blockieren den Redis-Hauptthread während der Serialisierung. Objekte über 1 MB sollten in einer Blob-Storage oder Datenbank gespeichert werden, mit nur einem kleinen Referenzschlüssel in Redis.
- Wann sollte ich Redis Cluster statt Sentinel verwenden?
- Sentinel wenn die Daten auf einen Server passen und nur Hochverfügbarkeit benötigt wird. Cluster wenn der Datensatz den RAM eines Servers übersteigt oder sehr hohe Schreiblast auf mehrere Nodes verteilt werden soll. Cluster erhöht auch die Komplexität: Multi-Key-Operationen funktionieren nur bei Schlüsseln im gleichen Hash-Slot.
- Ist Redis DSGVO-konform für die Speicherung personenbezogener Daten?
- Redis selbst ist nur eine Datenbank-Engine. DSGVO-Konformität hängt von der Konfiguration und dem Einsatz ab. Für persönliche Daten sollten TLS-Verschlüsselung, Authentifizierung und ein klarer Löschprozess (TTL oder explizites Löschen) implementiert werden. Session-Daten sollten bei Logout aktiv gelöscht werden.
- Kann Redis als primäre Datenbank eingesetzt werden?
- Ja, für bestimmte Workloads. Redis Stack erweitert Redis um JSON-, Such- und Zeitreihenfunktionen. Viele Unternehmen nutzen Redis als primäre Datenbank für zeitkritische Daten wie Gaming-Leaderboards oder Echtzeit-Analysen. Für komplexe relationale Abfragen und ACID-Transaktionen ist jedoch eine klassische relationale Datenbank die bessere Wahl.