Memcached vs. Redis?


1466

Wir verwenden eine Ruby-Web-App mit Redis- Server zum Zwischenspeichern. Gibt es einen Punkt, um stattdessen Memcached zu testen ?

Was gibt uns eine bessere Leistung? Irgendwelche Vor- oder Nachteile zwischen Redis und Memcached?

Punkte, die man beachten sollte:

  • Lese- / Schreibgeschwindigkeit.
  • Speichernutzung.
  • Festplatten-E / A-Dumping.
  • Skalierung.

38
Eine weitere Analyse zusätzlich zu den folgenden Kommentaren: Google Trends: redis vs. memcached
MarkHu

3
Ein Kommentar, der keine Antwort rechtfertigt: Wenn Sie sich Cloud-basierte Dienste für diese beiden Systeme ansehen (z. B. Heroku-Addons), sind Memcached-Dienste pro MB aus irgendeinem Grund manchmal etwas billiger.
Ben Roberts

2

Antworten:


2105

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 der Aufgaben von Redis ausführen. Redis ist besser, selbst wenn 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. Beides kann dazu beitragen, Ihre Anwendung zu beschleunigen, indem Datenbankergebnisse, HTML-Fragmente oder alles andere zwischengespeichert werden, dessen Generierung möglicherweise teuer ist.

Punkte, die man beachten sollte

Wenn sie für dasselbe verwendet werden, vergleichen sie die folgenden Punkte unter Verwendung der "zu berücksichtigenden Punkte" der ursprünglichen Frage:

  • Lese- / Schreibgeschwindigkeit : Beide sind extrem schnell. Benchmarks variieren je nach Arbeitslast, Versionen und vielen anderen Faktoren, zeigen jedoch im Allgemeinen, dass Redis genauso schnell oder fast so schnell sind wie zwischengespeicherte. Ich empfehle Redis, aber nicht, weil Memcached langsam ist. Es ist nicht.
  • Speichernutzung : Redis ist besser.
    • memcached: Sie geben die Cache-Größe an und beim Einfügen von Elementen wächst der Dämon schnell auf etwas mehr als diese Größe. Es gibt nie wirklich eine Möglichkeit, diesen Speicherplatz zurückzugewinnen, ohne memcached 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-Teil verwenden, mit dem Sie sie konfiguriert haben.
    • redis: Das Festlegen einer maximalen Größe liegt bei Ihnen. Redis wird niemals mehr verwenden als nötig und gibt Ihnen Speicher zurück, den es nicht mehr verwendet.
    • Ich habe 100.000 ~ 2 KB Zeichenfolgen (~ 200 MB) zufälliger Sätze in beiden gespeichert. Die gespeicherte RAM-Auslastung stieg auf ~ 225 MB. Die RAM-Auslastung von Redis stieg auf ~ 228 MB. Nach dem Spülen beider fiel Redis auf ~ 29 MB und memcached blieb bei ~ 225 MB. Sie sind ähnlich effizient in der Speicherung von Daten, aber nur einer kann sie zurückfordern.
  • Disk I / O-Dumping : Ein klarer Gewinn für Redis, da dies standardmäßig erfolgt und eine sehr konfigurierbare Persistenz aufweist. Memcached verfügt über keine Mechanismen zum Speichern auf der Festplatte ohne Tools von Drittanbietern.
  • Skalierung : Beide bieten Ihnen viel Headroom, bevor Sie mehr als eine Instanz als Cache benötigen. Redis enthält Tools, mit denen Sie darüber hinausgehen können, während dies bei memcached nicht der Fall ist.

zwischengespeichert

Memcached ist ein einfacher flüchtiger Cache-Server. Sie können Schlüssel / Wert-Paare 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 über ihren Schlüssel mit extrem hoher Geschwindigkeit auf diese Werte zugreifen, wodurch häufig das verfügbare Netzwerk oder sogar die Speicherbandbreite überlastet wird.

Wenn Sie memcached neu starten, sind Ihre Daten nicht mehr vorhanden. Dies ist in Ordnung für einen Cache. Sie sollten dort nichts Wichtiges aufbewahren.

Wenn Sie eine hohe Leistung oder Verfügbarkeit benötigen, stehen Tools, Produkte und Services von Drittanbietern zur Verfügung.

redis

Redis kann die gleichen Aufgaben wie memcached ausführen und sie besser ausführen.

Redis kann auch als Cache fungieren . Es können auch Schlüssel / Wert-Paare gespeichert werden. In Redis können sie sogar bis zu 512 MB groß sein.

Sie können die Persistenz deaktivieren und Ihre Daten gehen auch beim Neustart verloren. Wenn Sie möchten, dass Ihr Cache Neustarts überlebt, können Sie dies auch tun. In der Tat ist das die Standardeinstellung.

Es ist auch superschnell, oft begrenzt durch Netzwerk- oder Speicherbandbreite.

Wenn eine Instanz von redis / memcached nicht genug Leistung für Ihre Workload bietet, ist redis die klare Wahl. Redis bietet Cluster-Unterstützung und wird mit Hochverfügbarkeitstools ( Redis-Sentinel ) direkt "in the Box" geliefert. In den letzten Jahren hat sich redis auch als klarer Marktführer für Werkzeuge von Drittanbietern herausgestellt. Unternehmen wie Redis Labs, Amazon und andere bieten viele nützliche Redis-Tools und -Dienste an. Das Ökosystem um Redis ist viel größer. Die Anzahl der Bereitstellungen in großem Maßstab ist jetzt wahrscheinlich größer als bei Memcached.

Das Redis Superset

