Zusammenfassung (TL;DR)
Aktualisiert am 3. Juni 2017
Redis ist leistungsfähiger, beliebter und wird besser unterstützt als Memcached. Memcached kann nur einen kleinen Bruchteil dessen, was Redis kann. Redis ist sogar dort besser, wo sich ihre Funktionen überschneiden.
Verwenden Sie für alles Neue Redis.
Memcached vs. Redis:Direkter Vergleich
Beide Tools sind leistungsstarke, schnelle In-Memory-Datenspeicher, die als Cache nützlich sind. Beide können dazu beitragen, Ihre Anwendung zu beschleunigen, indem Datenbankergebnisse, HTML-Fragmente oder alles andere, dessen Generierung möglicherweise teuer ist, zwischengespeichert werden.
Zu beachtende Punkte
Wenn sie für dasselbe verwendet werden, vergleichen sie sich anhand der "zu berücksichtigenden Punkte" der ursprünglichen Frage wie folgt:
- Lese-/Schreibgeschwindigkeit :Beide sind extrem schnell. Benchmarks variieren je nach Workload, Versionen und vielen anderen Faktoren, zeigen aber im Allgemeinen, dass Redis so schnell oder fast so schnell wie Memcache ist. Ich empfehle Redis, aber nicht, weil Memcached langsam ist. Ist es nicht.
- Speichernutzung :Redis ist besser.
- memcached:Sie geben die Cache-Größe an und wenn Sie Elemente einfügen, wächst der Daemon schnell auf etwas mehr als diese Größe an. Es gibt nie wirklich eine Möglichkeit, diesen Speicherplatz zurückzugewinnen, außer Memcache neu zu starten. Alle Ihre Schlüssel könnten abgelaufen sein, Sie könnten die Datenbank leeren und sie würde immer noch den vollen RAM-Block verwenden, mit dem Sie sie konfiguriert haben.
- redis:Das Festlegen einer maximalen Größe liegt bei Ihnen. Redis verwendet nie mehr als nötig und gibt Ihnen Speicher zurück, den es nicht mehr verwendet.
- Ich habe 100.000 ~2KB-Strings (~200MB) zufälliger Sätze in beiden gespeichert. Die Memcache-RAM-Nutzung stieg auf ~225 MB. Die Redis-RAM-Nutzung stieg auf ~228 MB. Nachdem beide gespült wurden, fiel Redis auf ~ 29 MB und Memcached blieb bei ~ 225 MB. Sie sind ähnlich effizient beim Speichern von Daten, aber nur einer ist in der Lage, sie zurückzugewinnen.
- Festplatten-E/A-Dumping :Ein klarer Gewinn für Redis, da es dies standardmäßig tut und eine sehr konfigurierbare Persistenz hat. Memcached hat keine Mechanismen zum Dumpen auf die Festplatte ohne Tools von Drittanbietern.
- Skalierung :Beide geben Ihnen jede Menge Headroom, bevor Sie mehr als eine einzelne Instanz als Cache benötigen. Redis enthält Tools, mit denen Sie darüber hinausgehen können, während Memcached dies nicht tut.
im Speicher gespeichert
Memcached ist ein einfacher flüchtiger Cache-Server. Es ermöglicht Ihnen, Schlüssel/Wert-Paare zu speichern, bei denen der Wert auf eine Zeichenfolge von bis zu 1 MB beschränkt ist.
Es ist gut darin, aber das ist alles, was es tut. Sie können auf diese Werte über ihren Schlüssel mit extrem hoher Geschwindigkeit zugreifen, was oft die verfügbare Netzwerk- oder sogar Speicherbandbreite sättigt.
Wenn Sie memcached neu starten, sind Ihre Daten weg. Für einen Cache ist das in Ordnung. Sie sollten dort nichts Wichtiges aufbewahren.
Wenn Sie hohe Leistung oder hohe Verfügbarkeit benötigen, stehen Tools, Produkte und Dienste von Drittanbietern zur Verfügung.
redis
Redis kann die gleichen Aufgaben erledigen wie Memcached, und kann sie besser erledigen.
Redis kann auch als Cache fungieren. Es kann auch Schlüssel/Wert-Paare speichern. In Redis können es sogar bis zu 512 MB sein.
Sie können die Persistenz deaktivieren und Ihre Daten werden auch beim Neustart glücklicherweise verloren gehen. Wenn Sie möchten, dass Ihr Cache Neustarts überlebt, können Sie dies auch tun. Tatsächlich ist das die Standardeinstellung.
Es ist auch superschnell, oft begrenzt durch die Netzwerk- oder Speicherbandbreite.
Wenn eine Instanz von redis/memcached nicht genug Leistung für Ihre Arbeitslast bietet, ist redis die klare Wahl. Redis beinhaltet Cluster-Unterstützung und kommt mit Hochverfügbarkeits-Tools (redis-sentinel) direkt "in der Box". In den letzten Jahren hat sich redis auch als klarer Marktführer im Bereich 3rd Party Tooling herauskristallisiert. Unternehmen wie Redis Labs, Amazon und andere bieten viele nützliche Redis-Tools und -Dienste an. Das Ökosystem rund um Redis ist viel größer. Die Anzahl der groß angelegten Bereitstellungen ist jetzt wahrscheinlich größer als bei Memcached.
Das Redis-Superset
Redis ist mehr als ein Cache. Es ist ein In-Memory-Datenstrukturserver. Nachfolgend finden Sie einen schnellen Überblick über die Möglichkeiten von Redis, die über einen einfachen Schlüssel/Wert-Cache wie Memcached hinausgehen. Die meisten der Funktionen von redis sind Dinge, die memcached nicht kann.
Dokumentation
Redis ist besser dokumentiert als memcached. Obwohl dies subjektiv sein kann, scheint es die ganze Zeit mehr und mehr wahr zu sein.
redis.io ist eine fantastische, einfach zu navigierende Ressource. Sie können Redis im Browser ausprobieren und erhalten sogar interaktive Live-Beispiele für jeden Befehl in der Dokumentation.
Es gibt jetzt doppelt so viele Stackoverflow-Ergebnisse für Redis wie Memcached. 2x so viele Google-Ergebnisse. Leichter zugängliche Beispiele in mehr Sprachen. Aktivere Entwicklung. Aktivere Kundenentwicklung. Diese Messungen bedeuten einzeln vielleicht nicht viel, aber in Kombination zeichnen sie ein klares Bild, dass die Unterstützung und Dokumentation für Redis größer und viel aktueller ist.
Beharrlichkeit
Standardmäßig speichert redis Ihre Daten mithilfe eines Mechanismus namens Snapshotting auf der Festplatte. Wenn Sie genügend RAM zur Verfügung haben, können Sie alle Ihre Daten fast ohne Leistungseinbußen auf die Festplatte schreiben. Es ist fast kostenlos!
Im Snapshot-Modus besteht die Möglichkeit, dass ein plötzlicher Absturz zu einem kleinen Datenverlust führen kann. Wenn Sie unbedingt sicherstellen müssen, dass niemals Daten verloren gehen, machen Sie sich keine Sorgen, redis unterstützt Sie auch mit dem AOF-Modus (Append Only File). In diesem Persistenzmodus können Daten während des Schreibens auf die Festplatte synchronisiert werden. Dies kann den maximalen Schreibdurchsatz auf die Geschwindigkeit reduzieren, die Ihre Festplatte schreiben kann, sollte aber immer noch ziemlich schnell sein.
Es gibt viele Konfigurationsoptionen, um die Persistenz bei Bedarf zu optimieren, aber die Standardeinstellungen sind sehr vernünftig. Diese Optionen machen es einfach, Redis als sicheren, redundanten Ort zum Speichern von Daten einzurichten. Es ist ein echtes Datenbank.
Viele Datentypen
Memcached ist auf Strings beschränkt, aber Redis ist ein Datenstrukturserver, der viele verschiedene Datentypen bereitstellen kann. Es enthält auch die Befehle, die Sie benötigen, um das Beste aus diesen Datentypen zu machen.
Strings (Befehle)
Einfacher Text oder binäre Werte, die bis zu 512 MB groß sein können. Dies ist die einzige Redis- und Memcache-Freigabe des Datentyps, obwohl Memcache-Strings auf 1 MB begrenzt sind.
Redis bietet Ihnen mehr Tools zur Nutzung dieses Datentyps, indem es Befehle für bitweise Operationen, Manipulation auf Bitebene, Unterstützung für das Inkrementieren/Dekrementieren von Gleitkommazahlen, Bereichsabfragen und Operationen mit mehreren Tasten anbietet. Memcached unterstützt nichts davon.
Strings sind für alle möglichen Anwendungsfälle nützlich, weshalb memcached allein mit diesem Datentyp ziemlich nützlich ist.
Hashes (Befehle)
Hashes sind so etwas wie ein Schlüsselwertspeicher innerhalb eines Schlüsselwertspeichers. Sie bilden zwischen String-Feldern und String-Werten ab. Feld->Wert-Zuordnungen, die einen Hash verwenden, sind etwas platzsparender als Schlüssel-Wert-Zuordnungen, die reguläre Zeichenfolgen verwenden.
Hashes sind nützlich als Namespace oder wenn Sie viele Schlüssel logisch gruppieren möchten. Mit einem Hash können Sie alle Mitglieder effizient erfassen, alle Mitglieder zusammen ablaufen lassen, alle Mitglieder zusammen löschen usw. Großartig für jeden Anwendungsfall, bei dem Sie mehrere Schlüssel/Wert-Paare haben, die gruppiert werden müssen.
Eine beispielhafte Verwendung eines Hashs ist das Speichern von Benutzerprofilen zwischen Anwendungen. Ein mit der Benutzer-ID als Schlüssel gespeicherter Redis-Hash ermöglicht es Ihnen, so viele Datenbits über einen Benutzer wie nötig zu speichern, während sie unter einem einzigen Schlüssel gespeichert bleiben. Der Vorteil der Verwendung eines Hashs anstelle der Serialisierung des Profils in eine Zeichenfolge besteht darin, dass verschiedene Anwendungen verschiedene Felder im Benutzerprofil lesen/schreiben können, ohne sich Gedanken darüber machen zu müssen, dass eine App Änderungen überschreibt, die von anderen vorgenommen wurden (was passieren kann, wenn Sie veraltete Daten).
Listen (Befehle)
Redis-Listen sind geordnete Sammlungen von Zeichenfolgen. Sie sind für das Einfügen, Lesen oder Entfernen von Werten oben oder unten (auch bekannt als:links oder rechts) der Liste optimiert.
Redis bietet viele Befehle zum Nutzen von Listen, einschließlich Befehlen zum Pushen/Popen von Elementen, Pushen/Pop zwischen Listen, Abschneiden von Listen, Durchführen von Bereichsabfragen usw.
Listen sind großartige dauerhafte, atomare Warteschlangen. Diese eignen sich hervorragend für Jobwarteschlangen, Protokolle, Puffer und viele andere Anwendungsfälle.
Sätze (Befehle)
Mengen sind ungeordnete Sammlungen eindeutiger Werte. Sie sind so optimiert, dass Sie schnell überprüfen können, ob ein Wert in der Menge enthalten ist, schnell Werte hinzufügen/entfernen und Überschneidungen mit anderen Mengen messen können.
Diese eignen sich hervorragend für Dinge wie Zugriffskontrolllisten, eindeutige Besucher-Tracker und viele andere Dinge. Die meisten Programmiersprachen haben etwas Ähnliches (normalerweise als Set bezeichnet). Das ist so, nur verteilt.
Redis bietet mehrere Befehle zum Verwalten von Sets. Offensichtliche wie das Hinzufügen, Entfernen und Überprüfen des Satzes sind vorhanden. Dasselbe gilt für weniger offensichtliche Befehle wie das Platzieren/Lesen eines zufälligen Elements und Befehle zum Ausführen von Vereinigungen und Schnittmengen mit anderen Mengen.
Sortierte Sätze (Befehle)
Sortierte Sätze sind auch Sammlungen von eindeutigen Werten. Diese sind, wie der Name schon sagt, geordnet. Sie sind nach Partitur und dann lexikografisch geordnet.
Dieser Datentyp ist für schnelle Suchen nach Punktzahl optimiert. Den höchsten, niedrigsten oder einen beliebigen Wertebereich dazwischen zu erhalten ist extrem schnell.
Wenn Sie Benutzer zusammen mit ihrem Highscore zu einem sortierten Satz hinzufügen, haben Sie selbst eine perfekte Rangliste. Wenn neue Highscores eingehen, fügen Sie sie einfach wieder mit ihrem Highscore zum Set hinzu und Ihre Rangliste wird neu geordnet. Auch ideal, um nachzuverfolgen, wann Benutzer das letzte Mal besucht haben und wer in Ihrer Anwendung aktiv ist.
Das Speichern von Werten mit derselben Punktzahl bewirkt, dass sie lexikografisch geordnet werden (denken Sie alphabetisch). Dies kann für Dinge wie Autovervollständigungsfunktionen nützlich sein.
Viele der sortierten Satzbefehle ähneln Befehlen für Sätze, manchmal mit einem zusätzlichen Punkteparameter. Ebenfalls enthalten sind Befehle zum Verwalten von Scores und zum Abfragen nach Score.
Geo
Redis verfügt über mehrere Befehle zum Speichern, Abrufen und Messen von geografischen Daten. Dazu gehören Radiusabfragen und das Messen von Entfernungen zwischen Punkten.
Technisch gesehen werden geografische Daten in Redis in sortierten Sätzen gespeichert, sodass dies kein wirklich separater Datentyp ist. Es ist eher eine Erweiterung für sortierte Sets.
Bitmap und HyperLogLog
Wie Geo sind dies keine vollständig separaten Datentypen. Dies sind Befehle, die es Ihnen ermöglichen, String-Daten so zu behandeln, als ob es sich um eine Bitmap oder ein Hyperloglog handeln würde.
Bitmaps sind die Operatoren auf Bitebene, auf die ich unter Strings
verwiesen habe sind für. Dieser Datentyp war der Grundbaustein für das jüngste kollaborative Kunstprojekt von reddit:r/Place.
HyperLogLog ermöglicht es Ihnen, eine konstante, extrem kleine Menge an Speicherplatz zu verwenden, um nahezu unbegrenzte einzigartige Werte mit schockierender Genauigkeit zu zählen. Mit nur ca. 16 KB könnten Sie die Anzahl der einzelnen Besucher Ihrer Website effizient zählen, selbst wenn diese Zahl in die Millionen geht.
Transaktionen und Atomizität
Befehle in redis sind atomar, d. h. Sie können sicher sein, dass sobald Sie einen Wert in redis schreiben, dieser Wert für alle mit redis verbundenen Clients sichtbar ist. Es gibt keine Wartezeit, bis dieser Wert weitergegeben wird. Technisch gesehen ist Memcached ebenfalls atomar, aber da Redis all diese Funktionen über Memcached hinaus hinzufügt, ist es erwähnenswert und etwas beeindruckend, dass all diese zusätzlichen Datentypen und Funktionen ebenfalls atomar sind.
Redis ist zwar nicht ganz dasselbe wie Transaktionen in relationalen Datenbanken, aber es gibt auch Transaktionen, die „optimistisches Sperren“ verwenden (WATCH/MULTI/EXEC).
Rohrleitung
Redis bietet eine Funktion namens „Pipelining“. Wenn Sie viele Redis-Befehle ausführen möchten, können Sie sie per Pipelining auf einmal statt einzeln an Redis senden.
Wenn Sie einen Befehl entweder an redis oder memcached ausführen, ist normalerweise jeder Befehl ein separater Anforderungs-/Antwortzyklus. Mit Pipelining kann Redis mehrere Befehle puffern und sie alle gleichzeitig ausführen, wobei alle Antworten auf alle Ihre Befehle in einer einzigen Antwort beantwortet werden.
Dadurch können Sie beim Massenimport oder bei anderen Aktionen, die viele Befehle erfordern, einen noch höheren Durchsatz erzielen.
Pub/Sub
Redis verfügt über Befehle, die der Pub/Sub-Funktionalität gewidmet sind, sodass Redis als Hochgeschwindigkeits-Nachrichtensender fungieren kann. Dadurch kann ein einzelner Client Nachrichten an viele andere Clients veröffentlichen, die mit einem Channel verbunden sind.
Redis unterstützt Pub/Sub sowie fast jedes Tool. Dedizierte Nachrichtenbroker wie RabbitMQ können in bestimmten Bereichen Vorteile haben, aber aufgrund der Tatsache, dass derselbe Server Ihnen auch dauerhafte, dauerhafte Warteschlangen und andere Datenstrukturen bieten kann, die Ihre Pub/Sub-Workloads wahrscheinlich benötigen, wird sich Redis oft als das beste und einfachste Tool erweisen für den Job.
Lua-Skripting
Sie können sich Lua-Skripte wie das eigene SQL von Redis oder gespeicherte Prozeduren vorstellen. Es ist sowohl mehr als auch weniger, aber die Analogie funktioniert meistens.
Vielleicht haben Sie komplexe Berechnungen, die redis durchführen soll. Vielleicht können Sie es sich nicht leisten, Ihre Transaktionen rückgängig zu machen, und brauchen Garantien, dass jeder Schritt eines komplexen Prozesses atomar abläuft. Diese Probleme und viele mehr können mit Lua-Scripting gelöst werden.
Das gesamte Skript wird atomar ausgeführt, wenn Sie also Ihre Logik in ein Lua-Skript einbauen können, können Sie oft vermeiden, sich mit optimistischen Sperrtransaktionen herumzuärgern.
Skalierung
Wie oben erwähnt, enthält redis integrierte Unterstützung für Clustering und wird mit einem eigenen Hochverfügbarkeitstool namens redis-sentinel
gebündelt .
Schlussfolgerung
Ohne zu zögern würde ich Redis über Memcached für alle neuen Projekte oder bestehende Projekte empfehlen, die Memcached noch nicht verwenden.
Das Obige mag so klingen, als ob ich Memcached nicht mag. Im Gegenteil:Es ist ein mächtiges, einfaches, stabiles, ausgereiftes und gehärtetes Werkzeug. Es gibt sogar einige Anwendungsfälle, in denen es etwas schneller ist als redis. Ich liebe Memcaches. Ich denke nur nicht, dass es viel Sinn für die zukünftige Entwicklung macht.
Redis macht alles, was Memcache tut, oft besser. Jeder Leistungsvorteil für memcached ist geringfügig und arbeitslastspezifisch. Es gibt auch Workloads, für die Redis schneller sein wird, und viele weitere Workloads, die Redis ausführen kann, die Memcached einfach nicht kann. Die winzigen Leistungsunterschiede scheinen angesichts der riesigen Kluft in der Funktionalität und der Tatsache, dass beide Tools so schnell und effizient sind, dass sie möglicherweise das letzte Stück Ihrer Infrastruktur sind, über das Sie sich jemals Gedanken über die Skalierung machen müssen, gering.
Es gibt nur ein Szenario, in dem Memcached sinnvoller ist:Dort, wo Memcached bereits als Cache verwendet wird. Wenn Sie bereits mit Memcached zwischenspeichern, verwenden Sie es weiterhin, wenn es Ihren Anforderungen entspricht. Es lohnt sich wahrscheinlich nicht, zu Redis zu wechseln, und wenn Sie Redis nur zum Caching verwenden, bietet es möglicherweise nicht genug Vorteile, um Ihre Zeit wert zu sein. Wenn Memcached Ihre Anforderungen nicht erfüllt, sollten Sie wahrscheinlich zu Redis wechseln. Dies gilt unabhängig davon, ob Sie über Memcache hinaus skalieren oder zusätzliche Funktionen benötigen.