Was ist Redis

Redis (was Remote Dictionary Serve bedeutet) ist eine Open-Source NoSQL-Datenbank, die als schneller In-Memory-Schlüsselwert-Datenspeicher, Cache, Message Broker und Warteschlange bekannt ist. Das Projekt wurde von Salvatore ‚antirez‘ Sanfilippo, dem ursprünglichen Entwickler von Redis, ins Leben gerufen. Er versuchte, die Skalierbarkeit seines italienischen Startups zu verbessern, das einen Echtzeit-Web-Log-Analysator entwickelte. Nachdem er bei der Skalierung einiger Arten von Arbeitslasten mit herkömmlichen Datenbanksystemen auf erhebliche Probleme gestoßen war, begann er mit der Entwicklung eines Prototyps einer ersten Proof-of-Concept-Version von Redis. Github und Instagram gehören zu den ersten Unternehmen, die diese Technologie einsetzen. Es ist also nicht verwunderlich, dass sie nicht nur von großen Unternehmen, sondern auch von Entwicklern angenommen und gefördert wird.

Redis wurde in der Sprache ANSI C geschrieben und funktioniert in den meisten POSIX-Systemen wie BSD, Linux und OS X, ohne dass es externe Abhängigkeiten gibt. OS X und Linux gelten als die beiden Betriebssysteme, auf denen Redis am meisten entwickelt und getestet wurde, während Linux für den Einsatz verwendet wurde. Redis läuft zwar auch auf den von Solaris abgeleiteten Systemen wie SmartOS, aber die Unterstützung ist das Beste, was es gibt. Leider gibt es keine offizielle Unterstützung für die Windows-Builds, aber Microsoft hat einen Win-64-Port für Redis entwickelt und pflegt ihn. Im Jahr 2019 feierte Redis sein 10-jähriges Jubiläum.

Redis liefert heute Antwortzeiten von weniger als einer Millisekunde und ermöglicht Millionen von Anfragen pro Sekunde für Echtzeitanwendungen in den Bereichen Gaming, IoT, soziale Netzwerke, Finanzdienstleistungen, Gesundheitswesen und Werbetechnik. Redis ist eine beliebte Wahl für Caching, Sitzungsmanagement, Spiele, Leaderboards, Echtzeit-Analysen, Geospatial, Ride-Hailing, Chat/Messaging, Media-Streaming und Pub/Sub-Apps.

Es unterstützt Datenstrukturen wie Strings, Hashes, Listen, Sets, sortierte Sets mit Bereichsabfragen, Bitmaps, Hyperlogs und geospatiale Indizes mit Radiusabfragen. Es verfügt über LRU Eviction, Lua-Scripting, integrierte Replikation, Transaktionen sowie verschiedene Stufen der On-Disk-Persistenz. Es verfügt über integrierte Unterstützung für Hochverfügbarkeitslösungen durch Redis Sentinel oder durch die Nutzung von Redis Cluster mit automatischer Partitionierung.

Häufige Anwendungsfälle für erfahrene Redis-Benutzer sind Aufgaben wie das Inkrementieren eines Hash-Werts, das Anhängen an eine Zeichenkette, das Berechnen von Schnittmengen, Vereinigungen und Differenzen, das Hinzufügen eines Elements zu einer Liste oder das Sammeln des Mitglieds mit dem höchsten Rang in einer sortierten Menge. Redis verwaltet diese Arten von Aufgaben auf einem optimalen Niveau, was zu einer hervorragenden Leistung führen kann. Der Grund dafür ist, dass Redis mit einem integrierten Speicherdatensatz arbeitet.

Je nach Anwendungsfall können Sie den Datensatz entweder ab und zu auf der Festplatte speichern oder die einzelnen Befehle an ein Protokoll anhängen. Die Persistenz kann einfach deaktiviert werden, wenn Sie einen vernetzten, funktionsreichen In-Memory-Cache benötigen.

Wie andere gängige Datenbanken unterstützt auch Redis die asynchrone Master-Slave-Replikation sowie eine sehr schnelle, nicht blockierende Synchronisierung, eine automatische Wiederverbindung mit einer teilweisen Neusynchronisierung, wenn die Verbindung zwischen dem Master und dem Replikat unterbrochen wird, z.B. aufgrund von Netzwerkproblemen oder einer Timeout-Verbindung. Wenn eine teilweise Neusynchronisierung sinnvoll ist, stellt das Replikat die Verbindung wieder her und versucht, mit einer teilweisen Neusynchronisierung fortzufahren: Das bedeutet, dass es versucht, nur den Teil des Befehlsstroms zu erhalten, den es während der Unterbrechung der Verbindung verpasst hat.

Redis-Funktionen