Redis ist mehr als ein Cache. Es ist ein speicherinterner Datenstruktur-Server. Im Folgenden finden Sie einen schnellen Überblick über die Möglichkeiten von Redis, nicht nur ein einfacher Schlüssel- / Wert-Cache wie memcached zu sein. Die meisten Funktionen von redis sind Dinge, die memcached nicht kann.

Dokumentation

Redis ist besser dokumentiert als zwischengespeichert. Während dies subjektiv sein kann, scheint es immer wahrer zu sein.

redis.io ist eine fantastische, leicht zu navigierende Ressource. Sie können Redis im Browser ausprobieren und erhalten sogar interaktive Live-Beispiele für jeden Befehl in den Dokumenten.

Es gibt jetzt 2x so viele Stackoverflow-Ergebnisse für Redis wie zwischengespeichert. 2x so viele Google-Ergebnisse. Leicht zugängliche Beispiele in mehr Sprachen. Aktivere Entwicklung. Aktivere Kundenentwicklung. Diese Messungen bedeuten möglicherweise nicht viel für sich, aber in Kombination zeichnen sie ein klares Bild, dass die Unterstützung und Dokumentation für Redis größer und aktueller ist.

Beharrlichkeit

Standardmäßig speichert redis Ihre Daten mithilfe eines Mechanismus namens Snapshotting auf der Festplatte. Wenn Sie über genügend RAM verfügen, können Sie alle Ihre Daten nahezu ohne Leistungseinbußen auf die Festplatte schreiben. Es ist fast kostenlos!

Im Snapshot-Modus besteht die Möglichkeit, dass ein plötzlicher Absturz zu einer geringen Menge verlorener Daten führt. Wenn Sie unbedingt sicherstellen müssen, dass niemals Daten verloren gehen, machen Sie sich keine Sorgen, redis hat mit dem AOF-Modus (Append Only File) auch Ihren Rücken. In diesem Persistenzmodus können Daten beim Schreiben mit der Festplatte synchronisiert werden. Dies kann den maximalen Schreibdurchsatz auf die Geschwindigkeit reduzieren, mit der Ihre Festplatte schreiben kann, sollte aber dennoch recht schnell sein.

Es gibt viele Konfigurationsoptionen, um die Persistenz bei Bedarf zu optimieren, aber die Standardeinstellungen sind sehr sinnvoll. Mit diesen Optionen können Sie Redis einfach als sicheren, redundanten Speicherort für Daten einrichten. Es ist eine echte Datenbank.

Viele Datentypen

Memcached ist auf Zeichenfolgen beschränkt, Redis ist jedoch ein Datenstrukturserver, der viele verschiedene Datentypen bereitstellen kann. Es enthält auch die Befehle, die Sie benötigen, um diese Datentypen optimal zu nutzen.

Strings ( Befehle )

Einfacher Text oder Binärwerte mit einer Größe von bis zu 512 MB. Dies ist der einzige Datentyp, der redis und memcached share, obwohl memcached Strings auf 1 MB beschränkt sind.

Redis bietet Ihnen weitere Tools zur Nutzung dieses Datentyps, indem Befehle für bitweise Operationen, Manipulationen auf Bitebene, Unterstützung für Gleitkomma-Inkrementierung / -Dekrementierung, Bereichsabfragen und Mehrschlüsseloperationen angeboten werden. Memcached unterstützt nichts davon.

Zeichenfolgen sind für alle Arten von Anwendungsfällen nützlich, weshalb memcached allein für diesen Datentyp ziemlich nützlich ist.

Hashes ( Befehle )

Hashes ähneln einem Schlüsselwertspeicher innerhalb eines Schlüsselwertspeichers. Sie werden zwischen Zeichenfolgenfeldern und Zeichenfolgenwerten zugeordnet. Feld-> Wertekarten mit einem Hash sind etwas platzsparender als Schlüssel-> Wertekarten mit regulären Zeichenfolgen.

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. Ideal für jeden Anwendungsfall, in dem Sie mehrere Schlüssel / Wert-Paare haben, die gruppiert werden müssen.

Ein Beispiel für die Verwendung eines Hashs ist das Speichern von Benutzerprofilen zwischen Anwendungen. Mit einem Redis-Hash, der mit der Benutzer-ID als Schlüssel gespeichert ist, können Sie so viele Datenbits über einen Benutzer wie nötig speichern, während diese 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 unterschiedliche Felder im Benutzerprofil lesen / schreiben können, ohne sich Sorgen machen zu müssen, dass eine App die von anderen vorgenommenen Änderungen außer Kraft setzt (was passieren kann, wenn Sie veraltete Serialisierungen vornehmen Daten).

Listen ( Befehle )

Redis-Listen sind geordnete Sammlungen von Zeichenfolgen. Sie sind für das Einfügen, Lesen oder Entfernen von Werten am oberen oder unteren Rand (auch bekannt als: links oder rechts) der Liste optimiert.

Redis bietet viele Befehle zum Nutzen von Listen, einschließlich Befehle zum Verschieben / Popup von Elementen, Push / Pop zwischen Listen, Abschneiden von Listen, Ausführen von Bereichsabfragen usw.

Listen machen große dauerhafte, atomare Warteschlangen. Diese eignen sich hervorragend für Jobwarteschlangen, Protokolle, Puffer und viele andere Anwendungsfälle.

Sets ( Befehle )

Sets sind ungeordnete Sammlungen eindeutiger Werte. Sie sind so optimiert, dass Sie schnell überprüfen können, ob sich ein Wert im Satz befindet, schnell Werte hinzufügen / entfernen und Überlappungen mit anderen Sätzen messen können.

Diese eignen sich hervorragend für Dinge wie Zugriffssteuerungslisten, eindeutige Besucher-Tracker und viele andere Dinge. Die meisten Programmiersprachen haben etwas Ähnliches (normalerweise als Set bezeichnet). Das ist so, nur verteilt.

