it-swarm.com.de

Memcached vs. Redis?

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

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

Punkte, die man beachten sollte:

  • Lese-/Schreibgeschwindigkeit.
  • Speichernutzung.
  • Disk I/O Dumping.
  • Skalierung.
1367
Sagiv Ofek

Zusammenfassung (TL; DR)

Aktualisiert 3. Juni 2017

Redis ist leistungsfähiger, beliebter und besser unterstützt als memcached. Memcached kann nur einen kleinen Bruchteil der Funktionen von Redis ausführen. Redis ist sogar dort besser, wo sich die Funktionen überschneiden.

Verwenden Sie für Neues Redis.

Memcached vs Redis: Direkter Vergleich

Beide Tools sind leistungsstarke, schnelle, speicherinterne Datenspeicher, die als Cache nützlich sind. Beides kann Ihre Anwendung beschleunigen, indem Sie Datenbankergebnisse, HTML-Fragmente oder alles andere zwischenspeichern, dessen Generierung möglicherweise teuer ist.

Punkte, die man beachten sollte

Wenn sie für die gleiche Sache verwendet werden, sehen Sie hier, wie sie anhand der zu berücksichtigenden "Punkte" der ursprünglichen Frage vergleichen:

  • Lese-/Schreibgeschwindigkeit : Beide sind extrem schnell. Benchmarks variieren je nach Workload, Version und vielen anderen Faktoren, zeigen jedoch im Allgemeinen, dass Redis so schnell oder fast so schnell sind, wie sie gespeichert wurden. 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 während Sie Elemente einfügen, wächst der Dämon schnell auf etwas mehr als diese Größe. Es gibt nie wirklich eine Möglichkeit, irgendeinen dieser Speicherplätze zurückzugewinnen, außer 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 Teil von RAM verwenden, mit dem Sie sie konfiguriert haben.
    • redis: Die Einstellung einer maximalen Größe liegt bei Ihnen. Redis verwendet nie mehr als nötig und gibt Ihnen den Speicher zurück, den es nicht mehr verwendet.
    • Ich habe 100.000 ~ 2KB Strings (~ 200MB) von zufälligen Sätzen in beiden gespeichert. Die Speichernutzung von RAM ist auf ~ 225 MB angewachsen. Die Nutzung von Redis RAM wuchs auf ~ 228 MB. Nachdem beide geleert worden waren, fielen die Redis auf ~ 29 MB und memcached blieb bei ~ 225 MB. Sie speichern Daten ähnlich effizient, aber nur einer kann sie zurückgewinnen.
  • Disk I/O Dumping : Ein klarer Gewinn für Redis, da dies standardmäßig erfolgt und die Persistenz sehr konfigurierbar ist. 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 einzelne Instanz als Cache benötigen. Redis enthält Tools, die Ihnen dabei helfen, darüber hinauszugehen, während Memcached dies nicht tut.

zwischengespeichert

Memcached ist ein einfacher flüchtiger Cache-Server. Hier können Sie Schlüssel/Wert-Paare speichern, bei denen der Wert auf eine Zeichenfolge von bis zu 1 MB beschränkt ist.

Das ist gut, aber das ist alles, was es tut. Sie können mit extrem hoher Geschwindigkeit über ihren Schlüssel auf diese Werte zugreifen, wodurch häufig das verfügbare Netzwerk oder sogar die Speicherbandbreite ausgelastet wird.

Wenn Sie memcached neu starten, gehen Ihre Daten verloren. 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 ausführen wie memcached und sie auch besser ausführen.

Redis kann fungiert als Cache ebenfalls. 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 ausschalten und Ihre Daten gehen auch beim Neustart verloren. Wenn Sie möchten, dass Ihr Cache einen Neustart übersteht, 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 für Ihre Arbeitslast nicht ausreicht, ist redis die klare Wahl. Redis enthält Cluster-Unterstützung und wird mit Hochverfügbarkeits-Tools ( Redis-Sentinel ) geliefert, die sofort verfügbar sind. In den letzten Jahren hat sich redis auch als klarer Marktführer bei Werkzeugen von Drittanbietern etabliert. 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 höher als bei zwischengespeicherten Bereitstellungen.

Das Redis Superset

