Redis steht für RE Knoten DI ctionary S erver, gegründet 2009 von Salvatore Sanfilippo. Memcached hingegen wurde 2003 von Brad Fitzpatrick entwickelt. Sowohl Redis als auch Memcached sind:
- NoSQL-In-Memory-Datenstrukturen
- Geschrieben in C
- Open-Source
- Wird verwendet, um Anwendungen zu beschleunigen
- Unterstützt eine Latenz von weniger als einer Millisekunde
Im Jahr 2014 schrieb Salvatore einen hervorragenden StackOverflow-Beitrag darüber, wann es sinnvoller ist, Memcached als Redis zu verwenden. In diesem Beitrag bieten wir einen aktuellen und detaillierten Vergleich zwischen Redis und Memcached, damit Sie eine fundierte Entscheidung über deren Verwendung in Ihrer Anwendung treffen können.
Infografik
Dieser Beitrag wurde in der folgenden Infografik zusammengefasst. Mit dieser Infografik können Sie die Ergebnisse dieses Vergleichs leicht visualisieren, um zu sehen, welches in verschiedenen Szenarien am besten abschneidet. Wenn Sie den Vergleich im Textformat lesen möchten, klicken Sie hier.
Dokumentation
Zunächst einmal ist Redis viel umfassender dokumentiert als Memcached. Dies erleichtert das Erlernen, Verwalten und Verwenden.
Datenbankmodell
Redis ist in erster Linie ein Key-Value-Store. Während Schlüssel binäre Zeichenfolgen sind, besteht der Vorteil bei Redis darin, dass der Wert nicht nur auf binäre Zeichenfolgen beschränkt ist. Sie können eine Vielzahl von Datenstrukturen sein, die das Speichern komplexer Objekte ermöglichen und eine Vielzahl von Operationen für sie bereitstellen. Redis sieht auch eine Erweiterbarkeit über Redis-Module vor. Redis-Module sind Erweiterungen, die zusätzliche Datenstrukturen und Funktionen bereitstellen, die im Kernfunktionssatz nicht verfügbar sind. Hier ist ein Beispiel einiger Funktionen, die jetzt als Module verfügbar sind:
- Dokumentspeicher
- Graph-DBMS
- Suchmaschine
- Zeitreihen-DBMS
Memcached ist ein einfacher Schlüsselwertspeicher, der nur binäre Zeichenfolgen als Wert unterstützt.
Datenstrukturen
Wie oben erwähnt, bietet Redis mehrere Datenstrukturtypen, die eine äußerst flexible Verwendung ermöglichen, darunter Strings, Hashes, Listen, Sets, sortierte Sets, Bitmaps, Bitfields, HyperLogLog, Geodaten-Indizes und Streams. Mehr darüber erfahren Sie in diesem Artikel Top Redis Use Cases by Core Data Structure Types.
Bildquelle:https://redislabs.com/redis-enterprise/data-structures/
Memcached unterstützt nur einfache binäre Zeichenfolgen, die sich hervorragend für schreibgeschützte Daten eignen. Wenn Sie also nicht den ganzen Schnickschnack von Redis benötigen, ist Memcached eine einfachere Datenbank für Sie zu verwenden.
Datenbankrang und Popularität
Die größere Popularität einer Datenbank führt zu einer größeren Benutzergemeinschaft, mehr Diskussionen und benutzergenerierten Tutorials und mehr Hilfe und Unterstützung durch Tools von Drittanbietern wie DBaaS-Plattformen und Analysetools zur Optimierung Ihrer Bereitstellungen.
Redis ist laut DB-Engines aufgrund seiner Einfachheit, reichhaltigen Datenstrukturen und großartigen Dokumentation im Februar 2021 die achtbeliebteste Datenbank der Welt. Memcached ist derzeit die 28. beliebteste Datenbank. Wenn Redis und Memcached in Bezug auf Key-Value-Datenbankmodelle eingestuft werden, steht Redis auf Platz 1 und Memcached auf Platz 4. Wenn Sie jedoch nur nach einer Open-Source-Schlüssel-Wert-Datenbank suchen oder eine, die vor Ort bereitgestellt werden kann, kommt Memcached an zweiter Stelle, da sowohl Amazon DynamoDB als auch Microsoft Azure Cosmos DB beides kommerzielle Datenbanken sind, die nur in bereitgestellt werden können die Wolke.
Architektur
Redis und Memcached folgen beide dem Client-Server die Architektur. Clients füllen die Daten im Server in Form von Schlüsselwerten auf.
Redis ist Single-Threaded, während Memcached andererseits eine Multithread-Architektur hat. Memcached skaliert besser auf einem System mit mehr Kernen, die mehr Operationen verarbeiten können, wenn die Rechenkapazität skaliert wird. Es kann jedoch mehr als eine Redis-Instanz auf demselben System initiiert werden, um zusätzliche Kerne zu nutzen.
Benutzerfreundlichkeit
Wie oben im Abschnitt Datenbankmodell erläutert, kann Redis als Multi-Modell-Datenbank mit jeder Art von Datenmodell verwendet werden. In Redis ist es einfach, Code zu schreiben, da es komplexe Aufgaben vereinfacht. Redis verfügt über erweiterte Datenstrukturen und ist nicht auf einfache Zeichenfolgenwerte beschränkt. Wenn Ihre Anwendung beispielsweise Daten in Sätzen speichert und Sie Sätze in einer Liste verfolgen möchten, können Sie dies ganz einfach in Redis tun. Eine ähnliche Aufgabe auf Memcached ist nicht möglich. Es gibt jedoch andere Möglichkeiten, dieselben Aufgaben auszuführen, die mehr Codezeilen erfordern.
Memcached hingegen speichert nur einfache Zeichenfolgenwerte. Die Anwendung muss sich also mit der Komplexität der Datenstruktur befassen.
Datenpartitionierung
Redis unterstützt die Partitionierung von Daten über mehrere Knoteninstanzen hinweg. Aktuelle Benutzer von Redis nutzen verschiedene Techniken wie Bereichspartitionierung, Hash-Partitionierung und konsistentes Hashing für die Datenpartitionierung. In Redis kann die Datenpartitionierung auf drei verschiedene Arten implementiert werden:
- Clientseitige Partitionierung
- Proxy-unterstützte Partitionierung (Beispiel:twemproxy)
- Serverseitige Partitionierung mit Abfrage-Routing innerhalb der Cluster-Knoten
Memcached unterstützt auch die Datenpartitionierung über mehrere Knoten hinweg, und konsistentes Hashing ist ein empfohlener Ansatz, um sicherzustellen, dass die Verkehrslast gleichmäßig verteilt wird.
Redis vs. Memcached – Vergleich 2021Click To TweetUnterstützte Sprachen
Redis unterstützt fast alle der am häufigsten verwendeten Programmiersprachen, von Hoch- bis zu Niedrigsprachen. Memcached unterstützt jedoch im Vergleich zu Redis weniger Sprachen, unterstützt aber alle gängigen Sprachen.
Memcache
- .Net
- K
- C++
- ColdFusion
- Erlang
- Java
- Lispeln
- Lua
- OCaml
- Perl
- PHP
- Python
- Rubin
Redis
- K
- C#
- C++
- Clojure
- Kristall
- D
- Pfeil
- Elixier
- Erlang
- Fantastisch
- Los
- Haskell
- Haxe
- Java
- JavaScript (Node.js)
- Lispeln
- Lua
- MatLab
- Ziel-C
- OCaml
- Pascal
- Perl
- PHP
- Prolog
- Reine Daten
- Python
- R
- Rebellieren
- Rubin
- Rost
- Skala
- Schema
- Smalltalk
- Schnell
- TCL
- Visual Basic
Transaktionen
Redis-„Transaktionen“ werden mit den drei folgenden Garantien ausgeführt:
- Transaktionen werden serialisiert und nacheinander ausgeführt
- Entweder alle Befehle oder keine werden verarbeitet (atomare Transaktionen)
- Optimistic Locking bietet eine zusätzliche Garantie mit Check-and-Set
Redis stellt sicher, dass auf einmal nur ein Befehl von einem Client-Rechner ausgeführt wird. Alle Befehle in den Transaktionen werden ausgeführt, wenn der Befehl „EXEC“ aufgerufen wird, um die Atomarität sicherzustellen.
Memcached hingegen bietet kein Transaktionsmanagement.
Replikation
Redis bietet eine einfache Leader-Follower (Master-Slave)-Replikation, die exakte Kopien der Master-Instanzen erstellt, mit diesen Funktionen:
- Der Master sendet weiterhin Datenbefehle an den Slave, solange sie verbunden sind.
- Wenn die Verbindung unterbrochen wird, folgt der Slave einer teilweisen Neusynchronisierung und kopiert nur die Daten, die während der Trennung verloren gegangen sind.
- Wenn eine teilweise Neusynchronisierung nicht möglich ist, wird eine vollständige Neusynchronisierung versucht.
Sie können auch die Hochverfügbarkeitsfunktionen, Redis Sentinels oder Redis Cluster, für erweiterten Failover-Schutz nutzen.
Natives Memcached unterstützt keine Replikation, aber Sie können Repcached verwenden, einen kostenlosen Open-Source-Patch, um Hochverfügbarkeit für Ihre Bereitstellung zu erreichen. Es bietet Multi-Master-Replikation, asynchrone Datenreplikation und unterstützt alle Memcached-Befehle.
Schnappschüsse/Persistenz
Snapshots sind einfach eine schreibgeschützte Ansicht Ihrer Datenbank, wie sie zu einem bestimmten Zeitpunkt war. Redis unterstützt Snapshots, und standardmäßig speichert Redis Snapshots des Datasets auf der Festplatte in einer Binärdatei namens dump.rdb. Sie können einen Snapshot manuell aufrufen oder die Häufigkeit anpassen oder den Schwellenwert für die Ausführung des Vorgangs ändern.
Hier sind die beiden Persistenzoptionen, die Redis unterstützt:
- RDB-Persistenz
- AOF-Persistenz
RDB steht für „Redis Database Backup“. Es handelt sich um eine kompakte Momentaufnahme der Datenbank zu einem bestimmten Zeitpunkt. Es nimmt weniger Speicherplatz ein, maximiert die Redis-Leistung und eignet sich gut für die Notfallwiederherstellung.
AOF steht für „Append Only File“. AOF verfolgt alle ausgeführten Befehle und führt in einer katastrophalen Situation die Befehle erneut aus, um die Daten zurückzubekommen. Diese Methode benötigt mehr Platz, da alle Befehle erneut ausgeführt werden, und ist keine sehr dauerhafte Methode zum Erstellen von Schnappschüssen.
Memcached hingegen unterstützt keine Persistenz auf der Festplatte.
Serverseitige Skripte
Lua ist die eingebettete Skriptsprache für Ihren Redis-Server, verfügbar ab Version 2.6, mit der Sie Vorgänge innerhalb von Redis ausführen können, um Ihren Code zu vereinfachen und die Leistung zu steigern. Die beiden Hauptfunktionen zum Auswerten von Skripten mit dem Lua-Interpreter sind:
- EVAL
- EVALSHA
Wenn das Lua-Skript ausgeführt wird, werden alle anderen Anfragen blockiert, wie in der Abbildung unten gezeigt.
Redis enthält auch den Lua-Skript-Debugger in Version 3.2, der das Schreiben komplexer Skripts vereinfacht und die Leistung steigert.
Memcached unterstützt kein serverseitiges Scripting.
Skalierbarkeit
Es gibt zwei Techniken, um Ihre Redis-Datenbank horizontal zu skalieren:
- Hinzufügen von Shards in Redis-Clustern
- Hinzufügen von Knoten zu einem Redis HA (Master/Replikat)-Setup
Sie können Ihr Redis-Setup auch vertikal skalieren, wenn Sie mehr Speicher oder Rechenleistung benötigen. Dies kann ohne Ausfallzeit erfolgen, wenn Sie ein HA-Setup haben oder die Redis-Cluster-Technologie verwenden.
Der Memcached-Server bietet keinen Mechanismus zum Verteilen von Daten über Knoten (Sharding). In Memcached ist die horizontale Skalierbarkeit also so einfach wie das Hinzufügen weiterer Knoten – das Problem der Partitionierung Ihrer Daten in verschiedene Shards muss auf Anwendungs-/Clientebene gelöst werden. Es gibt einige Open-Source-Tools, die Ihnen dabei helfen können.
Kommunikationsprotokoll
Redis verwendet TCP als Netzwerkprotokoll und unterstützt UDP nicht.
Memcached unterstützt sowohl das TCP- als auch das UDP-Kommunikationsprotokoll. Daten werden in zwei Formen an den Memcached-Server gesendet:
- Textzeilen:Befehle senden und Antworten vom Server empfangen.
- Unstrukturierte Daten:Empfangen oder senden Sie Wertinformationen für einen bestimmten Schlüssel, und die Daten werden im gleichen bereitgestellten Format zurückgegeben.
Unterstützte Cache-Eviction-Richtlinien
Redis unterstützt verschiedene Arten von Entfernungsrichtlinien. Sehen wir uns einige an.
- keine Räumung: Bei „noeviction“ wird ein Fehler zurückgegeben, wenn der Speicher seine Grenze erreicht.
- allkeys-lru: Lru steht für „am wenigsten verwendet“. Diese Richtlinie entfernt die am längsten verwendeten Daten.
- allkeys-lfu: Lfu steht für „am wenigsten häufig verwendet“. Diese Richtlinie entfernt die am wenigsten verwendeten Daten.
- allkeys-random: Diese Richtlinie entfernt die Daten nach dem Zufallsprinzip.
- volatile-lru: Flüchtige Daten sind mit Ablaufdatensatz. Diese Richtlinie entfernt die am längsten verwendeten flüchtigen Daten.
- volatile-lfu: Flüchtige Daten sind mit Ablaufdatensatz. Diese Richtlinie entfernt die am wenigsten verwendeten flüchtigen Daten.
- volatile-random: Diese Richtlinie entfernt die flüchtigen Daten nach dem Zufallsprinzip.
- volatile-ttl: „TTL“ steht für Time to Live. Diese Richtlinie entfernt die Daten mit der kürzesten Lebensdauer.
Memcached verwendet den LRU-Algorithmus, um Daten zu entfernen, wenn Speicherplatz benötigt wird. Es sucht zuerst nach den bereits abgelaufenen Daten, die gelöscht werden sollen, wenn abgelaufene Daten nicht verfügbar sind, wird der LRU-Algorithmus verwendet.
Nachrichten veröffentlichen und abonnieren
Redis unterstützt Pub/Sub-Messaging (Veröffentlichen und Abonnieren). Es gibt drei Befehle, die für diesen Zweck verwendet werden.
Der Client verwendet:
- Abonnieren
- Abbestellen
Abonnieren und Abbestellen werden verwendet, um Nachrichten von einem bestimmten Kanal zu erhalten.
Der Server verwendet:
- Veröffentlichen
Das „Veröffentlichen“ wird verwendet, um Daten an die Clients zu pushen.
Memcached unterstützt keine Nachrichten zum Veröffentlichen und Abonnieren.
Streams-Unterstützung
Redis unterstützt Kafka-ähnliche Streams mit Version 5.0 oder höher unter Verwendung einer neuen Datenstruktur „Redis Streams“. Redis Streams hat das Konzept von Verbrauchergruppen wie Apache Kafka, das es Client-Anwendungen ermöglicht, Nachrichten auf verteilte Weise zu konsumieren, wodurch es einfach ist, hochverfügbare Systeme zu skalieren und zu erstellen.
Memcached bietet keine native Unterstützung für Streams, aber es gibt Open-Source-Bibliothekstools wie Kafcache für die Stream-Verarbeitung mit geringer Latenz.
Georäumliche Unterstützung
Redis hat eine Datenstruktur namens Geospatial-Indizes, die die Längen- und Breitengraddaten eines Standorts speichert. Sie können verschiedene Operationen mit den Geodaten ausführen, z. B. die Entfernung zwischen zwei Punkten berechnen oder Orte in der Nähe suchen.
Memcached hat keine speziellen Datenstrukturen zur Handhabung von Geodaten.
Leistung
Ein Leistungsvergleich zwischen In-Memory-Schlüsselwert-Datenspeichern ist eher eine intellektuelle Übung als von praktischer Bedeutung – es sei denn, Sie stellen Systeme in einem solchen Umfang bereit, dass dies interessant wird eine Sparmaßnahme. Dies liegt daran, dass solche Speicher E/A-gebunden sind und die Netzwerklatenz normalerweise eine größere Rolle bei der von der Anwendung wahrgenommenen Latenz spielt als die Datenbanklatenz.
Ein praktischerer Leistungsaspekt ist die Speichereffizienz – wie viele Daten können in die gleiche Menge an Speicher gepackt werden. Auch hier variieren die von Redis verwendeten internen Datenstrukturen je nach Datengröße. Daher ist jede Diskussion über die Leistung zwischen diesen Datenbanken mit Vorsicht zu genießen.
Werfen wir einen Blick auf einige Vergleiche, die in einem Forschungsbericht aus dem Jahr 2016 gezeigt werden. In diesem Artikel testen die Autoren die weit verbreiteten In-Memory-Datenbanken, um ihre Leistung in Bezug auf Folgendes zu messen:
- Die Zeit, die zum Abschließen von Vorgängen benötigt wird.
- Wie effizient sie den Speicher während des Betriebs nutzen.
Im Artikel verwendete Datenbankversionen:
Datenbank | Version |
---|---|
Redis | 3.0.7 |
Memcached | 1.4.14 |
Schreibvorgang
Wie Sie in der Tabelle unten sehen können, zeigt Memcached beim Schreiben von Daten eine außergewöhnliche Geschwindigkeit, selbst wenn sich die Anzahl der Datensätze auf Millionen erhöht.
Die berechnete Zeit zum Schreiben von Schlüssel/Wert-Paaren (ms)
Anzahl der Datensätze | ||||
---|---|---|---|---|
Datenbank | 1.000 | 10.000 | 100.000 | 1.000.000 |
Redis | 34 | 214 | 1.666 | 14.638 |
Memcached | 23 | 100 | 276 | 2.813 |
Lesevorgang
Das Lesen von Daten bleibt in Redis selbst für eine Million Datensätze nahezu konsistent, aber in Memcached steigt mit zunehmender Anzahl von Datensätzen auch die Zeit ein wenig.
Die verstrichene Zeit zum Lesen eines Werts, der einem bestimmten Schlüssel pro Datenbank entspricht (ms)
Anzahl der Datensätze | ||||
---|---|---|---|---|
Datenbank | 1.000 | 10.000 | 100.000 | 1.000.000 |
Redis | 8 | 6 | 8 | 8 |
Memcached | 9 | 14 | 14 | 30 |
Speichernutzung
Während der Diskussion über die Speichernutzung ist Redis immer das Beste, wie Sie in den Ergebnissen sehen können.
Speichernutzung von In-Memory-Datenbanken für Schreibvorgänge (MB)
Anzahl der Datensätze | ||||
---|---|---|---|---|
Datenbank | 1.000 | 10.000 | 100.000 | 1.000.000 |
Redis | 2.5 | 3.8 | 4.3 | 62,7 |
Memcached | 5.3 | 27.2 | 211 | 264,9 |
Wie Sie sehen, ist Redis besser als Memcached.
Speichernutzung von In-Memory-Datenbanken für Löschvorgänge (MB)
Anzahl der Datensätze | ||||
---|---|---|---|---|
Datenbank | 1.000 | 10.000 | 100.000 | 1.000.000 |
Redis | 0 | 0 | 0 | 0 |
Memcached | 2.2 | 2.1 | 2.2 | 2.2 |
Verwaltete Dienste/Support
Die größere Popularität und Community für Redis hat auch den Bedarf an Managed Services, Hosting und Support erhöht. Zu den beliebten Anbietern verwalteter Datenbanken für Redis™* gehören ScaleGrid, Redis Labs, AWS Elasticache, Azure Cache und DigitalOcean. Diese Seite bietet einen großartigen Vergleich der Top-Anbieter für Redis™. Redis verfügt auch über umfangreiche interne Berichtstools wie Cache-Treffer, Speichernutzung, Operationen und sogar eine langsame Abfrage, die protokolliert wird.
Managed Services für Memcached sind weit weniger verfügbar, werden aber dennoch von Amazon Elasticache unterstützt.
Transport Layer Security (TLS)-Unterstützung
Redis bietet ab Redis 6.0 native TLS-Unterstützung. Frühere Versionen von Redis empfahlen die Verwendung von Stunnel für die Bereitstellung von TLS-Unterstützung.
Memcached 1.5.13 und höhere Versionen unterstützen Authentifizierung und Verschlüsselung über TLS. Diese Funktion befindet sich noch im Versuchsstadium.
Authentifizierung
Bis zu Redis 5.x unterstützte Redis nur eine einfache passwortbasierte Authentifizierung. Dieses Passwort wurde im Klartext auf dem Server gespeichert. Redis ab Version 6.0 unterstützt eine voll funktionsfähige ACL.
Memcached Version 1.4.3 und höher unterstützt SASL. Zuvor hatte Memcached keine Authentifizierungsschicht.
Zusammenfassung
Redis und Memcached sind beide großartig und haben Anwendungen in verschiedenen Bereichen. Redis, das später entwickelt wird, hat viele erweiterte Funktionen und eine großartige Dokumentation und Community.
|
*Redis ist eine Marke von Redis Labs Ltd. Alle Rechte daran sind Redis Labs Ltd vorbehalten. Jegliche Verwendung durch ScaleGrid dient nur zu Referenzzwecken und weist nicht auf Sponsoring oder Billigung hin oder Zugehörigkeit zwischen Redis und ScaleGrid.