Redis bietet verschiedene Befehle zum Verwalten von Sets. Offensichtliche wie das Hinzufügen, Entfernen und Überprüfen des Sets sind vorhanden. So sind weniger offensichtliche Befehle wie das Poppen / Lesen eines zufälligen Elements und Befehle zum Ausführen von Vereinigungen und Schnittpunkten mit anderen Sätzen.

Sortierte Mengen ( Befehle )

Sortierte Sets sind auch Sammlungen eindeutiger Werte. Diese sind, wie der Name schon sagt, geordnet. Sie werden nach einer Partitur geordnet und dann lexikographisch.

Dieser Datentyp ist für eine schnelle Suche nach Punktzahl optimiert. Das Erhalten des höchsten, niedrigsten oder eines beliebigen Wertebereichs dazwischen ist extrem schnell.

Wenn Sie Benutzer zu einem sortierten Satz zusammen mit ihrem Highscore hinzufügen, haben Sie selbst eine perfekte Rangliste. Wenn neue Highscores eingehen, fügen Sie sie einfach erneut mit ihrem Highscore zum Set hinzu, und Ihre Rangliste wird neu geordnet. Ideal auch, um zu verfolgen, wann Benutzer das letzte Mal besucht wurden und wer in Ihrer Anwendung aktiv ist.

Das Speichern von Werten mit derselben Punktzahl führt dazu, dass sie lexikografisch geordnet werden (alphabetisch denken). Dies kann beispielsweise für Funktionen zur automatischen Vervollständigung hilfreich sein.

Viele der sortierten Set- Befehle ähneln Befehlen für Sets, manchmal mit einem zusätzlichen Score-Parameter. Ebenfalls enthalten sind Befehle zum Verwalten von Partituren und zum Abfragen nach Partituren.

Geo

Redis verfügt über mehrere Befehle zum Speichern, Abrufen und Messen von geografischen Daten. Dies umfasst Radiusabfragen und das Messen von Abständen 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 über sortierten Sets.

Bitmap und HyperLogLog

Wie bei Geo sind diese Datentypen nicht vollständig getrennt. Mit diesen Befehlen können Sie Zeichenfolgendaten so behandeln, als ob es sich entweder um eine Bitmap oder ein Hyperloglog handelt.

Für Bitmaps sind die Operatoren auf Bitebene gedacht, auf die ich verwiesen habe Strings. Dieser Datentyp war der Grundbaustein für das jüngste kollaborative Kunstprojekt von reddit: r / Place .

Mit HyperLogLog können Sie einen konstant extrem kleinen Speicherplatz verwenden, um nahezu unbegrenzte eindeutige Werte mit schockierender Genauigkeit zu zählen. Mit nur ~ 16 KB können Sie die Anzahl der eindeutigen Besucher Ihrer Website effizient zählen, selbst wenn diese Anzahl in Millionenhöhe liegt.

Transaktionen und Atomizität

Befehle in redis sind atomar, dh Sie können sicher sein, dass dieser Wert für alle mit redis verbundenen Clients sichtbar ist, sobald Sie einen Wert in redis schreiben. Es gibt keine Wartezeit, bis sich dieser Wert verbreitet. 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 auch atomar sind.

Redis ist zwar nicht ganz mit Transaktionen in relationalen Datenbanken identisch, verfügt jedoch auch über Transaktionen , die "optimistisches Sperren" verwenden ( WATCH / MULTI / EXEC ).

Pipelining

Redis bietet eine Funktion namens " Pipelining ". Wenn Sie viele Redis-Befehle haben, die Sie ausführen möchten, können Sie sie mithilfe von Pipelining an Redis senden, und zwar einzeln und nicht einzeln.

Normalerweise ist jeder Befehl ein separater Anforderungs- / Antwortzyklus, wenn Sie einen Befehl zum Redis oder Memcached ausführen. Mit Pipelining kann Redis mehrere Befehle puffern und alle gleichzeitig ausführen, wobei alle Antworten auf alle Ihre Befehle in einer einzigen Antwort beantwortet werden.

Auf diese Weise können Sie beim Massenimport oder bei anderen Aktionen mit vielen Befehlen einen noch höheren Durchsatz erzielen.

Pub / Sub

Redis verfügt über Befehle für die Pub / Sub-Funktionalität , mit denen Redis als Hochgeschwindigkeits-Nachrichtensender fungieren kann. Auf diese Weise kann ein einzelner Client Nachrichten an viele andere Clients veröffentlichen, die mit einem Kanal verbunden sind.

Redis macht Pub / Sub sowie fast jedes Werkzeug. Dedizierte Nachrichtenbroker wie RabbitMQ können in bestimmten Bereichen Vorteile haben. Da derselbe Server Ihnen jedoch auch dauerhafte Warteschlangen und andere Datenstrukturen bietet, die Ihre Pub- / Sub-Workloads wahrscheinlich benötigen, wird sich Redis häufig als das beste und einfachste Tool erweisen für die Arbeit.

Lua Scripting

Sie können sich Lua-Skripte wie Redis 'eigenes SQL oder gespeicherte Prozeduren vorstellen. Es ist mehr und weniger als das, aber die Analogie funktioniert meistens.

Möglicherweise haben Sie komplexe Berechnungen, die Redis ausführen sollen. Vielleicht können Sie es sich nicht leisten, Ihre Transaktionen zurückzusetzen, und benötigen Garantien, dass jeder Schritt eines komplexen Prozesses atomar abläuft. Diese und viele weitere Probleme können mit Lua-Skripten gelöst werden.