Redis ist mehr als ein Cache. Es ist ein In-Memory-Datenstrukturserver. Im Folgenden finden Sie eine kurze Übersicht über die Funktionen von Redis, die über einen einfachen Schlüssel-/Wert-Cache wie memcached hinausgehen. Die meisten Funktionen von redis sind Dinge, die memcached nicht können.

Dokumentation

Redis ist besser dokumentiert als zwischengespeichert. Das kann zwar subjektiv sein, scheint aber immer wahrer zu werden.

redis.io ist eine fantastische, einfach zu navigierende Ressource. Sie können damit versuchen Sie es erneut im Browser und erhalten sogar interaktive Live-Beispiele für jeden Befehl in den Dokumenten.

Es gibt jetzt doppelt so viele Stackoverflow-Ergebnisse für Redis wie im Memcached. Doppelt 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 ergeben sie ein klares Bild, dass die Unterstützung und Dokumentation für Redis größer und aktueller ist.

Persistenz

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 all 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 einem geringen Datenverlust führen kann. Machen Sie sich keine Sorgen, wenn Sie unbedingt sicherstellen müssen, dass keine Daten verloren gehen. Redis ist auch mit dem AOF-Modus (Append Only File) auf dem Laufenden. In diesem Persistenzmodus können Daten beim Schreiben auf die 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. Diese Optionen erleichtern das Einrichten von Redis als sicheren, redundanten Ort zum Speichern von Daten. Es ist eine echte Datenbank.

Viele Datentypen

Memcached ist auf Zeichenfolgen beschränkt, aber Redis ist ein Datenstruktur-Server, der viele verschiedene Datentypen bedienen kann. Es enthält auch die Befehle, die Sie benötigen, um diese Datentypen optimal zu nutzen.

