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 maxmemory
Limit 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.
Gewohnheiten sind schwer zu brechen :)
Im Ernst, es gibt zwei Hauptgründe - nach meinem Verständnis - warum Memcached immer noch verwendet wird:
Jedoch:
quelle