Das gesamte Skript wird atomar ausgeführt. Wenn Sie also Ihre Logik in ein Lua-Skript einpassen können, können Sie häufig vermeiden, sich mit optimistischen Sperrtransaktionen herumzuschlagen.

Skalieren

Wie oben erwähnt, enthält redis eine integrierte Unterstützung für Clustering und wird mit einem eigenen Hochverfügbarkeitstool namens gebündelt redis-sentinel.

Fazit

Ohne zu zögern würde ich redis over memcached für neue Projekte oder bestehende Projekte empfehlen, die memcached noch nicht verwenden.

Das obige klingt vielleicht so, als würde ich memcached nicht mögen. Im Gegenteil: Es ist ein leistungsstarkes, einfaches, stabiles, ausgereiftes und gehärtetes Werkzeug. Es gibt sogar einige Anwendungsfälle, in denen es etwas schneller als Redis ist. Ich liebe memcached. Ich denke einfach nicht, dass es für die zukünftige Entwicklung viel Sinn macht.

Redis macht alles, was memcached macht, oft besser. Jeder Leistungsvorteil für memcached ist gering und arbeitslastspezifisch. Es gibt auch Workloads, für die Redis schneller sind, und viele weitere Workloads, die Redis ausführen kann, die von Memcached einfach nicht ausgeführt werden können. Die winzigen Leistungsunterschiede scheinen angesichts der riesigen Lücke in der Funktionalität und der Tatsache, dass beide Tools so schnell und effizient sind, dass sie möglicherweise das letzte Teil Ihrer Infrastruktur sind, über das Sie sich jemals Gedanken machen müssen, gering zu sein.

Es gibt nur ein Szenario, in dem memcached sinnvoller ist: memcached wird bereits als Cache verwendet. Wenn Sie bereits mit memcached zwischenspeichern, verwenden Sie es weiter, wenn es Ihren Anforderungen entspricht. Es ist wahrscheinlich nicht die Mühe wert, auf Redis umzusteigen, und wenn Sie Redis nur zum Zwischenspeichern verwenden, bietet es möglicherweise nicht genügend Vorteile, um Ihre Zeit wert zu sein. Wenn memcached nicht Ihren Anforderungen entspricht, sollten Sie wahrscheinlich zu redis wechseln. Dies gilt unabhängig davon, ob Sie über memcached hinaus skalieren müssen oder zusätzliche Funktionen benötigen.


11
Wie bietet Memcached Clustering auf eine Weise an, die auf dem Server selbst vorhanden ist? Ich habe immer Bibliotheken verwendet, die mithilfe von Hashing-Algorithmen oder einem Modul an einen Pool von zwischengespeicherten Servern verteilt wurden. Gleiches gilt für Redis. Ich benutze meistens Python und es scheint einige Module zu geben, die sich nicht auf die zwischengespeicherte Bibliothek verlassen, um Verbindungspools zu verwalten.
Whardier

2
"Transaktionen mit optimistischer Sperrung (WATCH / MULTI / EXEC)" - Redis hat keine richtigen Transaktionen. Dh wenn [multi, cmd1, cmd2, cmd3 (Ausnahme), exec], dann werden cmd1 und cmd2 ausgeführt.
Oleg

10
@Oleg das stimmt eigentlich nicht. Wenn Sie Multi-Exec verwenden, werden die Befehle gepuffert (dh nicht ausgeführt), bis die Ausführung erfolgt. Wenn Sie also vor der Ausführung eine Ausnahme haben, werden tatsächlich keine Befehle ausgeführt. Wenn exec aufgerufen wird, werden alle gepufferten Befehle atomar ausgeführt, es sei denn, natürlich wurde eine Überwachungsvariable seit dem ersten Aufruf von multi geändert. Dieser letztere Mechanismus ist der optimistische Verriegelungsteil.
Carl Zulauf

3
@ Whardier Du bist richtig. Die Antwort wurde aktualisiert, um zu berücksichtigen, dass die Cluster- "Unterstützung" von memcached durch zusätzliche Tools aktiviert wird. Hätte das besser recherchieren sollen.
Carl Zulauf

3
Wie wäre es mit Clustering mit Couchbase-Server? (memcached kompatibel)
Ken Liu

142

Verwenden Sie Redis, wenn

  1. Sie müssen Elemente im Cache selektiv löschen / ablaufen lassen. (Du brauchst das)

  2. Sie benötigen die Fähigkeit, Schlüssel eines bestimmten Typs abzufragen. Gl. 'blog1: posts: *', 'blog2: kategorien: xyz: posts: *'. Oh ja! Dies ist sehr wichtig. Verwenden Sie diese Option, um bestimmte Arten von zwischengespeicherten Elementen selektiv ungültig zu machen. Sie können dies auch verwenden, um den Fragment-Cache, den Seiten-Cache, nur AR-Objekte eines bestimmten Typs usw. ungültig zu machen.

  3. Persistenz (Sie benötigen dies auch, es sei denn, Sie müssen Ihren Cache nach jedem Neustart aufwärmen. Sehr wichtig für Objekte, die sich selten ändern.)

Verwenden Sie memcached if

  1. Memcached gibt Ihnen Kopfschmerzen!
  2. umm ... Clustering? meh. Wenn Sie so weit gehen, verwenden Sie Varnish und Redis zum Zwischenspeichern von Fragmenten und AR-Objekten.

Aus meiner Erfahrung hatte ich mit Redis eine viel bessere Stabilität als Memcached


7
Laut Redis-Dokumentation erfordert die Verwendung von Mustern einen Tabellenscan. blog1: posts: * erfordert möglicherweise einen O (N) -Tabellenscan. Natürlich ist es bei Datensätzen mit angemessener Größe immer noch schnell, da Redis schnell ist. Es sollte für Tests oder Administratoren in Ordnung sein.
wehmütig

182
Headached ist ein Witz, oder? :-) Ich habe nach memcached headached gegoogelt , aber nichts Vernünftiges gefunden. (Ich bin neu in Memcached und Redis)
KajMagnus

11
stimmte nach unten aus dem gleichen Grunde als @pellucide. Redis ist vielleicht besser als Memcached, aber Memcached ist trivial zu verwenden. Ich hatte nie ein Problem damit und es ist trivial zu konfigurieren.
Diego Jancic

5
Danke @KajMagnus für meinen Tag machen .. vielleicht meine ganze Woche 😂
alex

@DiegoJancic Redis ist eine der am einfachsten zu verwendenden Technologien. Ohne vorherige Redis-Kenntnisse brauchte ich nur 20 Minuten, um es mit einem Paketmanager in der Cloud unter Ubuntu zu installieren und einfache Abfragen durchzuführen. 4 Stunden später konnte ich komplexere Szenarien mit Batch-Einfügungen mithilfe des Lua-Skripts und der Auswahl der richtigen (NIO) Java-Bibliothek zur Verbesserung der Leistung POC. Ich kann mir nichts Freundlicheres und Einfacheres als Redis vorstellen.
Moose on the Loose

105

Memcached ist multithreaded und schnell.

Redis hat viele Funktionen und ist sehr schnell, aber vollständig auf einen Kern beschränkt, da es auf einer Ereignisschleife basiert.

Wir benutzen beide. Memcached wird zum Zwischenspeichern von Objekten verwendet, wodurch in erster Linie die Leselast in den Datenbanken verringert wird. Redis wird beispielsweise für sortierte Mengen verwendet, die zum Aufrollen von Zeitreihendaten nützlich sind.


2
Websites mit hohem Datenverkehr, die stark in Memcached investiert sind und Datenbankengpässe bei "Benutzerprofil" -ähnlichen nicht relationalen Daten aufweisen, sollten Couchbase bewerten mit parallel zum üblichen Mongo, Redis

2
@siliconrockstar - ziemlich sicher, dass Redis 3 immer noch Single Core ist; Zumindest AWS Redis (das 3.2.6 oder 3.2.10 verwendet) warnt davor, dies zu berücksichtigen, wenn z. B. EngineCpuUtilization Metrics
dwanderson

1
Sieht so aus, als hätten Sie Recht. Ich glaube, als ich diesen Kommentar abgegeben habe, habe ich ihn auf unvollständige Quellen gestützt. Kommentar gelöscht.
Siliconrockstar

Sie können jedoch weiterhin $ core_count-Instanzen von Redis starten
Imaskar am

2
Redis konzentriert sich extrem auf Effizienz. Sie müssen sich also fragen, warum sich eine Reihe intelligenter Entwickler dafür entschieden haben, das Programm mit einem einzigen Thread zu versehen. Aus den Redis-Dokumenten "Es kommt nicht sehr häufig vor, dass die CPU zu Ihrem Engpass bei Redis wird, da Redis normalerweise entweder speicher- oder netzwerkgebunden ist." Wenn Sie einen grunty Server verwenden, der an die CPU gebunden ist, haben Sie wahrscheinlich viele Benutzer und sollten ohnehin mehrere redundante Server haben. Wenn Sie mehrere CPUs auf einem einzelnen Server maximal nutzen möchten, verwenden Sie die Partitionierung. Lesen Sie: redis.io/topics/…
Robocat

91

Dies ist zu lang, um als Kommentar zu einer bereits akzeptierten Antwort veröffentlicht zu werden. Daher habe ich es als separate Antwort angegeben

Eine zu berücksichtigende Sache ist auch, ob Sie eine harte obere Speichergrenze für Ihre Cache-Instanz erwarten.

Da redis eine nosql-Datenbank mit unzähligen Funktionen ist und Caching nur eine Option ist, für die es verwendet werden kann, weist es Speicher nach Bedarf zu - je mehr Objekte Sie darin ablegen, desto mehr Speicher wird verwendet. Die maxmemoryOption erzwingt die Verwendung der oberen Speichergrenze nicht strikt. Während Sie mit dem Cache arbeiten, werden Schlüssel entfernt und sind abgelaufen. Möglicherweise sind Ihre Schlüssel nicht alle gleich groß, sodass eine interne Speicherfragmentierung auftritt.

Standardmäßig verwendet redis den jemalloc- Speicherzuweiser, der sein Bestes versucht, sowohl speicherkompakt als auch schnell zu sein. Es handelt sich jedoch um einen Allzweck-Speicherzuweiser, der nicht mit vielen Zuordnungen und Objektbereinigungen Schritt halten kann, die mit hoher Geschwindigkeit auftreten. Aus diesem Grund kann bei einigen Lademustern der Redis-Prozess aufgrund der internen Fragmentierung anscheinend Speicher verlieren. Wenn Sie beispielsweise einen Server mit 7 GB RAM haben und Redis als nicht persistenten LRU-Cache verwenden möchten, wird der Redis-Prozess mit der maxmemoryEinstellung auf 5 GB im Laufe der Zeit möglicherweise immer mehr Speicher verbrauchen und schließlich das gesamte RAM-Limit bis erreichen Out-of-Memory-Killer stört.

memcached passt besser zu dem oben beschriebenen Szenario, da es seinen Speicher auf eine völlig andere Weise verwaltet. memcached weist einen großen Teil des Speichers zu - alles, was es jemals benötigen wird - und verwaltet diesen Speicher dann selbst, indem es seinen eigenen implementierten Speicher verwendet Plattenzuweiser verwendet . Darüber hinaus bemüht sich memcached, die interne Fragmentierung gering zu halten, da tatsächlich ein LRU-Algorithmus pro Platte verwendet wird , wenn LRU-Räumungen unter Berücksichtigung der Objektgröße durchgeführt werden.