Zeichenketten ( 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 ist, obwohl memcached strings auf 1 MB begrenzt sind.

Redis bietet Ihnen weitere Tools, mit denen Sie diesen Datentyp nutzen können, indem Sie Befehle für bitweise Operationen, Manipulation auf Bitebene, Unterstützung für Inkrementierung/Dekrementierung von Gleitkommazahlen, Bereichsabfragen und Operationen mit mehreren Schlüsseln bereitstellen. Memcached unterstützt nichts davon.

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

Hashes ( Befehle )

Hashes ähneln einem Schlüsselwertspeicher in einem Schlüsselwertspeicher. Sie bilden zwischen Zeichenkettenfeldern und Zeichenkettenwerten ab. Feld-> Wertzuordnungen, die einen Hash verwenden, sind etwas platzsparender als Schlüssel-> Wertzuordnungen, 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 löschen, alle Mitglieder zusammen löschen usw. Ideal für jeden Anwendungsfall, in dem mehrere Schlüssel/Wert-Paare gruppiert werden müssen.

Ein Beispiel für die Verwendung eines Hashs ist das Speichern von Benutzerprofilen zwischen Anwendungen. Ein Redis-Hash, der mit der Benutzer-ID als Schlüssel gespeichert wird, ermöglicht es Ihnen, so viele Datenbits über einen Benutzer wie nötig zu 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 innerhalb des Benutzerprofils lesen/schreiben können, ohne dass sich eine App über die von anderen vorgenommenen Änderungen Gedanken machen muss (was passieren kann, wenn Sie veraltete Anwendungen serialisieren) 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 zur Nutzung von Listen, einschließlich der Befehle zum Pushen/Popen von Elementen, Pushen/Popen zwischen Listen, Abschneiden von Listen, Durchführen von Bereichsabfragen usw.

Listen sind großartige, langlebige, atomare Warteschlangen. Diese eignen sich hervorragend für Jobwarteschlangen, Protokolle, Puffer und viele andere Anwendungsfälle.

Mengen ( Befehle )

Mengen sind ungeordnete Sammlungen eindeutiger Werte. Sie sind so optimiert, dass Sie schnell überprüfen können, ob ein Wert im Satz enthalten ist, Werte schnell hinzufügen/entfernen und die Überlappung mit anderen Sätzen messen können.

Diese sind großartig für Dinge wie Zugriffssteuerungslisten, eindeutige Besucher-Tracker und viele andere Dinge. Die meisten Programmiersprachen haben etwas Ähnliches (normalerweise Set genannt). Das ist so, nur verteilt.

Redis bietet mehrere Befehle zum Verwalten von Sets. Offensichtliche wie das Hinzufügen, Entfernen und Überprüfen des Sets sind vorhanden. Es gibt also weniger offensichtliche Befehle wie das Poppen/Lesen eines zufälligen Elements und Befehle zum Durchführen von Vereinigungen und Überschneidungen mit anderen Sätzen.

Sortierte Mengen ( Befehle )

Sortierte Mengen sind auch Sammlungen eindeutiger Werte. Diese sind, wie der Name schon sagt, geordnet. Sie sind nach Partitur geordnet und dann lexikografisch.

Dieser Datentyp ist für die schnelle Suche nach Punktzahl optimiert. Das Abrufen des höchsten, niedrigsten oder eines beliebigen Wertebereichs dazwischen erfolgt äußerst schnell.

Wenn Sie einem sortierten Set Benutzer hinzufügen und deren Highscore angeben, 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 hervorragend geeignet, um die letzten Besuche von Benutzern und die in Ihrer Anwendung aktiven Benutzer zu protokollieren.

Wenn Sie Werte mit derselben Punktzahl speichern, werden sie lexikografisch geordnet (denken Sie alphabetisch). Dies kann beispielsweise für die automatische Vervollständigung von Funktionen hilfreich sein.

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

Geo

Redis verfügt über mehrere Befehle zum Speichern, Abrufen und Messen von geografischen Daten. Dies schließt Radiusabfragen und das Messen von Abständen zwischen Punkten ein.

Technisch geografische Daten in redis werden in sortierten Mengen gespeichert, sodass dies kein wirklich separater Datentyp ist. Es ist eher eine Erweiterung über sortierte Mengen.

Bitmap und HyperLogLog

Dies sind wie bei geo keine völlig separaten Datentypen. Mit diesen Befehlen können Sie Zeichenfolgendaten so behandeln, als ob es sich um eine Bitmap oder ein Hyperlog handelt.

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

Mit HyperLogLog können Sie auf konstant kleinstem Raum nahezu unbegrenzt eindeutige Werte mit schockierender Genauigkeit 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 Atomaritä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 muss nicht gewartet werden, bis sich dieser Wert verbreitet. Technisch gesehen ist memcached auch atomar, aber wenn redis all diese Funktionen über memcached hinaus hinzufügt, ist es erwähnenswert und ziemlich beeindruckend, dass all diese zusätzlichen Datentypen und Features auch atomar sind.

Obwohl dies nicht ganz mit Transaktionen in relationalen Datenbanken identisch ist, hat redis auch Transaktionen , die "optimistisches Sperren" verwenden ( WATCH / MULTI / EXEC ).

Pipelining

Redis bietet eine Funktion namens " Pipelining ". Wenn Sie über viele Redis-Befehle verfügen, die Sie ausführen möchten, können Sie Pipelining verwenden, um sie nicht einzeln, sondern auf einmal an Redis zu senden.

Normalerweise ist jeder Befehl ein separater Anforderungs-/Antwortzyklus, wenn Sie einen Befehl ausführen, der entweder erneut ausgeführt oder zwischengespeichert wird. Mit Pipelining kann redis mehrere Befehle puffern und alle auf einmal ausführen, wobei alle Antworten auf alle 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 hat Befehle für Pub/Sub-Funktionalität , wodurch 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 haben in bestimmten Bereichen möglicherweise Vorteile, aber die Tatsache, dass derselbe Server Ihnen auch dauerhafte Warteschlangen und andere Datenstrukturen bereitstellen kann, die Ihre Pub-/Sub-Workloads wahrscheinlich benötigen, wird Redis häufig beweisen sei das beste und einfachste Werkzeug für den Job.

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.

Vielleicht haben Sie komplexe Berechnungen, die Sie erneut durchführen möchten. 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 und viele andere Probleme können mit lua scripting gelöst werden.

Das gesamte Skript wird atomar ausgeführt. Wenn Sie also Ihre Logik in ein Lua-Skript einpassen können, vermeiden Sie oft, mit optimistischen Sperrtransaktionen herumzuspielen.

Skalierung

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

Fazit

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

Das Obige klingt vielleicht so, als würde ich es nicht mögen, wenn ich es auswendig lerne. Im Gegenteil: Es ist ein leistungsstarkes, einfaches, stabiles, ausgereiftes und gehärtetes Werkzeug. Es gibt sogar einige Anwendungsfälle, in denen es etwas schneller ist als Redis. 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 geringfügig und arbeitsspezifisch. Es gibt auch Workloads, für die Redis schneller ist, und viel mehr Workloads, die Redis ausführen kann, was Memcached einfach nicht kann. Die winzigen Leistungsunterschiede scheinen angesichts der riesigen Funktionsunterschiede geringfügig zu sein, und die Tatsache, dass beide Tools so schnell und effizient sind, dass sie möglicherweise der letzte Teil Ihrer Infrastruktur sind, über den Sie sich jemals Gedanken machen müssen.

Es gibt nur ein Szenario, in dem ein Memcached sinnvoller ist: Memcached wird bereits als Cache verwendet. Wenn Sie bereits mit memcached cachen, 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 genug Nutzen, 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 den Speicherbereich hinaus skalieren müssen oder zusätzliche Funktionen benötigen.

1955
Carl Zulauf

Verwenden Sie Redis wenn

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

  2. Sie benötigen die Fähigkeit, Schlüssel eines bestimmten Typs abzufragen. Gl. 'blog1: posts: *', 'blog2: categories: xyz: posts: *'. Oh ja! Dies ist sehr wichtig. Verwenden Sie diese Option, um bestimmte Arten von zwischengespeicherten Elementen selektiv zu deaktivieren. 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 (Dies wird auch benötigt, es sei denn, der Cache muss nach jedem Neustart aufgewärmt werden. Sehr wichtig für Objekte, die sich selten ändern.)

Verwenden Sie memcached wenn

  1. Memcached gibt dir Kopfschmerzen!
  2. umm ... clustering? meh. Wenn Sie so weit kommen, verwenden Sie Varnish und Redis, um Fragmente und AR-Objekte zwischenzuspeichern.

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

136
SMathew

Memcached ist multithreaded und schnell.

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

Wir benutzen beide. Memcached wird zum Zwischenspeichern von Objekten verwendet, um in erster Linie die Lesebelastung der Datenbanken zu verringern. Redis wird zum Beispiel für sortierte Mengen verwendet, die sich zum Aufrollen von Zeitreihendaten eignen.

93

Dies ist zu lang, um als Kommentar zu einer bereits akzeptierten Antwort gepostet zu werden. Deshalb habe ich es als separate Antwort angegeben.

Zu berücksichtigen ist auch, ob für Ihre Cache-Instanz eine harte Speicherobergrenze zu erwarten ist.

Da es sich bei redis um eine NOSQL-Datenbank mit zahlreichen Funktionen handelt und Caching nur eine Option ist, für die es verwendet werden kann, wird Speicher nach Bedarf zugewiesen. Je mehr Objekte Sie darin ablegen, desto mehr Speicher wird verwendet. Die Option maxmemory erzwingt die Verwendung der oberen Speichergrenze nicht strikt. Während Sie mit dem Cache arbeiten, werden die Schlüssel entfernt und sind abgelaufen. Möglicherweise haben Ihre Schlüssel nicht alle dieselbe Größe, sodass eine Fragmentierung des internen Speichers auftritt.

Standardmäßig verwendet redis jemalloc Speicherreservierer, der sein Bestes tut, um sowohl speicherkompakt als auch schnell zu sein. Es handelt sich jedoch um einen Allzweck-Speicherreservierer, der mit vielen Zuweisungen und Objektbereinigungen nicht Schritt halten kann eine hohe Rate. Aus diesem Grund kann bei einigen Lademustern bei der Redis-Verarbeitung anscheinend Speicher aufgrund interner Fragmentierung verloren gehen. Wenn Sie beispielsweise einen Server mit 7 Gb RAM und redis als nicht persistenten LRU-Cache verwenden möchten, stellen Sie möglicherweise fest, dass dieser Redis-Prozess mit maxmemory auf 5 Gb festgelegt ist Im Laufe der Zeit würde mehr und mehr Speicher verbraucht und schließlich die Grenze von total RAM erreicht, bis der Killer, der nicht mehr über genügend Speicher verfügt, stört.

memcached passt besser zum oben beschriebenen Szenario, da es seinen Speicher auf eine völlig andere Weise verwaltet. memcached ordnet 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 Slab Allocator verwendet. Darüber hinaus bemüht sich memcached, die interne Fragmentierung gering zu halten, da dies tatsächlich verwendet den Pro-Platte-LRU-Algorithmus ist, wenn LRU-Räumungen unter Berücksichtigung der Objektgröße durchgeführt werden.

Trotzdem hat memcached eine starke Position in Umgebungen, in denen die Speichernutzung erzwungen und/oder vorhersehbar sein muss. Wir haben versucht, das neueste stabile Redis (2.8.19) als Drop-In-Ersatz für nicht persistente LRU-basierte Zwischenspeicher bei einer Arbeitslast von 10-15 KBit/s zu verwenden, und es ist viel Speicherplatz verloren gegangen. Die gleiche Arbeitslast stürzte ab. Der ElastiCache von Amazon führte aus den gleichen Gründen innerhalb eines Tages zu erneuten Instanzen.

86
artyom

Memcached ist ein einfacher Schlüssel-/Wertespeicher und eignet sich gut für key => STRING. Dies macht es wirklich gut für die Sitzungsspeicherung.

Redis kann gut key => SOME_OBJECT.

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

Ich wünsche Ihnen auch viel Glück bei der Suche nach objektiven Benchmarks.

46
Erik Petersen

Wenn Ihnen ein krasser Schreibstil nichts ausmacht, ist Redis vs Memcached im Systoilet-Blog vom Standpunkt der Benutzerfreundlichkeit aus eine Lektüre wert. Lesen Sie jedoch unbedingt das Hin und Her in den Kommentaren, bevor Sie Schlussfolgerungen ziehen auf Leistung; Es gibt einige methodische Probleme (Einzelthread-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 an: Dormondos LiveJournal und das Antirez-Weblog .

Bearbeiten - Wie Antirez betont, ist die Systoilet-Analyse ziemlich schlecht durchdacht. Sogar jenseits des Singlethreading-Mangels kann ein Großteil der Leistungsunterschiede bei diesen Benchmarks auf die Clientbibliotheken und nicht auf den Serverdurchsatz zurückgeführt werden. Die Benchmarks bei dem Antirez-Weblog zeigen in der Tat einen viel stärkeren Vergleich von Äpfeln zu Äpfeln (mit dem gleichen Mund).

37
Paul Smith

Ich hatte die Möglichkeit, sowohl memcached als auch redis zusammen in dem Caching-Proxy zu verwenden, an dem ich gearbeitet habe.

Redis>

1) Wird zum Indizieren des Cache-Inhalts über den Cluster verwendet. Ich habe mehr als eine Milliarde Schlüssel über Redis-Cluster verteilt. Die Reaktionszeiten für Redis sind sehr viel kürzer und stabiler.

2) Grundsätzlich handelt es sich um einen Schlüssel-/Wertespeicher. 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 zugegriffen wird (mit 50 Treffern/Sekunde), mit einer Größe von weniger als 1 MB.

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

