Speicher-Caching (oft einfach als Caching bezeichnet) ist eine Technik, bei der Computeranwendungen vorübergehend Daten im Hauptspeicher eines Computers (d. H. Direktzugriffsspeicher oder RAM) speichern, um ein schnelles Abrufen dieser Daten zu ermöglichen. Der RAM, der für den temporären Speicher verwendet wird, wird als Cache bezeichnet. Da der Zugriff auf den Arbeitsspeicher erheblich schneller ist als der Zugriff auf andere Medien wie Festplatten oder Netzwerke, hilft das Zwischenspeichern, Anwendungen aufgrund des schnelleren Zugriffs auf Daten schneller auszuführen. Caching ist besonders effizient, wenn die Anwendung ein gemeinsames Muster aufweist, in dem sie wiederholt auf Daten zugreift, auf die zuvor zugegriffen wurde. Das Zwischenspeichern ist auch nützlich, um Datenberechnungen zu speichern, deren Berechnung ansonsten zeitaufwändig ist. Durch die Speicherung der Berechnungen in einem Cache spart das System Zeit, indem die Wiederholung der Berechnung vermieden wird.
Wie funktioniert das Speicher-Caching?
Speicher-Caching funktioniert, indem zuerst ein Teil des Arbeitsspeichers beiseite gelegt wird, der als Cache verwendet werden soll. Wenn eine Anwendung versucht, Daten zu lesen, normalerweise aus einem Datenspeichersystem wie einer Datenbank, prüft sie, ob der gewünschte Datensatz bereits im Cache vorhanden ist. Wenn dies der Fall ist, liest die Anwendung die Daten aus dem Cache, wodurch der langsamere Zugriff auf die Datenbank entfällt. Wenn sich der gewünschte Datensatz nicht im Cache befindet, liest die Anwendung den Datensatz aus der Quelle. Wenn diese Daten abgerufen werden, werden die Daten auch in den Cache geschrieben, sodass die Anwendung sie schnell aus dem Cache abrufen kann, wenn sie dieselben Daten in Zukunft benötigt.
Da der Cache begrenzt ist, müssen eventuell einige Daten, die sich bereits im Cache befinden, entfernt werden, um Platz für neue Daten zu schaffen, auf die die Anwendung zuletzt zugegriffen hat. Dies bedeutet, dass das Caching-System eine Strategie benötigt, welche Datensätze entfernt werden müssen, um Platz zu schaffen. Die Strategie hängt von der Art der Datenzugriffe der Anwendung ab und versucht im Allgemeinen, Datensätze zu entfernen, auf die voraussichtlich nicht bald wieder zugegriffen wird. Beispielsweise entfernt eine LRU-Strategie (Least-Recently-Used) den Datensatz, dessen letzter Zugriff vor einem anderen Datensatz im Cache erfolgte. Die Annahme hier ist, dass, wenn es lange her ist, seit auf den Datensatz zugegriffen wurde, wahrscheinlich nicht bald wieder darauf zugegriffen wird. Oder anders ausgedrückt, die Datensätze, die in letzter Zeit am häufigsten verwendet wurden, werden wahrscheinlich bald wieder verwendet. Eine LFU-Strategie (Least-Frequently-Used) besteht darin, die Anzahl der Zugriffe jedes Datensatzes im Cache zu verfolgen und den Datensatz mit der geringsten Anzahl von Zugriffen zu entfernen. Hier wird davon ausgegangen, dass ein selten verwendeter Datensatz wahrscheinlich nicht bald wieder verwendet wird.
Die Herausforderung bei Caches besteht darin, „Cache Misses“ zu minimieren, d.h., Leseversuche der Anwendung für Datensätze, die sich nicht im Cache befinden. Wenn Sie zu viele Fehler haben, nimmt die Effizienz Ihres Caches ab. Eine Anwendung, die nur neue Daten liest, würde nicht von einem Cache profitieren und tatsächlich eine geringere Leistung aufweisen, da der Cache zusätzlich überprüft und der gewünschte Datensatz nicht gefunden wird. Eine Möglichkeit, diese Herausforderung zu verringern, besteht darin, größere Caches zu nutzen. Dies ist auf einem einzelnen Computer oft nicht praktikabel, weshalb verteilte Caches eine beliebte Wahl sind, um Anwendungen zu beschleunigen, die auf größere Datensätze zugreifen müssen. Ein verteilter Cache bündelt den Arbeitsspeicher mehrerer Computer, die in einem Cluster verbunden sind, sodass Sie einen größeren Cache erstellen können, der durch Hinzufügen weiterer Computer zum Cluster weiter wachsen kann. Technologien wie Hazelcast IMDG können als verteilter Cluster verwendet werden, um Großanwendungen zu beschleunigen.
Eine weitere Herausforderung bei Caches ist das Risiko, „veraltete“ Daten zu lesen, bei denen die Daten im Cache nicht die neuesten Daten in der zugrunde liegenden Quelle widerspiegeln. Oft ist dieses Risiko ein akzeptabler Kompromiss für die Anwendungsleistung. In Fällen, in denen dies nicht der Fall ist, liegt es an der Anwendung, die die zugrunde liegende Datenquelle aktualisiert, den betreffenden Datensatz im Cache zu aktualisieren.
Anwendungsbeispiele
Ein breiter Anwendungsfall für Speicher-Caching ist die Beschleunigung von Datenbankanwendungen, insbesondere von Anwendungen, die viele Datenbanklesevorgänge ausführen. Durch Ersetzen eines Teils der Datenbanklesevorgänge durch Lesevorgänge aus dem Cache können Anwendungen die Latenz beseitigen, die durch häufige Datenbankzugriffe entsteht. Dieser Anwendungsfall tritt normalerweise in Umgebungen auf, in denen ein hohes Volumen an Datenzugriffen auftritt, z. B. auf einer Website mit hohem Datenverkehr, die dynamischen Inhalt aus einer Datenbank enthält.
Ein weiterer Anwendungsfall betrifft die Abfragebeschleunigung, bei der die Ergebnisse einer komplexen Abfrage an eine Datenbank im Cache gespeichert werden. Komplexe Abfragen, die Vorgänge wie Gruppierung und Reihenfolge ausführen, können viel Zeit in Anspruch nehmen. Wenn Abfragen wiederholt ausgeführt werden, wie dies in einem Business Intelligence (BI) -Dashboard der Fall ist, auf das viele Benutzer zugreifen, würde das Speichern der Ergebnisse in einem Cache eine höhere Reaktionsfähigkeit in diesen Dashboards ermöglichen.
Verwandte Themen
JCache / Java-Cache
Cache-Cache
Ruhezustand Second-Level-Cache
Weiterführende Literatur
Caching-Anwendungsfall
Datenbank-Caching
Hazelcast Cloud
Caching gemacht Bootiful: Frühling Cache + Hazelcast