Trotzdem hat memcached in Umgebungen, in denen die Speichernutzung erzwungen und / oder vorhersehbar sein muss, immer noch eine starke Position. Wir haben versucht, die neuesten stabilen Redis (2.8.19) als nicht persistenten LRU-basierten Memcached-Ersatz mit einer Arbeitslast von 10-15.000 Operationen / s zu verwenden, und es ist viel Speicher verloren gegangen. Dieselbe Arbeitslast stürzte die ElastiCache-Redis-Instanzen von Amazon an einem Tag oder so aus den gleichen Gründen ab.


2
Von redis.io/topics/faq : Redis verfügt über integrierte Schutzfunktionen, mit denen der Benutzer eine maximale Speicherbelegung festlegen kann. Verwenden Sie dazu die Option maxmemory in der Konfigurationsdatei, um die von Redis verwendete Speicherbegrenzung festzulegen. Wenn dieses Limit erreicht ist, antwortet Redis mit einem Fehler beim Schreiben von Befehlen (akzeptiert jedoch weiterhin schreibgeschützte Befehle), oder Sie können es so konfigurieren, dass Schlüssel entfernt werden, wenn das maximale Speicherlimit erreicht ist, wenn Sie Redis verwenden zum Zwischenspeichern. Wir haben Dokumentation, wenn Sie Redis als LRU-Cache verwenden möchten. Link
StefanNch

8
Die maxmemoryOption @StefanNch redis berücksichtigt keine interne Speicherfragmentierung. Weitere Informationen finden Sie in meinem Kommentar oben. Die dort beschriebenen Probleme wurden unter dem auf der Seite "Redis als LRU-Cache" beschriebenen Szenario mit aktivierten Speicherbeschränkungsoptionen festgestellt. memcached verwendet auf der anderen Seite einen anderen Ansatz, um Speicherfragmentierungsprobleme zu vermeiden, sodass die Speicherbeschränkung viel "härter" ist.
Artyom

46

Memcached ist gut als einfacher Schlüssel- / Wertspeicher und als Schlüssel => STRING. Dies macht es wirklich gut für die Sitzungsspeicherung.

Redis kann gut key => SOME_OBJECT ausführen.

Es hängt wirklich davon ab, was Sie dort einsetzen werden. Mein Verständnis ist, dass sie in Bezug auf die Leistung ziemlich gleichmäßig sind.

Viel Glück beim Finden objektiver Benchmarks, wenn Sie welche finden, schicken Sie sie mir bitte.


2
IMO ist der Redis Hash-Datentyp für das Speichern von Sitzungsvariablen viel sinnvoller als das Serialisieren in eine zwischengespeicherte Zeichenfolge.
Carl Zulauf

6
Wenn Sie sich für die Benutzererfahrung interessieren, legen Sie Ihre Sitzungen nicht im Cache ab. dormando.livejournal.com/495593.html
sleblanc

4
@sebleblanc Dies sollte jedoch theoretisch kein Problem mit Redis sein, da es auch eine Festplattenpersistenz gibt.
Haknick

2
@sebleblanc memcache ist immer noch gut im Sitzungsspeicher, wenn Sie ihn schlecht implementieren oder nicht. Ja, Räumung ist ein Problem, aber ohnehin nicht unüberwindbar. Es ist auch kein Problem von Memcache, wenn Sie sich keine Sorgen um Räumung machen. Die meisten Memcache-Sitzungslösungen verwenden Cookies als Backup, glaube ich.
Erik Petersen

11
"Legen Sie Ihre Sitzungen nicht in den Cache" ist irreführend. Was Sie meinen ist "Speichern Sie Ihre Sitzungen nicht nur im Cache". Jeder, der wichtige Daten nur im Memcache speichert, sollte sofort entlassen werden.
Jacob

37

Wenn Ihnen ein krasser Schreibstil nichts ausmacht, dann Redis vs Memcached im Systoilet-Blog unter dem Gesichtspunkt der Benutzerfreundlichkeit eine Lektüre wert. Lesen unbedingt das Hin und Her in den Kommentaren, bevor Sie Schlussfolgerungen zur Leistung ziehen. Es gibt einige methodische Probleme (Single-Threaded-Busy-Loop-Tests), und Redis hat einige Verbesserungen vorgenommen, seit der Artikel ebenfalls geschrieben wurde.

Und kein Benchmark-Link ist vollständig, ohne die Dinge ein wenig zu verwirren. Schauen Sie sich auch einige widersprüchliche Benchmarks im LiveJournal von Dormondo und im Antirez-Weblog an .

Bearbeiten - wie Antirez betont, ist die Systoilet-Analyse eher schlecht durchdacht. Selbst über den Single-Threading-Mangel hinaus kann ein Großteil der Leistungsunterschiede in diesen Benchmarks eher auf die Client-Bibliotheken als auf den Server-Durchsatz zurückgeführt werden. Die Benchmarks im Antirez-Weblog bieten in der Tat einen viel stärkeren Vergleich von Äpfeln zu Äpfeln (mit demselben Mund).



28
Sie machten keine Witze über krass.
ocodo

1
Mehr über seinen 2010 veralteten Blog
Siddharth

24

Ich hatte die Möglichkeit, sowohl memcached als auch redis zusammen in dem Caching-Proxy zu verwenden, an dem ich gearbeitet habe. Lassen Sie mich Ihnen mitteilen, wo genau ich was und den Grund dafür verwendet habe.

Redis>

1) Wird zum Indizieren des Cache-Inhalts über den Cluster verwendet. Ich habe mehr als eine Milliarde Schlüssel in Redis-Clustern verteilt, Redis-Antwortzeiten sind ziemlich kürzer und stabil.