3) Da sich der Inhalt den Grenzen nähert, habe ich gelegentlich höhere Antwortzeiten in den Statistiken beobachtet (nicht der Fall bei Redis).

Wenn Sie nach einer umfassenden Erfahrung fragen, ist Redis viel grüner, da es einfach zu konfigurieren und flexibel mit stabilen, robusten Funktionen ist.

Außerdem gibt es ein Benchmarking-Ergebnis unter Link , unten sind einige Highlights von demselben,

enter image description here

enter image description here

Hoffe das hilft!!

22
Jain Rach

Ein weiterer Vorteil ist, dass sehr klar sein kann, wie sich Memcache in einem Caching-Szenario verhält, während Redis im Allgemeinen als beständiger Datenspeicher verwendet wird Kapazität.

Einige Apps, an denen ich gearbeitet habe, verwenden beide, um zu verdeutlichen, wie sich die Daten verhalten sollen. In Memcache schreiben wir Code, um die Fälle zu behandeln, in denen sie nicht vorhanden sind. In Redis müssen sie vorhanden sein .

Ansonsten gilt Redis in den meisten Anwendungsfällen als überlegen, da es funktionsreicher und damit flexibler ist.

13

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

Bei meiner jetzigen Firma wurde Redis als Hauptcache verwendet. Als ich einige Leistungsstatistiken durchgesehen und einfach mit dem Testen begonnen habe, war Redis in Bezug auf die Leistung vergleichbar oder minimal langsamer als MySQL.

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

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

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

