Wenn Redis bereits Teil des Stacks ist, warum wird Memcached dann immer noch neben Redis verwendet?

84

Redis kann alles, was Memcached bietet (LRU-Cache, Ablauf von Elementen und jetzt Clustering in Version 3.x +, derzeit in der Beta) oder mit Tools wie twemproxy ausführen. Die Leistung ist auch ähnlich. Darüber hinaus fügt Redis eine Persistenz hinzu, aufgrund derer Sie im Falle eines Neustarts des Servers keine Cache-Erwärmung durchführen müssen.

Verweis auf einige alte Antworten, die Redis und Memcache vergleichen, von denen einige Redis als Ersatz für Memcache bevorzugen (falls bereits im Stapel vorhanden):

Trotzdem stellte ich beim Studium von Stapeln großer Web-Unternehmen wie Instagram, Pinterest, Twitter usw. fest, dass sie sowohl Memcached als auch Redis für unterschiedliche Zwecke verwenden und Redis nicht für das primäre Caching. Der primäre Cache ist weiterhin Memcached, und Redis wird für das auf Datenstrukturen basierende logische Caching verwendet.

Warum ist memcached ab 2014 immer noch den Aufwand wert, als zusätzliche Komponente in Ihren Stapel aufgenommen zu werden, wenn Sie bereits eine Redis-Komponente haben, die alles kann, was memcached kann? Was sind die günstigen Punkte, die die Architekten / Ingenieure dazu veranlassen, neben bereits vorhandenen Redis noch Memcached einzubeziehen?

Update:

Für unsere Plattformen haben wir Memcached vollständig verworfen und verwenden Redis sowohl für einfache als auch für logische Caching-Anforderungen. Hochleistungsfähig, flexibel und zuverlässig.

Einige Beispielszenarien:

  • Listen Sie alle zwischengespeicherten Schlüssel nach einem bestimmten Muster auf und lesen oder löschen Sie ihre Werte. Sehr einfach in Redis, nicht machbar (leicht) in Memcached.
  • Das Speichern einer Nutzlast von mehr als 1 MB, die in Redis einfach durchzuführen ist, erfordert Änderungen der Plattengröße in Memcached, was eigene Leistungsnachteile hat.
  • Einfache Schnappschüsse des aktuellen Cache-Inhalts
  • Redis Cluster ist zusammen mit Sprachtreibern auch produktionsbereit, daher ist auch die Clusterbereitstellung einfach.
DhruvPathak
quelle

Antworten:

122

Der Hauptgrund, den ich heute als Anwendungsfall für Memcached über Redis sehe, ist die überlegene Speichereffizienz, die Sie mit dem Zwischenspeichern von einfachen HTML-Fragmenten (oder ähnlichen Anwendungen) erzielen sollten. Wenn Sie verschiedene Felder Ihrer Objekte in verschiedenen zwischengespeicherten Schlüsseln speichern müssen, sind Redis-Hashes speichereffizienter. Wenn Sie jedoch eine große Anzahl von Schlüsselpaaren -> simple_string-Paaren haben, sollte memcached in der Lage sein, Ihnen mehr Elemente pro zu geben Megabyte.

Andere Dinge, die gute Punkte über memcached sind:

  • Es ist ein sehr einfacher Code. Wenn Sie also nur die Funktionalität benötigen, die er bietet, ist er eine vernünftige Alternative, aber ich habe ihn nie in der Produktion verwendet.
  • Es ist Multithread-fähig. Wenn Sie also in einem Single-Box-Setup skalieren müssen, ist es eine gute Sache und Sie müssen mit nur einer Instanz sprechen.

Ich glaube, dass Redis als Cache immer sinnvoller wird, wenn Menschen auf intelligentes Caching umsteigen oder wenn sie versuchen, die Struktur der zwischengespeicherten Daten über Redis-Datenstrukturen beizubehalten.

Vergleich zwischen Redis LRU und memcached LRU.

Sowohl memcached als auch Redis führen keine echten LRU-Räumungen durch, sondern nur eine Annäherung daran.

Die Memcache-Räumung erfolgt pro Größenklasse und hängt von den Implementierungsdetails des Plattenzuordners ab. Wenn Sie beispielsweise ein Element hinzufügen möchten, das in eine bestimmte Größenklasse passt, versucht memcached, abgelaufene / nicht zuletzt verwendete Elemente in dieser Klasse zu entfernen, anstatt einen globalen Versuch zu unternehmen, das Objekt unabhängig von dessen Größe zu verstehen Größe, die der beste Kandidat ist.

