Der Hauptgrund, den ich heute als Anwendungsfall für Memcache über Redis sehe, ist die überlegene Speichereffizienz, die Sie mit plain erreichen sollten Caching von HTML-Fragmenten (oder ähnliche Anwendungen). Wenn Sie verschiedene Felder Ihrer Objekte in verschiedenen Memcache-Schlüsseln speichern müssen, sind Redis-Hashes speichereffizienter, aber wenn Sie eine große Anzahl von Schlüssel -> simple_string-Paaren haben, sollte Memcache in der Lage sein, Ihnen mehr Elemente pro Megabyte.
Andere Dinge, die gute Punkte über memcached sind:
- Es ist ein sehr einfaches Stück Code. Wenn Sie also nur die Funktionen benötigen, die es bietet, ist es eine vernünftige Alternative, denke ich, aber ich habe es nie in der Produktion verwendet.
- Es ist multi-threaded. 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 sich die Leute in Richtung intelligentes Caching bewegen oder wenn sie versuchen, die Struktur der zwischengespeicherten Daten über Redis-Datenstrukturen beizubehalten.
Vergleich zwischen Redis LRU und Memcache-LRU.
Sowohl Memcached als auch Redis führen keine echten LRU-Räumungen durch, sondern nur eine Annäherung daran.
Die Memcache-Entfernung erfolgt pro Größenklasse und hängt von den Implementierungsdetails ihres Slab-Allokators ab. Wenn Sie beispielsweise einen Artikel hinzufügen möchten, der in eine bestimmte Größenklasse passt, versucht Memcached, abgelaufene / nicht kürzlich verwendete Artikel in dieser Klasse zu entfernen, anstatt einen globalen Versuch zu unternehmen, um zu verstehen, was das Objekt ist, unabhängig von seiner Größe Größe, was der beste Kandidat ist.
Redis versucht stattdessen, ein gutes Objekt als Kandidaten für die Entfernung auszuwählen, wenn maxmemory
Grenze erreicht ist, alle Objekte unabhängig von der Größenklasse betrachtet, aber nur ein annähernd gutes Objekt liefern kann, nicht das beste Objekt mit der größeren Leerlaufzeit.
Die Art und Weise, wie Redis dies tut, besteht darin, einige Objekte abzutasten und dasjenige auszuwählen, das am längsten im Leerlauf war (nicht zugegriffen wurde). Seit Redis 3.0 (derzeit in der Beta) wurde der Algorithmus verbessert und nimmt auch gute Kandidatenpools über Räumungen hinweg, sodass die Annäherung verbessert wurde. In der Redis-Dokumentation finden Sie eine Beschreibung und Grafiken mit Details zur Funktionsweise.
Warum memcached einen besseren Speicherbedarf als Redis für einfache String->String-Maps hat.
Redis ist eine komplexere Software, daher werden Werte in Redis auf eine Weise gespeichert, die Objekten in einer höheren Programmiersprache ähnlicher ist:Sie haben einen zugehörigen Typ, eine Codierung und eine Referenzzählung für die Speicherverwaltung. Dies macht die interne Struktur von Redis gut und überschaubar, hat aber einen Overhead im Vergleich zu Memcached, das sich nur mit Strings befasst.
Wenn Redis anfängt, speichereffizienter zu werden
Redis ist in der Lage, kleine aggregierte Datentypen auf eine spezielle speichersparende Weise zu speichern. Beispielsweise wird ein kleiner Redis-Hash, der ein Objekt darstellt, intern nicht mit einer Hash-Tabelle, sondern als binärer eindeutiger Blob gespeichert. Daher ist es effizienter, mehrere Felder pro Objekt in einen Hash zu setzen, als N getrennte Schlüssel in Memcached zu speichern.
Sie können ein Objekt tatsächlich als einzelnes JSON- (oder binär codiertes) Blob in Memcache speichern, aber im Gegensatz zu Redis können Sie damit keine unabhängigen Felder abrufen oder aktualisieren.
Der Vorteil von Redis im Zusammenhang mit intelligentem Caching.
Aufgrund der Redis-Datenstrukturen ist das übliche Muster, das bei Memcached verwendet wird, Objekte zu zerstören, wenn der Cache ungültig gemacht wird, um sie später aus der DB neu zu erstellen, eine primitive Art, Redis zu verwenden.
Stellen Sie sich zum Beispiel vor, Sie müssten die neuesten N Nachrichten, die in Hacker News gepostet werden, zwischenspeichern, um den Abschnitt „Neueste“ der Website zu füllen. Was Sie mit Redis tun, ist, eine Liste (begrenzt auf M Elemente) mit den neusten eingefügten Nachrichten zu erstellen. Wenn Sie einen anderen Speicher für Ihre Daten und Redis als Cache verwenden, müssen Sie beide füllen die Ansichten (Redis und die DB), wenn ein neuer Artikel gepostet wird. Es gibt keine Cache-Invalidierung.
Die Anwendung kann jedoch immer über eine Logik verfügen, sodass, wenn die Redis-Liste beispielsweise nach einem Start leer ist, die ursprüngliche Ansicht aus der DB neu erstellt werden kann.
Durch die Verwendung von intelligentem Caching ist es möglich, das Caching mit Redis im Vergleich zu Memcached effizienter durchzuführen, aber nicht alle Probleme sind für dieses Muster geeignet. Zum Beispiel kann das Caching von HTML-Fragmenten von dieser Technik nicht profitieren.