Einige Benchmarks haben ergeben, dass Redis in unserem Fall sehr schlecht abschneidet. Ich glaube, das hat mit vielen Variablen zu tun:

  • art der Hardware, auf der Sie Redis ausführen
  • arten von Daten, die Sie speichern
  • menge an Gets und Sets
  • wie gleichzeitig Ihre App ist
  • benötigen Sie Datenstrukturspeicher?

Persönlich teile ich nicht die Meinung der Redis-Autoren zu Parallelität und Multithreading.

13
mdomans

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

10
Atif Hussain

Ein Hauptunterschied, auf den hier nicht hingewiesen wurde, ist, dass Memcache zu jeder Zeit eine obere Speichergrenze hat, während Redis dies nicht standardmäßig tut (aber konfiguriert werden kann). Wenn Sie einen Schlüssel/Wert immer für eine bestimmte Zeitspanne speichern möchten (und ihn niemals aufgrund von Speichermangel räumen möchten), sollten Sie Redis verwenden. Natürlich riskieren Sie auch das Problem, dass Ihnen der Speicher ausgeht ...

7
Ztyx

Ein sehr einfacher Test, um 100.000 eindeutige Schlüssel und Werte für redis-2.2.2 und memcached festzulegen und abzurufen. Beide laufen unter Linux VM (CentOS) und mein Client-Code (unten eingefügt) läuft auf dem Windows-Desktop.

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 Zeit zum Speichern von 100000 Werten 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");
7