2) Grundsätzlich handelt es sich um einen Schlüssel- / Wertspeicher. Wo immer Sie in Ihrer Anwendung etwas Ähnliches haben, können Sie Redis verwenden, um viel zu stören.

3) Redis Persistenz, Failover und Backup (AOF) erleichtern Ihre Arbeit.

Memcache>

1) Ja, ein optimierter Speicher, der als Cache verwendet werden kann. Ich habe es zum Speichern von Cache-Inhalten verwendet, auf die sehr häufig (mit 50 Treffern / Sekunde) mit einer Größe von weniger als 1 MB zugegriffen wird.

2) Ich habe nur 2 GB von 16 GB für das Memcaching zugewiesen, wenn meine einzelne Inhaltsgröße> 1 MB war.

3) Da der Inhalt in der Nähe der Grenzen wächst, habe ich gelegentlich höhere Antwortzeiten in den Statistiken beobachtet (nicht der Fall bei Redis).

Wenn Sie nach allgemeiner Erfahrung fragen, ist Redis viel umweltfreundlicher, da es einfach zu konfigurieren ist, sehr flexibel mit stabilen, robusten Funktionen.

Darüber hinaus steht unter diesem Link ein Benchmarking-Ergebnis zur Verfügung. Nachfolgend finden Sie einige Highlights derselben.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Hoffe das hilft!!


14

Prüfung. Führen Sie einige einfache Benchmarks aus. Lange Zeit betrachtete ich mich als ein Nashorn der alten Schule, da ich meistens memcached verwendete und Redis als das neue Kind betrachtete.

Bei meiner jetzigen Firma wurde Redis als Hauptcache verwendet. Als ich mich mit einigen Leistungsstatistiken befasste und einfach mit dem Testen begann, war Redis in Bezug auf die Leistung vergleichbar oder minimal langsamer als MySQL.

Memcached, obwohl simpel, blies Redis total aus dem Wasser . Es skalierte viel besser:

  • für größere Werte (erforderliche Änderung der Plattengröße, aber funktioniert)
  • für mehrere gleichzeitige Anfragen

Außerdem ist die Richtlinie zur Entfernung von Memcaches meiner Ansicht nach viel besser implementiert, was zu einer insgesamt stabileren durchschnittlichen Antwortzeit führt, während mehr Daten verarbeitet werden, als der Cache verarbeiten kann.

Einige Benchmarking-Ergebnisse haben ergeben, dass Redis in unserem Fall eine sehr schlechte Leistung erbringt. Dies hat meiner Meinung nach mit vielen Variablen zu tun:

  • Art der Hardware, auf der Sie Redis ausführen
  • Arten von Daten, die Sie speichern
  • Menge bekommt und setzt
  • wie gleichzeitig Ihre App ist
  • Benötigen Sie Datenstrukturspeicher?

Persönlich teile ich nicht die Ansicht, die Redis-Autoren zu Parallelität und Multithreading haben.


Bitte erklären Sie "minimal langsamer als MySQL."
Anirudha Gupta

Ich muss sagen, dass ich diese Benchmark-Daten nicht zur Hand habe, aber dieser spezielle Fall war eine Menge Lese- / Schreiboperationen
mdomans

13

Ein weiterer Bonus ist, dass es sehr klar sein kann, wie sich Memcache in einem Caching-Szenario verhalten wird, während Redis im Allgemeinen als persistenter Datenspeicher verwendet wird, obwohl es so konfiguriert werden kann, dass es sich wie Memcached verhält, auch bekannt als das Entfernen der zuletzt verwendeten Elemente, wenn es das Maximum erreicht Kapazität.

Einige Apps, an denen ich gearbeitet habe, verwenden beide, um zu verdeutlichen, wie sich die Daten verhalten sollen - Dinge in Memcache, wir schreiben Code, um die Fälle zu behandeln, in denen sie nicht vorhanden sind - Dinge in Redis, wir verlassen uns darauf, dass sie vorhanden sind .

Davon abgesehen wird Redis im Allgemeinen als überlegen angesehen, da die meisten Anwendungsfälle funktionsreicher und damit flexibler sind.


10

Es wäre nicht falsch, wenn wir sagen, dass Redis eine Kombination aus (Cache + Datenstruktur) ist, während Memcached nur ein Cache ist.


1
Dies ist eine gute Antwort - Laravel verwendet Redis als Cache und als Datenspeichermechanismus
Miroslav Trninic

8

Ein sehr einfacher Test zum Festlegen und Abrufen von 100.000 eindeutigen Schlüsseln und Werten gegen redis-2.2.2 und memcached. Beide werden unter Linux VM (CentOS) ausgeführt, und mein Clientcode (unten eingefügt) wird unter Windows Desktop ausgeführt.

Redis

  • Die zum Speichern von 100000 Werten benötigte Zeit beträgt = 18954 ms

  • Die zum Laden von 100000 Werten benötigte Zeit beträgt = 18328 ms

Memcached

  • Die zum Speichern von 100000 Werten benötigte Zeit beträgt = 797 ms

  • Die zum Abrufen von 100000 Werten benötigte Zeit beträgt = 38984 ms


Jedis jed = new Jedis("localhost", 6379);
int count = 100000;
long startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  jed.set("u112-"+i, "v51"+i);
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken to store "+ count + " values is ="+(endTime-startTime)+"ms");

startTime = System.currentTimeMillis();
for (int i=0; i<count; i++) {
  client.get("u112-"+i);
}
endTime = System.currentTimeMillis();
System.out.println("Time taken to retrieve "+ count + " values is ="+(endTime-startTime)+"ms");