Redis versucht stattdessen, ein gutes Objekt als Räumungskandidaten auszuwählen, wenn das maxmemoryLimit erreicht ist. Dabei werden alle Objekte unabhängig von der Größenklasse betrachtet, es kann jedoch nur ein annähernd gutes Objekt bereitgestellt werden, nicht das beste Objekt mit dem größeren Leerlauf Zeit.

Die Art und Weise, wie Redis dies tut, besteht darin, einige Objekte abzutasten und das Objekt auszuwählen, das am längsten inaktiv war (auf das nicht zugegriffen wurde). Seit Redis 3.0 (derzeit in der Beta) wurde der Algorithmus verbessert und es werden auch gute Kandidatenpools über Räumungen hinweg verwendet, sodass die Annäherung verbessert wurde. In der Redis-Dokumentation finden Sie eine Beschreibung und Grafiken mit Details zur Funktionsweise .

Warum memcached für einfache Zeichenfolgen -> Zeichenfolgenzuordnungen einen besseren Speicherbedarf als Redis hat.

Redis ist eine komplexere Software, daher werden Werte in Redis auf eine Weise gespeichert, die Objekten in einer höheren Programmiersprache ähnlicher ist: Typ, Codierung und Referenzzählung für die Speicherverwaltung sind zugeordnet. Dies macht die interne Struktur von Redis gut und überschaubar, hat jedoch einen Overhead im Vergleich zu memcached, bei dem nur Zeichenfolgen behandelt werden.

Wenn Redis anfängt, speichereffizienter zu sein

Redis ist in der Lage, kleine aggregierte Datentypen auf spezielle speichersparende Weise zu speichern. Beispielsweise wird ein kleiner Redis-Hash, der ein Objekt darstellt, intern nicht mit einer Hash-Tabelle gespeichert, sondern als binärer eindeutiger Blob. Das Festlegen mehrerer Felder pro Objekt in einem Hash ist daher effizienter als das Speichern von N getrennten Schlüsseln in Memcached.

Sie können ein Objekt tatsächlich als einzelnes JSON-Blob (oder als binär codiertes Blob) in memcached speichern. Im Gegensatz zu Redis können Sie jedoch keine unabhängigen Felder abrufen oder aktualisieren.

Der Vorteil von Redis im Kontext des intelligenten Caching.

Aufgrund der Redis-Datenstrukturen ist das übliche Muster, das beim Speichern von Objekten verwendet wird, wenn der Cache ungültig gemacht wird, um ihn später aus der Datenbank neu zu erstellen, eine primitive Methode zur Verwendung von Redis.

Stellen Sie sich zum Beispiel vor, Sie müssen die neuesten N Nachrichten, die in Hacker News veröffentlicht wurden, zwischenspeichern, um den Abschnitt "Neueste" der Site zu füllen. Was Sie mit Redis tun, ist, eine Liste (begrenzt auf M Elemente) mit den neuesten Nachrichten zu erstellen. Wenn Sie einen anderen Speicher für Ihre Daten und Redis als Cache verwenden, füllen Sie beide Ansichten (Redis und DB), wenn ein neues Element veröffentlicht wird. Es gibt keine Cache-Ungültigmachung.

Die Anwendung kann jedoch immer über eine Logik verfügen, sodass die ursprüngliche Ansicht aus der Datenbank neu erstellt werden kann, wenn die Redis-Liste beispielsweise nach einem Start als leer befunden wird.

Durch die Verwendung von intelligentem Caching ist es möglich, das Caching mit Redis effizienter durchzuführen als mit Memcached, aber nicht alle Probleme sind für dieses Muster geeignet. Beispielsweise kann das Zwischenspeichern von HTML-Fragmenten von dieser Technik nicht profitieren.