Wir haben uns Redis als Starthilfe für unser Projekt bei der Arbeit vorgestellt. Wir dachten, dass wir mit einem Modul in Nginx namens HttpRedis2Module oder ähnlichem eine unglaubliche Geschwindigkeit haben würden, aber wenn wir mit AB-Test testen, 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 abzulegen. Wir verwenden APC als Caching-System und mit dieser PHP und MongoDB. Es war viel schneller als das Nginx Redis Modul.

Mein Tipp ist, es selbst zu testen. Wenn Sie dies tun, werden die Ergebnisse für Ihre Umgebung angezeigt. Wir haben entschieden, dass die Verwendung von Redis in unserem Projekt unnötig ist, da dies keinen Sinn ergibt.

5
Ms01

Der größte verbleibende Grund ist die Spezialisierung.

Redis kann viele verschiedene Dinge tun, und ein Nebeneffekt davon ist, dass Entwickler möglicherweise beginnen, viele dieser verschiedenen Funktionssätze auf derselben Instanz zu verwenden. Wenn Sie die LRU-Funktion von Redis für einen Cache neben einem festen Datenspeicher verwenden, der NICHT LRU ist, ist es durchaus möglich, dass nicht genügend Arbeitsspeicher vorhanden ist.

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

Wenn Sie einen zuverlässigen "Never Go Down" -LRU-Cache benötigen ... Memcached ist genau das Richtige für Sie, da es aufgrund des Designs unmöglich ist, nicht genügend Arbeitsspeicher zur Verfügung zu haben, und die Spezialisierungsfunktionalität verhindert, dass Entwickler versuchen, den Cache so zu gestalten, dass dies gefährdet wird. Einfache Trennung von Anliegen.

5
brightball

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

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

4
Denys

Redis ist besser.

Die Vorteile von Redis sind,

  1. Es verfügt über viele Datenspeicheroptionen wie Zeichenfolgen, Mengen, sortierte Mengen, Hashes und Bitmaps
  2. Festplattenpersistenz von Datensätzen
  3. Unterstützung für gespeicherte Prozeduren (LUA Scripting)
  4. Kann mit PUB/SUB als Nachrichtenbroker fungieren

Während Memcache ein speicherinternes Schlüsselwert-Cache-Typ-System ist.

  1. Keine Unterstützung für verschiedene Datentypen wie Listen, Sets wie in redis.
  2. Das Hauptproblem ist, dass Memcache keine Festplattenpersistenz aufweist.
2

hier ist der wirklich tolle Artikel/Unterschied von Amazon

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.

0
nagendra547

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

0
Muhammad Taqi