Heute tauchen wir in die Welt des Caching ein. Caching ist eine Geheimwaffe für den Aufbau skalierbarer Hochleistungssysteme. Es gibt viele Arten von Caching, aber in diesem Artikel konzentrieren wir uns auf das Backend-Objekt-Caching (Backend-Caching). Wenn Sie es beherrschen, können Sie leistungsstarke und zuverlässige Software erstellen.
In diesem Artikel untersuchen wir:
Was ist Caching? Wir untersuchen Caching und erklären, wie es Daten vorübergehend speichert, um einen schnelleren Zugriff zu ermöglichen.
Vorteile des Caching : Entdecken Sie, wie Caching die Geschwindigkeit erhöht, die Serverlast reduziert, das Benutzererlebnis verbessert und sogar Kosten senken kann.
Caching-Muster : In diesem Abschnitt werden wir uns mit verschiedenen Möglichkeiten zur Verwendung des Caches befassen. Denken Sie daran, dass jeder Ansatz Vor- und Nachteile hat. Wählen Sie also unbedingt das richtige Muster für Ihre Anforderungen!
Best Practice für das Caching : Jetzt wissen Sie, wie Sie zwischengespeicherte Daten speichern und abrufen. Aber wie stellen Sie sicher, dass Ihre zwischengespeicherten Daten aktuell bleiben? Und was passiert, wenn der Cache seine Kapazität erreicht?
Wann Sie kein Cachen verwenden sollten : Obwohl das Caching viele Vorteile bietet, gibt es Situationen, in denen es besser vermieden werden sollte. Die Implementierung des Caching im falschen System kann die Komplexität erhöhen und möglicherweise sogar die Leistung beeinträchtigen.
Bei der Erstellung einer leistungsstarken und skalierbaren Anwendung geht es vor allem darum, Engpässe zu beseitigen und das System effizienter zu machen. Datenbanken verursachen aufgrund ihrer Speicher- und Verarbeitungsanforderungen häufig Engpässe bei der Systemleistung. Dies macht sie zu einer kostspieligen Komponente, da sie häufig hochskaliert werden müssen.
Glücklicherweise gibt es eine Komponente, die dazu beitragen kann, die Nutzung von Datenbankressourcen zu verringern und gleichzeitig die Geschwindigkeit des Datenabrufs zu verbessern – diese Komponente heißt Cache .
Cache ist ein temporärer Speicher, der für schnelles Schreiben und Lesen von Daten konzipiert ist. Er verwendet Speicher mit geringer Latenz und optimierte Datenstrukturen für schnelle Vorgänge. Wahrscheinlich haben Sie Redis oder Memcached bereits verwendet oder zumindest ihre Namen gehört. Dies sind zwei der beliebtesten verteilten Caching-Systeme für Backend-Dienste. Redis kann sogar als primäre Datenbank fungieren, aber das ist ein Thema für einen anderen Artikel!
Der Hauptvorteil des Caching ist seine Geschwindigkeit. Das Lesen von Daten aus einem Cache ist deutlich schneller als das Abrufen aus einer Datenbank (wie SQL oder Mongo). Diese Geschwindigkeit wird dadurch erreicht, dass Caches Wörterbuch- (oder HashMap-)Datenstrukturen für schnelle Operationen verwenden und Daten im Hochgeschwindigkeitsspeicher statt auf der Festplatte speichern.
Zweitens verringert das Caching die Belastung Ihrer Datenbank. So können Anwendungen die benötigten Daten aus dem Cache abrufen, anstatt ständig auf die Datenbank zuzugreifen. Dadurch wird die Nutzung der Hardwareressourcen drastisch verringert; anstatt auf der Festplatte nach Daten zu suchen, greift Ihr System einfach aus dem schnellen Speicher darauf zu.
Diese Vorteile verbessern unmittelbar das Benutzererlebnis und können zu Kosteneinsparungen führen. Ihre Anwendung reagiert viel schneller und sorgt für ein reibungsloseres und zufriedenstellenderes Benutzererlebnis.
Caching reduziert die Infrastrukturkosten. Obwohl ein verteiltes System wie Redis seine eigenen Ressourcen benötigt, sind die Gesamteinsparungen oft erheblich. Ihre Anwendung greift effizienter auf Daten zu, sodass Sie möglicherweise Ihre Datenbank verkleinern können. Dies ist jedoch mit einem Kompromiss verbunden: Wenn Ihr Cache-System ausfällt, stellen Sie sicher, dass Ihre Datenbank auf die erhöhte Last vorbereitet ist.
Nachdem Sie nun die Leistungsfähigkeit des Caching kennen, sehen wir uns an, wie Sie es am besten nutzen können. In diesem Abschnitt untersuchen wir zwei grundlegende Musterkategorien: Cache-Schreibmuster und Cache-Fehlermuster . Diese Muster bieten Strategien zum Verwalten von Cache-Updates und zum Behandeln von Situationen, in denen die benötigten Daten noch nicht im Cache vorhanden sind.
Schreibmuster bestimmen, wie Ihre Anwendung mit dem Cache und Ihrer Datenbank interagiert. Sehen wir uns drei gängige Strategien an: Write-back , Write-through und Write-around . Jede dieser Strategien bietet einzigartige Vorteile und Nachteile:
Wie es funktioniert:
Ideal für: Schreibintensive Anwendungen, bei denen Geschwindigkeit entscheidend ist und gewisse Inkonsistenzen aus Leistungsgründen akzeptabel sind. Beispiele hierfür sind Metrik- und Analyseanwendungen.
Vorteile:
Nachteile:
Wie es funktioniert:
Vorteile:
Nachteile:
Mit Write-Around schreibt Ihre Anwendung Daten direkt in die Datenbank und umgeht dabei den Cache während des Schreibvorgangs. Um den Cache zu füllen, wird eine Strategie namens Cache-Aside-Muster verwendet:
Lese-Anforderung kommt an: Die Anwendung prüft den Cache.
Cache-Fehler: Wenn die Daten nicht im Cache gefunden werden, ruft die Anwendung sie aus der Datenbank ab und speichert sie dann zur späteren Verwendung im Cache.
Vorteile:
Nachteile:
Ein Cachefehler tritt auf, wenn die von Ihrer Anwendung benötigten Daten nicht im Cache gefunden werden. Hier sind zwei gängige Strategien, um dieses Problem anzugehen:
Die Anwendung überprüft den Cache.
Bei einem Fehler ruft es Daten aus der Datenbank ab und aktualisiert anschließend den Cache.
Wichtiger Punkt: Die Anwendung ist für die Verwaltung des Caches verantwortlich.
Wenn Sie ein Cache-Aside-Muster verwenden, verwaltet Ihre Anwendung den Cache. Dieser Ansatz wird am häufigsten verwendet, da er einfach ist und keine Entwicklung an anderen Stellen als der Anwendung erfordert.
Die Anwendung stellt eine Anforderung, ohne den Cache zu kennen.
Ein spezieller Mechanismus überprüft den Cache und ruft bei Bedarf Daten aus der Datenbank ab.
Der Cache wird transparent aktualisiert.
Read-Through-Muster verringern die Anwendungskomplexität, erhöhen jedoch die Infrastrukturkomplexität. Stattdessen können die Anwendungsressourcen auf die Middleware verlagert werden.
Insgesamt wird das Write-Around-Muster mit Cache-Aside aufgrund seiner einfachen Implementierung am häufigsten verwendet. Ich empfehle jedoch, auch das Write-Through-Muster einzuschließen, wenn Sie Daten haben, die unmittelbar nach dem Zwischenspeichern verwendet werden. Dies bietet einen leichten Vorteil bei der Leseleistung.
In diesem Abschnitt werden bewährte Methoden für die Verwendung eines Caches erläutert. Wenn Sie diese Methoden befolgen, stellen Sie sicher, dass Ihr Cache aktuelle Daten enthält und seinen Speicher effektiv verwaltet.
Stellen Sie sich vor, Sie haben Daten im Cache gespeichert und dann wird die Datenbank aktualisiert. Dies führt dazu, dass die Daten im Cache von der Datenbankversion abweichen. Wir nennen diese Art von Cachedaten „veraltet“. Ohne eine Cache-Invalidierungstechnik könnten Ihre zwischengespeicherten Daten nach Datenbankaktualisierungen veraltet bleiben. Um die Daten aktuell zu halten, können Sie die folgenden Techniken verwenden:
Cache-Ungültigkeit beim Update: Wenn Sie Daten in der Datenbank aktualisieren, aktualisieren Sie auch den entsprechenden Cache-Eintrag. Write-Through- und Write-Back-Muster handhaben dies von Natur aus, aber Write-Around/Cache-Aside erfordert das explizite Löschen der zwischengespeicherten Daten. Diese Strategie verhindert, dass Ihre Anwendung veraltete Daten abruft.
Time To Live (TTL): TTL ist eine Richtlinie, die Sie beim Speichern von Daten im Cache festlegen können. Mit TTL werden Daten nach einer bestimmten Zeit automatisch gelöscht. Dies hilft beim Löschen nicht verwendeter Daten und bietet eine Ausfallsicherung gegen veraltete Daten im Falle verpasster Ungültigkeitserklärungen.
Wenn Sie eine große Datenmenge zwischenspeichern, kann Ihr Cache-Speicher voll werden. Cache-Systeme verwenden normalerweise Speicher, der oft kleiner ist als Ihr primärer Datenbankspeicher. Wenn der Cache voll ist, muss er einige Daten löschen, um Platz zu schaffen. Cache-Ersetzungsrichtlinien bestimmen, welche Daten entfernt werden:
Least Recently Used (LRU): Diese allgemeine Richtlinie entfernt Daten, die am längsten nicht verwendet (gelesen oder geschrieben) wurden. LRU ist für die meisten realen Anwendungsfälle geeignet.
Least Frequently Used (LFU): Ähnlich wie LRU, aber mit Fokus auf Zugriffshäufigkeit. Neu geschriebene Daten können verworfen werden, also sollten Sie eine Aufwärmphase einplanen, während der Daten nicht gelöscht werden können.
Es gibt zwar noch andere Ersetzungsrichtlinien wie FIFO (First-In, First-Out), zufälliger Ersatz usw., diese sind jedoch weniger verbreitet.
Bevor Sie sich in die Cache-Implementierung stürzen, sollten Sie wissen, wann dies möglicherweise nicht die beste Lösung ist. Caching verbessert häufig die Geschwindigkeit und reduziert die Datenbanklast, ist jedoch möglicherweise nicht sinnvoll, wenn:
Geringer Datenverkehr: Wenn Ihre Anwendung nur wenig Datenverkehr hat und die Antwortzeit noch akzeptabel ist, benötigen Sie wahrscheinlich noch kein Caching. Das Hinzufügen eines Caches erhöht die Komplexität. Daher empfiehlt es sich, ihn zu implementieren, wenn Sie mit Leistungsengpässen konfrontiert sind oder mit einem deutlichen Anstieg des Datenverkehrs rechnen.
Ihr System ist schreibintensiv: Caching ist bei leseintensiven Anwendungen am vorteilhaftesten. Das bedeutet, dass Daten in Ihrer Datenbank selten aktualisiert werden oder zwischen den Aktualisierungen mehrmals gelesen werden. Wenn Ihre Anwendung ein hohes Schreibvolumen aufweist, kann Caching möglicherweise zusätzlichen Overhead verursachen und die Leistung verlangsamen.
In diesem Artikel haben wir die Grundlagen des Cachings und dessen effektive Nutzung behandelt. Hier ist eine Zusammenfassung der wichtigsten Punkte:
Bestätigen Sie den Bedarf: Stellen Sie sicher, dass Ihr System viele Lesevorgänge ausführt und die Latenzreduzierung benötigt, die das Caching bietet.
Wählen Sie Muster mit Bedacht aus: Wählen Sie Cache-Schreib- und Cache-Fehlermuster aus, die dazu passen, wie Ihre Anwendung Daten verwendet.
Aktualität der Daten: Implementieren Sie Strategien zur Cache-Ungültigkeitserklärung, um die Bereitstellung veralteter Daten zu verhindern.
Ersetzungsrichtlinie verwalten: Wählen Sie eine Cache-Ersetzungsrichtlinie (wie LRU), um Löschungen zu handhaben, wenn der Cache seine Kapazität erreicht.