6
Da Sie offensichtlich Java für die Messung verwendet haben ... haben Sie Ihre Testfälle "aufgewärmt"? Dies ist wichtig, um eine so kurze Zeit zu messen ... dass die JIT die Hot Spots zusammengestellt hat.
Cljk

7

Ein wesentlicher Unterschied, auf den hier nicht hingewiesen wurde, besteht darin, dass Memcache jederzeit eine obere Speichergrenze hat, während Redis dies nicht standardmäßig tut (sondern konfiguriert werden kann). Wenn Sie einen Schlüssel / Wert immer für eine bestimmte Zeitspanne speichern möchten (und ihn aufgrund des geringen Speichers niemals entfernen möchten), sollten Sie Redis verwenden. Natürlich riskieren Sie auch das Problem, dass Ihnen der Speicher ausgeht ...


6

Der größte verbleibende Grund ist die Spezialisierung.

Redis kann viele verschiedene Dinge tun, und ein Nebeneffekt davon ist, dass Entwickler möglicherweise viele dieser verschiedenen Funktionssätze auf derselben Instanz verwenden. Wenn Sie die LRU-Funktion von Redis für einen Cache neben einem harten Datenspeicher verwenden, der NICHT LRU ist, kann es durchaus vorkommen, dass Ihnen der Speicher ausgeht.

Wenn Sie eine dedizierte Redis-Instanz einrichten, die NUR als LRU-Instanz verwendet wird, um dieses bestimmte Szenario zu vermeiden, gibt es keinen zwingenden Grund, Redis über Memcached zu verwenden.

Wenn Sie einen zuverlässigen LRU-Cache benötigen, der niemals ausfällt ... Memcached ist genau das Richtige für Sie, da es unmöglich ist, dass ihm aufgrund des Designs der Speicher ausgeht und die Spezialisierungsfunktionalität Entwickler daran hindert, ihn so zu gestalten, dass dies gefährdet wird. Einfache Trennung von Bedenken.


6

Memcached ist schneller, wenn Sie an Leistung interessiert sind, auch weil Redis Netzwerk (TCP-Aufrufe) umfasst. Auch intern ist Memcache schneller.

Redis hat mehr Funktionen, als es in anderen Antworten erwähnt wurde.


6

Wir haben Redis als Startschuss für unser Projekt bei der Arbeit gesehen. Wir dachten, dass wir durch die Verwendung eines Moduls in nginxCalled HttpRedis2Moduleoder ähnlichem eine unglaubliche Geschwindigkeit haben würden, aber beim Testen mit AB-Test haben wir uns als falsch erwiesen.

Vielleicht war das Modul schlecht oder unser Layout, aber es war eine sehr einfache Aufgabe und es war noch schneller, Daten mit PHP aufzunehmen und sie dann in MongoDB zu stopfen. Wir verwenden APC als Caching-System und mit diesem PHP und MongoDB. Es war dann viel viel schnellernginx Redis-Modul.

Mein Tipp ist, es selbst zu testen. Dadurch werden Ihnen die Ergebnisse für Ihre Umgebung angezeigt. Wir haben entschieden, dass die Verwendung von Redis in unserem Projekt nicht erforderlich ist, da dies keinen Sinn ergibt.


Interessante Antwort, aber nicht sicher, ob es dem OP hilft
Scott Schulthess

Das Einfügen in Redis und das Verwenden als Cache war langsamer als das Verwenden von APC + PHP + MongoDB. Aber nur das Einfügen in Redis war VIEL langsamer als das direkte Einfügen in MongoDB. Ohne APC sind sie meiner Meinung nach ziemlich gleich.
Ms01

2
Das ist, weil Mongo Ihnen keine Garantie gibt, dass das, was Sie eingefügt haben, jemals auf die Festplatte geschrieben wird ...
Damian

21
Aber es ist eine Webskala. Mongodb läuft beim Schreiben im Kreis um dich herum. Heutzutage schreibe ich nur an / dev / null, weil das am schnellsten ist.
Ms01

1

Redis ist besser.

Die Vorteile von Redissind,

  1. Es verfügt über viele Datenspeicheroptionen wie Zeichenfolgen, Mengen, sortierte Mengen, Hashes und Bitmaps
  2. Festplattenpersistenz von Datensätzen
  3. Gespeicherte Prozedur (LUAUnterstützung für Skripte)
  4. Kann mit PUB / SUB als Message Broker fungieren

Wohingegen Memcache ist ein speicherinternes Schlüsselwert-Cache-Typ-System.

  1. Keine Unterstützung für verschiedene Datenspeicher wie Listen, Sets wie in Redis.
  2. Der Hauptnachteil ist, dass Memcache keine Festplattenpersistenz hat.

0

Nun, ich habe meistens beide mit meinen Apps verwendet, Memcache zum Zwischenspeichern der Sitzungen und Redis für Doctrine / Orm-Abfrageobjekte. In Bezug auf die Leistung sind beide fast gleich.


0

Hier ist der wirklich großartige Artikel / die Unterschiede, die von Amazon bereitgestellt werden

Redis ist ein klarer Gewinner im Vergleich zu memcached.

Nur ein Pluspunkt für Memcached Es ist multithreaded und schnell. Redis hat viele großartige Funktionen und ist sehr schnell, aber auf einen Kern beschränkt.

Tolle Punkte zu Redis, die in Memcached nicht unterstützt werden

  • Schnappschüsse - Der Benutzer kann jederzeit einen Schnappschuss des Redis-Cache erstellen und im Sekundärspeicher verbleiben.
  • Eingebaute Unterstützung für viele Datenstrukturen wie Set, Map, SortedSet, List, BitMaps usw.
  • Unterstützung für Lua-Skripte in Redis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.