Die Funktionen von Redis heben die Bedeutung seiner Fähigkeiten hervor, die es bereitstellen und Ihre bestehende Umgebung mit seinen charakteristischen Merkmalen aufwerten kann. Jede Technologie hat viele individuelle Merkmale und Eigenschaften. Auch Redis hat einige sehr wichtige und nützliche Funktionen, die Sie nutzen können. Wir werden diese in diesem Glossar nach und nach aufgreifen.

Rich Data Strukturen

Redis bietet fünf mögliche Datenoptionen für die Werte. Diese sind Hashes, Lists, Sets, Strings und Sorted Sets. Die Operationen, die für diese Datentypen einzigartig sind, sind angegeben und werden mit der gut dokumentierten Zeitkomplexität (The Big O Notation) geliefert.

Redis ist mehr als nur eine gewöhnliche Key-Value-Datenspeichertechnologie. Es bietet eine große Vielfalt an Datenstrukturen, um unsere Anwendungsanforderungen zu erfüllen. Sie ermöglicht es den Benutzern, Anwendungen entsprechend den Anforderungen des Kunden zu implementieren, ohne sich an die Einschränkungen der Technologie halten zu müssen. Die verfügbaren Datenstrukturen sind unten aufgeführt.

Strings: Textdaten bis zu einer Größe von 512MB.

Lists: Eine Sammlung von Strings. Die Reihenfolge des Hinzufügens wird beibehalten.

Sets: Eine ungeordnete Sammlung von Strings mit der Möglichkeit, Mengenoperationen durchzuführen

Sorted Sets: Mengen, die nach einem mit einem Schlüssel verknüpften Wert geordnet sind. Kann für Leaderboard- und Scoreboard-Implementierungen verwendet werden.

Hashes: Eine Datenstruktur zum Speichern einer Liste von Feldern und Werten, ähnlich wie bei Hashmaps.

Bitmaps: Ein Datentyp, mit dem Operationen auf Bit-Ebene durchgeführt werden können.

HyperLogLogs: Eine probabilistische Datenstruktur zur Schätzung der eindeutigen Elemente in einem Datensatz. Kann zur Durchführung probabilistischer Berechnungen verwendet werden.

Persistenz der Daten

Datenpersistenz bedeutet, dass die Daten überleben, nachdem der Erzeugungsprozess der jeweiligen Daten beendet ist. Mit anderen Worten: Gespeicherte Daten müssen auch dann noch vorhanden sein, wenn der Server ausfällt. Damit ein Datenspeicher als persistent gilt, muss er auf einen permanenten Speicher (d.h. einen nichtflüchtigen Speicher wie eine Festplatte oder SSD) geschrieben werden.

Redis speichert normalerweise den gesamten Datensatz im Speicher. Für die Persistenz unterstützt Redis Point-in-Time-Backups (Kopieren des Redis-Datensatzes auf die Festplatte). Redis unterstützt den RDB- und AOF-Persistenzmechanismus, um die Daten im nichtflüchtigen Speicher zu halten.

Die Persistenz in Redis kann durch zwei verschiedene Methoden erreicht werden. Erstens durch Snapshotting, bei dem der Datensatz in regelmäßigen Abständen asynchron als binärer Dump vom Speicher auf die Festplatte übertragen wird, wobei das Redis RDB Dump File Format verwendet wird. Oder durch Journaling, bei dem eine Aufzeichnung jeder Operation, die den Datensatz verändert, in einem Hintergrundprozess zu einer Append-Only-Datei (AOF) hinzugefügt wird. Redis kann die Append-Only-Datei im Hintergrund neu schreiben, um ein unendliches Wachstum des Journals zu vermeiden. Das Journaling wurde in Version 1.1 eingeführt und gilt allgemein als der sicherere Ansatz.

Standardmäßig schreibt Redis mindestens alle 2 Sekunden Daten in ein Dateisystem, wobei bei Bedarf mehr oder weniger robuste Optionen zur Verfügung stehen. Im Falle eines kompletten Systemausfalls würden bei den Standardeinstellungen nur einige Sekunden an Daten verloren gehen.

Performance

Die Leistung von Redis ist extrem effizient. Aufgrund des In-Memory-Charakters, des Engagements eines Projektmanagers, die Komplexität auf ein Minimum zu beschränken, sowie eines ereignisbasierten Programmiermodells rühmt sich die Anwendung mit einer außergewöhnlichen Leistung bei Lese- und Schreibvorgängen.

Wenn die Dauerhaftigkeit der Daten nicht benötigt wird, kann Redis dank seiner In-Memory-Natur im Vergleich zu Datenbanksystemen, die jede Änderung auf die Festplatte schreiben, bevor sie eine Transaktion als abgeschlossen betrachten, eine gute Leistung erzielen. Redis arbeitet als ein einziger Prozess und ist single-threaded oder double-threaded, wenn es die AOF (append-only file) neu schreibt. Daher kann eine einzelne Redis-Instanz keine parallele Ausführung von Aufgaben wie z.B. gespeicherten Prozeduren verwenden.