Antirez
quelle
Danke Antirez der Schöpfer. Aber ** warum ist der Redis-Speicherbedarf für einfache Zeichenfolgen größer als der für zwischengespeicherte? ** Ist die Komprimierung ein Faktor? Oder speichert Redis einige andere zusätzliche Daten, wenn ein SET zum Speichern einer einfachen Zeichenfolge verwendet wird? Es wäre großartig, wenn Sie diese Informationen in die Antwort aufnehmen könnten.
DhruvPathak
3
Ich habe versucht, die Antwort zu verbessern. Danke für die Rückmeldungen.
Antirez
3
Ein weiterer Aspekt der oben genannten "Intelligenz" oder die Nutzung der Datentypen und der serverseitigen Logik von Redis über Operationen und / oder Skripte besteht darin, dass Sie sowohl die Anwendungskomplexität als auch das Netzwerk einsparen (wie von @antirez bei antirez erläutert). com / news / 73 und Yiftach unter redislabs.com/blog/the-proven-redis-performance ).
Itamar Haber
1
Antirez danke für die Antwort. Ein weiterer Grund könnte sein, dass memcached nur ein bisschen schneller ist. Auch ist alte Software und viele Frameworks unterstützen es als Standard
Nick
3
Ausgezeichnete Antwort, ich muss lieben, wie engagiert der Vater von Redis mit der Gemeinde ist.
Mahn
13

Gewohnheiten sind schwer zu brechen :)

Im Ernst, es gibt zwei Hauptgründe - nach meinem Verständnis - warum Memcached immer noch verwendet wird:

  1. Legacy - es gibt Entwickler, die mit Memcached vertraut und vertraut sind, sowie Anwendungen, die es unterstützen. Dies bedeutet auch, dass es sich um eine ausgereifte und bewährte Technologie handelt.
  2. Skalierung - Standard Memcached ist leicht horizontal skalierbar, während Redis (bis und ohne die bald erscheinende Version 3) zu diesem Zweck mehr Arbeit erfordert (dh Sharding).

Jedoch:

  1. Re. Vermächtnis - Angesichts der Robustheit von Redis (Datenstrukturen, Befehle, Persistenz ...), der aktiven Entwicklung und der Entwicklung von Clients in jeder erdenklichen Sprache werden normalerweise neue Anwendungen damit entwickelt.
  2. Neuskalierung - Neben der kommenden Version 3 gibt es Lösungen, die die Skalierung erheblich vereinfachen können. Beispielsweise bietet Redis Cloud eine nahtlose Skalierung ohne Datenverlust oder Dienstunterbrechung. Ein weiterer beliebter Ansatz zum Skalieren / Sharding von Redis ist Twemproxy .
Itamar Haber
quelle
1
Nur eine Anmerkung: Wie der aktuelle Betreuer auf Twitter bestätigt hat, wird Memcached immer noch aktiv entwickelt / gewartet. Ich denke, die Tatsache, dass nicht oft neue Inhalte hinzugefügt werden, ist auf die Reife des Projekts und die mangelnde Bereitschaft zurückzuführen, neue Inhalte hinzuzufügen. Daher konzentrieren sich die neuen Entwicklungen auf Optimierungen / Korrekturen.
Antirez
1
Bis Memcached noch lebt und tritt - bearbeitet meine Antwort / ty antirez & dormando
Itamar Haber
1
Konsistentes Hashing ist immer noch ein robusteres Modell für einen ordnungsgemäßen Ausfall als das Redis-Sharding für ein reines Cache-Szenario. Wenn Knoten fallen, werden die Cache-Schlüssel automatisch auf andere Server verschoben. Solange Sie einen einzelnen Server haben, funktioniert Ihr Cache noch, im Gegensatz zu Redis, bei denen Ihr Cluster ausfällt, wenn Sie Master und Slave für eine Hashgruppe verlieren.
Usman Ismail
1
RedisLabs ist ausgezeichnet. Es ist eine Schlüsseltechnologie hinter Userify Cloud.
fatal_error
1
Ich bin auch äußerst misstrauisch gegenüber Implementierungen, die nicht auf Multithreads und Ereignisschleifen basieren. ... OK, wo sind jetzt die anwesenden Performance-Apologeten? Ich habe ihr Abendessen vorbereitet. Jetzt könnte Redis das tun, und ich wäre von der Systemseite aus viel pro-redis. An diesem Punkt ist memcached eine einfache und effizientere Implementierung, es sei denn, die Entwicklergruppe ist ungewöhnlich in der Lage, zwischenzuspeichern. Funktionen sind NIE kostenlos. Lassen Sie sich von den Apologeten nicht sagen, dass sie es sind oder dass Ihre Kosten unbedeutend sind.
JM Becker