Redis (Remote Dictionary Server) ist eine In-Memory-Schlüssel-Wert-Datenbank, die als verteilter Cache und Message Broker mit optionaler Persistenz verwendet wird. Da sie alle Daten im Arbeitsspeicher hält und aufgrund ihres Designs bietet Redis Lese- und Schreibzugriffe mit geringer Latenz, was sie besonders für Anwendungsfälle geeignet macht, die einen Cache erfordern. Das Projekt wurde von Salvatore Sanfilippo ab 2009 entwickelt und gepflegt und hat sich durch mehrere Sponsoren und Lizenzänderungen zu einer weit verbreiteten Dateninfrastrukturkomponente entwickelt.
Redis fungiert sowohl als Datenspeicher als auch als Cache und unterscheidet sich damit von traditionellen relationalen Datenbankmanagementsystemen (RDBMS). Sein Datenmodell basiert auf abstrakten Datentypen anstelle von SQL-Abfragen und ist für den direkten Abruf ohne Sekundärindizes oder Aggregationen optimiert. Dieses Design, kombiniert mit dem In-Memory-Betrieb, ermöglicht Antwortzeiten im Sub-Millisekundenbereich für viele Workloads.
Geschichte
Das Redis-Projekt begann, als Salvatore Sanfilippo (Spitzname antirez) versuchte, die Skalierbarkeit seines italienischen Startups zu verbessern und einen Echtzeit-Web-Log-Analysator entwickelte. Nachdem er beim Skalieren bestimmter Workload-Typen mit traditionellen Datenbanksystemen auf erhebliche Probleme gestoßen war, begann Sanfilippo 2009, eine erste Proof-of-Concept-Version von Redis in Tcl zu prototypisieren. Später übersetzte Sanfilippo diesen Prototyp in die Programmiersprache C und implementierte den ersten Datentyp, die Liste. Nachdem er das Projekt einige Wochen lang intern erfolgreich genutzt hatte, entschied sich Sanfilippo, es als Open Source zu veröffentlichen und kündigte das Projekt auf Hacker News an. Das Projekt gewann an Zugkraft, insbesondere in der Ruby-Community, wobei GitHub und Instagram zu den ersten Unternehmen gehörten, die es übernahmen.
Sanfilippo wurde im März 2010 von VMware eingestellt. Im Mai 2013 wurde Redis von Pivotal Software (einem Spin-off von VMware) gesponsert. Im Juni 2015 wurde die Entwicklung von Redis Ltd. gesponsert. Im Oktober 2018 wurde Redis 5.0 veröffentlicht, das Redis Stream einführte, eine neue Datenstruktur, die die Speicherung mehrerer Felder und Zeichenfolgenwerte mit einer automatischen, zeitbasierten Sequenz an einem einzigen Schlüssel ermöglicht. Im Juni 2020 trat Sanfilippo als alleiniger Maintainer von Redis zurück, seine Nachfolge traten Yossi Gottlieb und Oran Agra an. Sanfilippo kehrte im Dezember 2024 zu Redis zurück.
Lizenzentwicklung
Im August 2018 kündigte Redis Ltd. an, die optionalen Redis-Module von der GNU Affero General Public License (AGPL) auf die Apache License umzulizenzieren, jedoch mit einem Zusatz, der als "Commons Clause" bekannt ist und die kommerzielle Nutzung einschränkt, um die Nutzung der Software durch verwaltete Cloud-Anbieter ohne angemessene Vergütung zu kontrollieren. Dies machte die Module quelloffen, aber nicht mehr freie Software. Die Kernsoftware von Redis blieb unter einer BSD-Lizenz, wobei sich Redis Ltd. verpflichtete, diese Bedingungen beizubehalten.
Im Februar 2019 wurden die Lizenzbedingungen der Apache License mit Commons Clause für Redis-Module aufgrund von Verwirrung über die Lizenzbedingungen durch die "Redis Source Available License" (RSAL) ersetzt, die die kommerzielle Nutzung der Module als Teil "einer Datenbank, einer Caching-Engine, einer Stream-Processing-Engine, einer Suchmaschine, einer Indexierungs-Engine oder einer ML/DL/AI-Serving-Engine" ausdrücklich verbietet. Die letzte Überarbeitung der Module unter einer freien und Open-Source-Lizenz wurde von Community-Mitgliedern als GoodFORM-Projekt geforkt.
Im März 2024 kündigte Redis Ltd. an, dass die Kernsoftware von Redis ab Version 7.4 unter der RSAL und der Server Side Public License (SSPL) neu lizenziert wird, die beide quelloffen und nicht frei sind. Die Linux Foundation kündigte daraufhin an, die letzte BSD-lizenzierte Version von Redis als Valkey zu forken. Im Mai 2025 kündigte Redis Ltd. an, die Lizenz ab Version 8.0 erneut auf die AGPL zu ändern, mit der Begründung, dass Forks ihr Ziel erreicht hätten, ein "faires Spielfeld" für differenzierte Produkte zu schaffen, und dass Redis seit der Lizenzänderung ein "Rekordwachstum" erzielt habe.
Datenmodell und Typen
Redis bildet Schlüssel auf Werttypen ab. Redis unterstützt eine Reihe von Datentypen, darunter Strings, JavaScript Object Notation (JSON)-Dokumente, Hashes (eine Sammlung von Feldern, wobei jedes Feld ein Name-Wert-String-Paar ist), Listen, Mengen, Vektormengen und mehr. Diese Vielfalt ermöglicht es Entwicklern, verschiedene Anwendungsszenarien direkt in Redis zu modellieren, von einfachen Schlüssel-Wert-Lookups bis hin zu komplexen Datenstrukturen wie sortierten Mengen für Bestenlisten oder geografischen Indizes.
Die Redis Query Engine ermöglicht es Benutzern, Redis als Dokumentdatenbank, Vektordatenbank, Sekundärindex und Suchmaschine zu verwenden. Mit der Redis Query Engine können Benutzer Indizes für Hash- und JSON-Dokumente definieren und eine umfangreiche Abfragesprache für Vektorsuche, Volltextsuche, geografische Abfragen und Aggregationen verwenden. Dies erweitert Redis über einen einfachen Cache hinaus zu einer Multi-Modell-Datenplattform, die moderne Anwendungen unterstützt, die flexible Abfragefunktionen benötigen.
Messaging und Transaktionen
Redis Pub/Sub (kurz für publish/subscribe) ist eine leichtgewichtige Messaging-Funktion. Publisher senden Nachrichten an einen Kanal, und Abonnenten empfangen Nachrichten von diesem Kanal. Dieses Muster wird häufig für Echtzeit-Benachrichtigungen, Chat-Systeme und ereignisgesteuerte Architekturen verwendet, bei denen entkoppelte Komponenten asynchron kommunizieren müssen.
Eine Redis-Transaktion ermöglicht die Ausführung einer Gruppe von Befehlen in einem einzigen Schritt. Eine von einem anderen Client gesendete Anfrage wird während der Ausführung einer Transaktion niemals bedient. Dies garantiert, dass die Befehle als eine einzige isolierte Operation ausgeführt werden. Redis-Transaktionen basieren auf einem Warteschlangen-und-Ausführen-Modell, bei dem Befehle in eine Warteschlange gestellt und dann sequenziell ohne Unterbrechung ausgeführt werden, wodurch die Atomizität für den Stapel gewährleistet wird.
Redis-Benutzer können auch Lua-Skripte auf dem Server hochladen und ausführen. Diese Funktion ermöglicht es, komplexe Operationen serverseitig atomar auszuführen, wodurch Netzwerk-Round-Trips reduziert und Konsistenz sichergestellt werden. Lua-Scripting ist besonders nützlich für die Implementierung von benutzerdefinierter Geschäftslogik, die nahe an den Daten ausgeführt werden muss.
Persistenz und Dauerhaftigkeit
Redis hält typischerweise den gesamten Datensatz im Arbeitsspeicher. Versionen bis 2.4 konnten so konfiguriert werden, dass sie den sogenannten virtuellen Speicher verwenden, bei dem ein Teil des Datensatzes auf der Festplatte gespeichert wird, aber diese Funktion ist veraltet. Die Persistenz in Redis kann auf zwei verschiedene Arten erreicht werden: durch Snapshotting, bei dem der Datensatz in regelmäßigen Abständen asynchron vom Speicher auf die Festplatte als binärer Dump unter Verwendung des Redis RDB Dump File Formats übertragen wird; oder durch Journaling, bei dem ein Protokoll jeder Operation, die den Datensatz modifiziert, in einem Hintergrundprozess zu einer Append-Only-Datei (AOF) hinzugefügt wird. Redis kann die Append-Only-Datei im Hintergrund neu schreiben, um sie zu kompaktieren und die Wiederherstellungszeit zu verkürzen.
Die Redis-Implementierung verwendet den Systemaufruf fork, um den Prozess zu duplizieren, der die Daten hält. Dies ermöglicht es dem Elternprozess, weiterhin Clients zu bedienen, während der Kindprozess die In-Memory-Daten auf der Festplatte persistiert. Dieses Design minimiert Ausfallzeiten während Persistenzoperationen und ist ein Schlüsselfaktor für die Fähigkeit von Redis, hohe Verfügbarkeit aufrechtzuerhalten und gleichzeitig Datenhaltbarkeit zu gewährleisten.
Unterschiede zu anderen Datenbanksystemen
Redis ist ein System, das sowohl als Datenspeicher als auch als Cache fungiert. Daten werden im Hauptspeicher des Computers modifiziert und gelesen, während sie auch auf der Festplatte in einem Format persistiert werden, das für sequenziellen Zugriff anstelle von wahlfreiem Zugriff optimiert ist. Die formatierten Daten werden erst beim Neustart des Systems wieder im Speicher rekonstruiert. Dieser Ansatz steht im Gegensatz zu traditionellen Datenbanken, die hauptsächlich auf plattenbasierter Speicherung und wahlfreien Zugriffsmustern basieren.
Redis verwendet ein Datenmodell, das sich von relationalen Datenbankmanagementsystemen (RDBMS) unterscheidet. Befehle spezifizieren Operationen auf abstrakten Datentypen anstelle von Abfragen, die von einer Datenbank-Engine ausgeführt werden. Daten werden in Strukturen gespeichert, die für den direkten Abruf ausgelegt sind. Es verlässt sich nicht auf Sekundärindizes, Aggregationen oder andere Funktionen, die in traditionellen RDBMS üblich sind. Diese Einfachheit und der Fokus auf In-Memory-Betrieb machen Redis für bestimmte Zugriffsmuster außergewöhnlich schnell, bedeuten aber auch, dass komplexe analytische Abfragen besser für andere Systeme geeignet sind.
Moderne Nutzung und Ökosystem
Ab dem 1. Mai 2025 sind für alle Versionen von Redis ab 8.0 alle Datentypen im selben Paket enthalten und unter der Redis Source Available License v2 verfügbar. Zuvor waren einige Datentypen getrennt und daher unter verschiedenen Lizenzen verfügbar. Diese Konsolidierung vereinfacht Bereitstellung und Lizenzierung für Benutzer und macht Redis zu einer kohärenteren Plattform.
Redis ist zu einem grundlegenden Bestandteil vieler Technologie-Stacks geworden und wird oft zusammen mit Cloud-Anbietern und großen Cloud-Plattformen für Caching, Sitzungsverwaltung und Echtzeitanalysen verwendet. Seine Eigenschaften mit geringer Latenz machen es auch für KI- und Machine-Learning-Anwendungen geeignet, die schnellen Datenzugriff für Modellbereitstellung oder Feature-Stores erfordern. Die Unterstützung der Redis Query Engine für Vektorsuche deckt sich mit der wachsenden Nachfrage nach generativer KI und Large-Language-Model-Anwendungen, die auf Ähnlichkeitssuche über Embeddings angewiesen sind.