Hohe Verfügbarkeit

Redis verfügt über integrierte Unterstützung für nicht-blockierende, asynchrone, primäre/replizierende Replikation, um eine hohe Datenverfügbarkeit zu gewährleisten. Wir haben dies bereits in unseren früheren Blogs besprochen.

Grundsätzlich bietet Redis eine Primär-Replikat-Architektur in einer primären Einzelknoten- oder einer Clustertopologie. Damit können Sie hochverfügbare Lösungen aufbauen, die eine konsistente Leistung und Zuverlässigkeit bieten. Redis ist in der Regel ein Single-Thread-Server, aber moderne Versionen von Redis verwenden Threads für verschiedene Aufgaben. Er ist nicht dafür ausgelegt, von mehreren CPU-Kernen zu profitieren. Es wird empfohlen, mehrere Redis-Instanzen zu starten, um bei Bedarf auf mehrere Kerne zu skalieren. Der Redis-Server verwendet eine Master-Slave-Architektur (primär/repliziert), um die Last zu erhöhen, die der Server bewältigen kann. Dank der primären/replizierenden Architektur von Redis kann die Leseleistung verbessert werden, wenn Leseanfragen auf die Server aufgeteilt werden, und die Wiederherstellung erfolgt schneller, wenn der primäre Server ausfällt. Sie können dies nutzen, um mehr über die Verfügbarkeit von Redis zu erfahren.

Wenn Sie Redis Cluster verwenden, ist die vertikale Skalierung super effizient und sehr einfach zu verwalten. Es gibt eine Reihe von Befehlen, die Sie nutzen können, wie z.B. Resharding und Rebalancing von Hash-Slots. Wenn Sie ein traditionelles Primär-Replikat-Setup mit Redis verwenden möchten, müssen Sie Sentinel integrieren und die richtigen Redis-Clients mit konsistentem Hashing verwenden, wenn Sie Ihre primären Knoten für die Verteilung von Schreibanfragen splitten und skalieren möchten.

Einfach effizient und Leichtgewicht

Redis ist in der Sprache ANSI C geschrieben und hat keine externen Abhängigkeiten. Das Programm funktioniert problemlos in allen POSIX-Umgebungen. Die Windows-Plattform wird von Redis nicht offiziell unterstützt, aber ein experimentelles Build wurde von Microsoft für diese Plattform bereitgestellt.

Redis unterstützt außerdem Sprachen wie C, C++, C#, Java, JavaScript, Node.js, Python, PHP, Ruby, R und viele andere. Wie bereits erwähnt, verfügt Redis über native Datenstrukturen. Redis hat eine sehr große und dynamische Community-Unterstützung. Sie ermöglicht die Erweiterbarkeit von Redis. Die Integration von ein paar Zeilen und Aktionen zur Speicherung, zum Zugriff und zur Verwendung von Daten in bestehenden Anwendungen ist ziemlich unkompliziert und einfach.

Caching

Der Cache ist ein temporärer Speicher, in dem Daten gespeichert werden, damit in Zukunft schneller auf sie zugegriffen werden kann. Caching ist also der Prozess der Speicherung von Daten im Cache. Redis ist eine gute Wahl für die Implementierung eines hochverfügbaren In-Memory-Cache, um die Latenzzeit beim Datenzugriff mit Festplatte oder SSD zu verringern, einen hohen Durchsatz zu erzielen und die Datenbank und die Anwendung zu entlasten. Caching von Webseiten, Caching von Datenbankabfrageergebnissen, persistentes Session-Caching und Caching von häufig verwendeten Objekten wie Bildern, Dateien und Metadaten sind beliebte Beispiele für Caching-Lösungen mit Redis.

Sitzungsspeicher

Sitzungsstatus sind benutzerbezogene Daten, die den aktuellen Status der Benutzerinteraktion mit Anwendungen wie einer Website erfassen. Eine typische Webanwendung speichert für jeden mit dem System verbundenen Benutzer eine Sitzung, solange der Benutzer beim System angemeldet ist. Der Sitzungsstatus ist die Art und Weise, wie sich Anwendungen die Identität des Benutzers, seine Anmeldedaten, Personalisierungsinformationen, die letzten Aktionen, die Details des Warenkorbs und vieles mehr merken.

Das Lesen und Schreiben von Sitzungsdaten bei jeder Benutzerinteraktion muss ohne Beeinträchtigung der Benutzererfahrung erfolgen. Solange die Benutzersitzung aktiv ist, sollte daher kein Round-Trip zur Hauptdatenbank erforderlich sein. Der letzte Schritt im Lebenszyklus des Sitzungsstatus erfolgt, wenn der Benutzer die Verbindung trennt. Einige Daten werden zur späteren Verwendung in der Datenbank gespeichert, aber flüchtige Informationen können nach Beendigung der Sitzung verworfen werden.