
kontaktiere uns


Wenn Sie über eine serverseitige Caching-Lösung nachdenken, haben Sie wahrscheinlich von Redis oder Memcached gehört.
Beides Redis und Memcached sind:
Was ist der Unterschied zwischen Memcached und Redis?
Memcached und Redis speichern beide Daten im Speicher, um die Anwendungsgeschwindigkeit zu erhöhen, aber sie erfüllen unterschiedliche Anforderungen.
Aber lassen Sie uns die Unterschiede in diesem Artikel genauer untersuchen. Basierend auf einem Projekt, das wir für einen Kunden entwickelt haben, werde ich Folgendes behandeln wie sie mit der Datenspeicherung umgehen, Skalierbarkeit und welches schneidet besser ab unter Berücksichtigung bestimmter Szenarien. Aber lassen Sie uns zuerst mit den Grundlagen beginnen.
Redis, was Remote Dictionary Server bedeutet, wurde 2009 von Salvatore Sanfilippo entwickelt, um die Skalierbarkeit des Weblog-Analyzers zu verbessern, den sein italienisches Startup entwickelte. Der erste Prototyp wurde in Tcl geschrieben und später in C transkribiert. Als Sanfilippo beschloss, das Projekt als Open Source anzubieten, gewann es langsam an Fahrt. Giganten wie GitHub und Instagram waren einige der ersten Unternehmen, die es eingeführt haben.
Memcached wurde etwas früher, 2003, von Brad Fitzpatrick für seine LiveJournal-Website erstellt. Es wurde ursprünglich in Perl entwickelt und dann in C übersetzt. Es wird von einigen der größten Unternehmen wie Facebook, Youtube und Twitter verwendet.
Redis hat fünf Datentypen:
Redis unterstützt Datentypoperationen. Das bedeutet, dass Sie auf Teile eines Datenobjekts zugreifen oder es ändern können, ohne das gesamte Objekt auf Anwendungsebene laden, es ändern und dann die aktualisierte Version erneut speichern zu müssen. Redis verwendet eine gekapselte Version der Malloc/Free-Speicherverwaltung, was im Vergleich zum Memcached Slab-Mechanismus ein einfacherer Ansatz ist, wie ich weiter unten erläutern werde. Redis unterstützt Schlüssel mit einer maximalen Größe von 512 MB und auch Werte bis zu 512 MB. Dieses Limit gilt pro Element für aggregierte Datentypen (Listen und Sets).
Im Gegensatz zu Redis Memcached hat keine Datentypen, da es Zeichenketten speichert, die durch einen Zeichenkettenschlüssel indiziert sind. Im Vergleich zu Redis es verbraucht weniger Overhead-Speicher. Außerdem ist es durch die Größe des Speichers auf dem Computer begrenzt, und wenn es voll ist, beginnt es, Werte in der Reihenfolge zu löschen, in der sie am wenigsten verwendet wurde. Es verwendet einen Zuweisungsmechanismus namens Slab, der den zugewiesenen Speicher in Blöcke unterschiedlicher Größe unterteilt und Schlüsselwert-Datensätze der entsprechenden Größe speichert. Dies löst das Problem der Speicherfragmentierung. Memcached unterstützt Schlüssel mit einer maximalen Größe von 250 B und Werten bis zu 1 MB. Beachten Sie jedoch, dass dies nur die Standardeinstellung ist und beim Start geändert werden kann, indem Sie die maximale Plattengröße erhöhen.
Nehmen wir das einfache Beispiel der Verwendung eines Caches zum Speichern eines Benutzersitzungsobjekts.
Wenn wir Memcached verwenden, um ein einzelnes Feld im Objekt zu ändern, muss die Zeichenfolge geladen, deserialisiert, das Objektfeld bearbeitet, serialisiert und gespeichert werden. Wenn wir Redis verwenden, kann der Hash-Datentyp verwendet werden. Es ermöglicht den Zugriff auf jedes Feld im Hash einzeln, sodass jede CRUD-Operation (Create, Read, Update, Delete) auf jedem von ihnen ausgeführt werden kann. Dies ermöglicht es, die Notwendigkeit, dies auf Anwendungsebene zu tun, zu verringern. Dies führt zu Effizienz, sobald weniger I/O-Operationen erforderlich sind.
Seit Redis ist überwiegend Singlethread-fähig und hat native Unterstützung für Clustering, es wächst gut horizontal.
Redis-Clustering funktioniert mit einer Master/Slave-Architektur. Für jeden Master-Knoten gibt es aus Redundanzgründen zwei Slave-Knoten. Wenn also der Master ausfällt, befördert das System automatisch einen der Slaves zum neuen Master. Diese Art der Skalierbarkeit hat den Nachteil, dass die Wartung komplex ist. Es ist schwieriger, mehrere Knoten synchron laufen zu lassen als einen einzelnen.
Memcached lässt sich leicht vertikal skalieren, als es ist multithreading. Die einzigen Anforderungen bestehen darin, ihm mehr Kerne und mehr Speicher zu geben. Es kann auf der Client-Seite auch horizontal skaliert werden, indem ein verteilter Algorithmus implementiert wird. Dies hat den Nachteil, dass die Implementierung komplexer ist, während Redis es sofort einsatzbereit hat.
Bei der Entscheidung, ob Redis oder Memcached verwendet werden soll, besteht ein wesentlicher Unterschied zwischen diesen beiden in der Datenpersistenz.
Während Redis ist (meistens) ein speicherinterner Datenspeicher und es ist nicht volatil, Memcached ist ein In-Memory-Cache und es ist volatil.
Ebenfalls Memcached ist auf die LRU-Räumungsrichtlinie (Least Recently Used) beschränkt während Redis unterstützt sechs verschiedene Richtlinien:
Redis unterstützt Persistenz, daher wird es auf zwei verschiedene Arten als Datenspeicher bezeichnet:
Diese Dateien werden von einem untergeordneten Prozess verarbeitet. Dies ist ein Schlüsselfaktor bei der Entscheidung, welche Art von Persistenz verwendet werden soll.
Wenn der in Redis gespeicherte Datensatz zu groß ist, dauert die Erstellung der RDB-Datei einige Zeit, was sich auf die Antwortzeit auswirkt. Auf der anderen Seite wird es beim Hochfahren schneller geladen werden als das AOF-Protokoll.
Das Das AOF-Protokoll ist besser, wenn Datenverlust überhaupt nicht akzeptabel ist, da es bei jedem Befehl aktualisiert werden kann. Es gibt auch keine Korruptionsprobleme, da es sich um eine Datei handelt, die nur zum Anhängen verwendet werden kann. Es kann jedoch viel größer werden als ein RDB-Snapshot.
1. Sitzungs-Caching in Webanwendungen: Redis kann Benutzersitzungsdaten für Webanwendungen speichern, was besonders für Plattformen mit einer großen Anzahl gleichzeitiger Benutzer nützlich ist. Beispielsweise kann eine E-Commerce-Website Redis verwenden, um Benutzersitzungen schnell abzurufen, ohne die Datenbank aufrufen zu müssen. Dadurch wird das Benutzererlebnis beim An- und Auschecken beschleunigt.
2. Analytik in Echtzeit: Die Datenstrukturen von Redis wie sortierte Sets und Hashes können verwendet werden, um Analyse-Dashboards in Echtzeit zu implementieren. Beispielsweise könnte eine Social-Media-Plattform Redis verwenden, um die Anzahl der aktiven Benutzer oder der Trendbeiträge in Echtzeit zu verfolgen und anzuzeigen.
3. Message Queuing- und Chat-Anwendungen: Die Pub/Sub-Funktionen von Redis ermöglichen Nachrichtenwarteschlangensysteme in Echtzeit. Es kann verwendet werden, um Chat-Anwendungen zu erstellen, bei denen Nachrichten sofort an verschiedene Abonnenten übermittelt werden müssen.
4. Bestenlisten und es werden immer mehr: Spiele und soziale Plattformen verwenden Redis häufig zur Verwaltung von Bestenlisten, da es hohe Schreib- und Leseraten bewältigen kann. Beispielsweise kann eine Online-Gaming-Plattform Redis verwenden, um Spielerranglisten in Echtzeit zu aktualisieren und anzuzeigen.
5. Ganzseitiger Cache (FPC): Redis kann als FPC verwendet werden, um die Ausgabe von Datenbankabfragen zu speichern und die Belastung der Datenbank zu reduzieren. Beispielsweise kann ein Content Management System (CMS) Redis verwenden, um Seiten zwischenzuspeichern und sie schnell bereitzustellen, ohne sie bei jeder Anfrage neu generieren zu müssen.
1. Einfaches Zwischenspeichern von Zeichenketten: Memcached ist ideal für kleine und mittelgroße Websites, die eine einfache Caching-Ebene für Zeichenketten benötigen. Eine Blog-Website kann es beispielsweise verwenden, um die Ergebnisse von Datenbankabfragen für Blogbeiträge zwischenzuspeichern und sie den Besuchern schneller zur Verfügung zu stellen.
2. Zwischenspeichern der Ergebnisse von Datenbankabfragen: Memcached kann verwendet werden, um die Ergebnisse von Datenbankabfragen, auf die häufig zugegriffen wird, zwischenzuspeichern, wodurch die Datenbanklast reduziert wird. Ein Online-Katalogsystem könnte es verwenden, um Produktlisten und Details zwischenzuspeichern.
3. Zwischenspeichern von HTML-Fragmenten: Websites mit statischen HTML-Fragmenten, deren Generierung teuer ist, können Memcached verwenden, um diese Fragmente zu speichern. Beispielsweise könnte eine Nachrichtenwebsite Artikelausschnitte auf der Startseite zwischenspeichern, um die Ladezeiten zu verkürzen.
4. Begrenzung der API-Rate: Die atomaren Inkrement- und Dekrementierungsoperationen von Memcached können verwendet werden, um eine API-Ratenbegrenzung zu implementieren. Eine RESTful-API könnte Memcached verwenden, um die Anzahl der Anfragen eines Benutzers innerhalb eines bestimmten Zeitrahmens zu verfolgen und so Missbrauch zu verhindern.
5. Sitzungsspeicher: Ähnlich wie Redis kann Memcached zum Speichern von Benutzersitzungen verwendet werden, allerdings ohne Persistenz. Dies eignet sich für Anwendungen, bei denen Sitzungsdaten vorübergehend sind und ohne nennenswerte Auswirkungen verloren gehen können, z. B. bei zustandslosen Microservices.
Es hängt sicherlich von den Anforderungen ab.
Redis ist sicherlich flexibler und leistungsfähiger, aber Memcached erfüllt einige Zwecke sehr gut und erzielt in einigen Fällen eine bessere Leistung. Da es über mehrere Threads verfügt, hat es Vorteile, insbesondere bei der Arbeit mit großen Datenmengen.
Redis unterstützt Datenoperationen dank seiner Datentypen, die Fallszenarien beschleunigen können, indem die Anzahl der Netzwerk-I/O und die Datengrößen reduziert werden. Diese Datenoperationen sind so umfangreich wie ein Get oder Set.
Bei Imaginary Cloud wir haben beide verwendet in viele verschiedene Kundenprojekte. In einer, an der ich beteiligt war, mussten wir zwischen den beiden Optionen wählen. Zuerst haben wir Memcached verwendet aufgrund seiner Einfachheit, Benutzerfreundlichkeit und einfachen Einrichtung. Wir brauchten lediglich einen Cache, sodass Persistenz keine Voraussetzung war. Obwohl, nach einigen Tests, Wir haben uns aufgrund der Vorteile von Datentypen für einen Wechsel zu Redis entschieden.
In diesem Projekt waren die Datentypoperationen ein Vorteil für die Art der Daten, die gespeichert werden sollten. Außerdem bietet Redis einen Befehl zur Suche nach Schlüsseln, die einem Muster entsprechen, sowie viele andere nützliche Befehle für den Umgang mit Schlüsseln. Das war für uns wirklich nützlich und ein wichtiger Punkt bei der Entscheidung, zu Redis zu migrieren.
Was die Migration anbelangt, so war sie sehr einfach durchzuführen, da Redis die meisten Befehle unterstützt, die Memcached ausführt. Hätten wir die Route umgekehrt und beschlossen, von Redis zu Memcached zu migrieren, wäre das viel schwieriger gewesen, da Memcached keine Datentypen hat. Jeder Redis-Datentypbefehl wäre in viele Befehle übersetzt worden, zusammen mit einer gewissen Datenverarbeitung dazwischen, um das gleiche Ergebnis zu erzielen.
Wenn es darum geht, eine Entscheidung zu treffen, können wir nicht wirklich sagen, dass eine besser ist als die andere, da alles von den Projektanforderungen abhängt. Aufgrund unserer Erfahrung ist es jedoch wichtig, die Vor- und Nachteile von Anfang an abzuwägen, um Änderungen und Migrationen während des Projekts zu vermeiden.
Webentwickler bei Imaginary Cloud, der von Node.js und allem, was mit Backend-Entwicklung zu tun hat, begeistert ist.
CEO von Imaginary Cloud und Mitautor des Buches Product Design Process. Ich mag Essen, Wein und Krav Maga (nicht unbedingt in dieser Reihenfolge).
People who read this post, also found these interesting: