Mit der schnellen Zunahme von Anwendungen mit hohem Datenverkehr ist Skalierbarkeit die Notwendigkeit für diese Ära. Aus diesem Grund haben verteilte Caching-Systeme ihren Weg in die Herzen und Seelen heutiger Anwendungen gefunden. NCache – der führende verteilte Cache für .NET-Anwendungen, bildet da keine Ausnahme.
Wenn wir allgemein ein Caching-System betrachten, wird es natürlich als volatil und nicht persistent angesehen, dass alle im Cache gespeicherten Daten nicht mehr verfügbar sind, wenn der Cache neu gestartet wird.
Angenommen, ein Online-E-Commerce-Shop mit Hunderten und Tausenden von Benutzertransaktionen pro Tag speichert alle seine Daten in einem verteilten Cache, was dazu führt, dass Benutzer sehr schnell auf diese Daten zugreifen müssen. Der E-Commerce-Shop möchte alle seine Daten in einem verteilten Cache speichern, der nicht flüchtig ist, und Daten auch dann behalten, wenn der Cache aufgrund unvorhergesehener Umstände abstürzt oder neu startet.
Wir haben eine Lösung, die verwendet NCachedie serverseitigen Bereitstellungen von , um Ihren Cache zu ändern und dauerhaft zu machen. Sie finden die Lösung auf GitHub als NCache Persistenter Cache. Diese Lösung verwendet Read-Thru- und Write-Thru-Anbieter, um das Verhalten des Caches als persistenten Cache zu ändern. Ein persistenter Cache ist keineswegs ein Ersatz für Ihre reguläre Datenbank, sondern lediglich eine Erweiterung, um sie schneller und zugänglicher zu machen. Es kann ohne zusätzlichen Code mit den beiden führenden Datenbanksystemen von NET, SQL und Cosmos DB, implementiert werden. Schauen wir uns das genauer an.
Die richtigen NCache's Features für einen persistenten Cache
NCache Persistenter Datenspeicher ermöglicht es Ihnen, Daten über längere Zeiträume zu speichern. Normalerweise werden Daten in einem dauerhaften Speicher mit einer vordefinierten Ablaufzeit gespeichert oder bis die Anwendung einen Löschbefehl sendet. Der Persistenzspeicher befindet sich außerhalb des verteilten Caches, und alle im Cache gespeicherten Daten werden automatisch im persistenten Speicher gespeichert, um verfügbar zu sein, wenn der Cache aufgrund seiner flüchtigen Natur gelöscht wird. Wenn sich keine angeforderten Daten im Cache befinden, ruft der Cache bei jeder von der Anwendung gestellten Leseanforderung automatisch den Eintrag aus dem dauerhaften Speicher ab, und es gehen keine Cache-Daten verloren. Dies ist in Abbildung 1 dargestellt:
NCache Persistent Store bietet Ihnen die folgenden serverseitigen Bereitstellungsfunktionen, um reibungslose und nahtlose Transaktionen sicherzustellen, wenn die im Cache gespeicherten Daten nicht verfügbar sind.
- Persistenter Startlader: Dieser Anbieter lädt bei jedem Start des Cache Daten aus dem persistenten Speicher in den Cache. Bei jedem Schreibvorgang im Cache wird der persistente Speicher aktualisiert und alle persistenten Daten werden bei jedem Neustart des Cache in den Cache geladen. Daher gehen die zwischengespeicherten Daten auch dann nicht verloren, wenn der gesamte Cache-Cluster aus irgendeinem Grund ausfällt und dann erneut startet.
- Persistenter Write-Through-Anbieter: Dieser Anbieter wird automatisch aufgerufen, wenn Sie etwas in den persistenten Cache schreiben. Er repliziert, was in den persistenten Speicher geschrieben wird, sodass er verfügbar bleibt, wenn der Cache neu gestartet wird. Es gibt zwei Optionen zum Konfigurieren dieses Anbieters – Write-Thru und Write-Behind. Diese ermöglichen es dem Benutzer, die Replikation im Hintergrund durchzuführen oder vor dem Schreibvorgang zu replizieren.
Mit der Write-Thru, bei jedem Schreibvorgang werden die Daten gleichzeitig im persistenten Speicher gespeichert und dann die Kontrolle an die Anwendung zurückgegeben.
Mit der Write-Behind, NCache stellt die Operation in die Warteschlange und führt sie im Hintergrund aus, wobei der Fluss an den Benutzer zurückgegeben wird, bevor die Datenbankoperationen ausgeführt werden. - Persistenter Read-Through-Anbieter: Dieser Anbieter wird aufgerufen, falls der Benutzer Daten benötigt, die nicht im Cache verfügbar sind. Cache-Cluster, der den Read-Through-Anbieter verwendet, ruft diese Daten aus dem dauerhaften Speicher ab und bewahrt sie im Cache auf.
Schnelles Beispiel für einen Persistenz-WriteThru-Anbieter
Sehen wir uns ein kurzes Beispiel an, wie Sie einen persistenten Cache mit verwenden können NCache. In diesem Beispiel fügen wir dem Cache mithilfe von ein Element hinzu WriteThru-Anbieter. Wenn der Benutzer das Element zum Cache hinzufügt, wird der mit dem Cache-Server bereitgestellte Write-Through-Anbieter aufgerufen und das Element gleichzeitig im persistenten Datenspeicher gespeichert. Falls nun der Cache heruntergefahren oder das Element aus dem Cache entfernt wird, ohne Write-Thru zu verwenden, wird das Element aus dem Cache entfernt, aber nicht aus dem persistenten Speicher; Daten gehen nicht verloren, da sie sich im dauerhaften Speicher befinden. Wenn dieses Element benötigt wird, wird es aus dem persistenten Speicher in den Cache geholt.
Hier ist der grundlegende Code, der die Schnittstelle des Write-Thru-Anbieters zeigt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PersistenceWriteThruProvider : ProviderBase, IWriteThruProvider { public OperationResult WriteToDataSource(WriteOperation operation) { OperationResult operationResults = new OperationResult(operation, OperationResult.Status.Success); switch (operation.OperationType) { case WriteOperationType.Add: var items = new Dictionary<string, ProviderItemBase>(); items.Add(operation.Key, operation.ProviderItem); _persistenceProvider.Add(items); break; // Update and remove cases are similar and need to be handled } return operationResults; } } |
So können Sie ein Element mit aktiviertem Write-Thru in den Cache einfügen, damit es Ihre bereitgestellte Write-Through-Implementierung verwendet:
1 2 3 4 5 6 |
// Enable write through for the cacheItem created var writeThruOptions = new WriteThruOptions(); writeThruOptions.Mode = WriteMode.WriteThru; // Add the item in the cache with WriteThru enabled CacheItemVersion itemVersion = cache.Insert(key, cacheItem, writeThruOptions); |
NCache Details Write-Through-Caching-Dokumente
Persistenz-ReadThru-Anbieter
Angenommen, die Anwendung möchte einige Daten aus dem Cache. Diese Daten wurden zuvor im Cache gespeichert, sind aber aus irgendeinem Grund nicht mehr verfügbar. Wenn der Benutzer versucht, auf solche Daten zuzugreifen, würde der Cache normalerweise einen Nullwert zurückgeben, da der Cache nicht die erforderlichen Daten enthält und zusätzlicher Code mit Abfragen geschrieben werden müsste, um Daten aus der Datenbank abzurufen. Dadurch wird die Anwendungslogik zu komplex. Zuerst wird der Cache nach dem gewünschten Artikel durchsucht und falls dieser nicht vorhanden ist, die Datenbank überprüft und anschließend die Daten geladen.
Wenn wir die verwenden NCache Persistenzdatenspeicher, würden die aus dem Cache entfernten Daten weiterhin im persistenten Datenspeicher gespeichert und der Cache würde die aufrufen ReadThruProvider Implementierung und die Daten würden im Cache aufgerufen und an den Benutzer zurückgegeben. So erhalten Sie jetzt die gewünschten Daten, auch wenn sie aus dem Cache gelöscht wurden, ohne dass zusätzlicher Code erforderlich ist.
Hier ist der grundlegende Code, der die Schnittstelle des Read-Thru-Anbieters zeigt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class PersistenceReadThruProvider : ProviderBase, IReadThruProvider { public ProviderCacheItem LoadFromSource(string key) { return (ProviderCacheItem)(_persistenceProvider.Get(new string[] { key })[key]); } public ProviderDataTypeItem LoadDataTypeFromSource(string key, DistributedDataType dataType) { ... } public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection keys) { ... } } |
Sie können Daten aus dem Cache mit aktiviertem Read-Through abrufen. Wenn sie also nicht im Cache vorhanden sind, werden sie gemäß Ihrer Implementierung des Read-Through-Anbieters aus der Datenquelle abgerufen.
1 2 3 4 5 6 |
// Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache Details Read-Through-Caching-Dokumente
Persistenz Startup Loader
Wie bereits erwähnt, ist ein Cache flüchtig und alle Daten in einem Cache werden gelöscht, sobald der Cache deaktiviert wird. Beim Neustart ist der Cache leer und muss neu aufgefüllt werden. Das Laden jedes Eintrags bei Bedarf mithilfe des Read-Thru-Anbieters verlangsamt den Prozess des Abrufens von Daten und Vorgängen. Was wäre, wenn wir alle Daten beim Cache-Start in den Cache laden könnten? Mit dem Cache-Loader Schnittstelle zur Verfügung gestellt von NCache, werden alle Daten aus dem persistenten Speicher beim Start in den Cache dupliziert, sodass sie für die Verwendung durch die Anwendung verfügbar sind.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class PersistenceStartupLoader : ProviderBase, ICacheLoader { public LoaderResult LoadNext(object userContext) { if (persistentItems == null) persistentItems = _persistenceProvider.GetAll(); LoaderResult result = new LoaderResult(); foreach (var item in persistentItems) { result.Data.Add(new KeyValuePair<string, ProviderItemBase>(item.Key, item.Value)); } return result; } } |
NCache Details Cache Startup Loader-Dokumente
Löschen Sie Daten aus dem persistenten Datenspeicher
In der von mir erstellten Lösung ist der persistente Speicher mit Ihrem Cache verknüpft, sodass alle im Cache vorgenommenen Änderungen auch im persistenten Speicher vorgenommen werden. Beispielsweise wird ein Datenelement sowohl im Cache als auch in einem dauerhaften Speicher gespeichert. Wenn der Benutzer es aus dem Cache löscht, wird es mit Hilfe des Write-Through-Anbieters auch aus dem persistenten Speicher gelöscht. Dadurch wird sichergestellt, dass der Hauptcache mit dem persistenten Datenspeicher synchron bleibt.
Dies ist jedoch völlig flexibel, Sie können dies ändern und Elemente im dauerhaften Speicher speichern lassen, selbst wenn die Anwendung einen Löschbefehl sendet.
Warum NCache?
NCache ist ein schneller und skalierbarer marktführender verteilter In-Memory-Cache, der zu 100 % für .NET entwickelt wurde / .NET Core Anwendungen. Es bietet serverseitige Funktionen zur Unterstützung der Cache-Persistenz und es gibt viele Konfigurationen, die vorgenommen werden können, um die Cache-Persistenz nach Bedarf zu verwenden. Daten können aus dem Cache in jeder Datenbank unserer Wahl gespeichert werden. NCache speichert Anwendungsdaten und beseitigt Leistungsengpässe im Zusammenhang mit Ihrer Datenspeicherung und Ihren Datenbanken. Es ermöglicht Ihnen, Ihre Daten für längere Zeit im Cache zu speichern, um sicherzustellen, dass Ihre Daten verfügbar sind, wenn Sie sie benötigen. NCache Persistenzdatenspeicher macht es überflüssig, bei jedem Cache-Start Daten aus der Datenbank in den Cache zu verschieben. Dies stellt die Hochverfügbarkeit Ihrer Daten sicher, ohne dass zusätzlicher Code geschrieben werden muss!
Gehen Sie zu NCache Docs, um mehr darüber zu erfahren, wie Sie implementieren und verwenden können NCache persistenter Datenspeicher zusammen mit Ihrem verteilten Cache.