Angesichts des rasanten Wachstums von Webanwendungen mit hohem Transaktionsvolumen, serviceorientierter Architektur (SOA), Grid-Computing und anderen Serveranwendungen stößt die traditionelle Datenspeicherung oft an ihre Grenzen. Der Grund dafür ist, dass Datenspeichersysteme nicht so einfach skalieren können wie Anwendungsarchitekturen, die durch Hinzufügen weiterer Server erweitert werden können. Dieser Artikel erläutert Caching-Strategien, die in verteilten Systemen eingesetzt werden, anhand von Beispielen aus … NCache.
In solchen Situationen bietet verteilter In-Memory-Cache eine hervorragende Lösung für Datenspeicherengpässe. Er umfasst mehrere Server in einem Cluster, um deren Speicher zu bündeln und den Cache über alle Knoten hinweg synchron zu halten. Dieser Cluster lässt sich, genau wie die Anwendungsserver, unbegrenzt skalieren. Dies reduziert die Belastung des zugrunde liegenden Datenspeichers und beseitigt ihn als Skalierbarkeitsengpass.
Es gibt zwei Hauptmethoden, wie Benutzer einen verteilten Cache verwenden:
| Funktion | Cache-Aside | Durchlesen | Durchschreiben | Write-Behind |
|---|---|---|---|---|
| Hauptverantwortung | Die Anwendung verwaltet die Datenbankinteraktion. | Der Cache verwaltet die Datenbanklesevorgänge. | Der Cache verwaltet die Datenbankschreibvorgänge (Synchronisierung). | Der Cache verwaltet die Datenbankschreibvorgänge (asynchron). |
| Codekomplexität | Hoch (DB-Logik in der App) | Niedrig (DB-Logik im Cache-Anbieter) | Niedrig (DB-Logik im Cache-Anbieter) | Niedrig (DB-Logik im Cache-Anbieter) |
| Lesen Sie Skalierbarkeit | Mäßig (Risiko einer "Donnerherde") | Hoch (Anfragen werden im Cache zusammengefasst) | N / A | N / A |
| Leistung schreiben | Langsamer (App wartet auf Datenbankzugriff) | N / A | Langsamer (App wartet auf Datenbankzugriff) | Am schnellsten (die App wartet nicht auf die Datenbank) |
| Datenkonsistenz | Hoch | Hoch | Hoch | Eventuell (Kurze Verzögerung vor der Datenbankaktualisierung) |
Cache-Aside ist eine sehr leistungsfähige Technik und ermöglicht Ihnen, komplexe Datenbankabfragen mit Joins und verschachtelten Abfragen durchzuführen und Daten beliebig zu manipulieren. Trotzdem Durchlesen / Durchschreiben hat verschiedene Vorteile gegenüber Cache-Aside, wie unten erwähnt:
Read-Through/Write-Through ist nicht für den gesamten Datenzugriff in Ihrer Anwendung vorgesehen. Es eignet sich am besten für Situationen, in denen Sie entweder einzelne Zeilen aus der Datenbank lesen oder Daten lesen, die direkt einem einzelnen Cache-Element zugeordnet werden können. Es eignet sich auch ideal für Referenzdaten, die für häufige Lesevorgänge im Cache gespeichert werden sollen, auch wenn sich diese Daten regelmäßig ändern.
Ein Read-Through-Anbieter in NCache ist eine benutzerdefinierte Klasse IReadThruProvider in .NET, das Daten aus der Quelle (z. B. SQL Server) abruft, wenn sie nicht im Cache gefunden werden. NCache ruft LoadFromSource automatisch auf. Um es zu verwenden, implementieren Sie den Anbieter, stellen Sie ihn mit dem NCache Management Center or Befehlszeilentool und ermöglichen es in den Cache-Einstellungen.
using System.Collections;
using Alachisoft.NCache.Runtime.DatasourceProviders;
public class SampleReadThruProvider : IReadThruProvider
{
public void Init(IDictionary parameters, string cacheId)
{
// Initialize resources if needed
}
// Modern "Expression-bodied member" for conciseness
public ProviderCacheItem LoadFromSource(string key) =>
new(Database.GetData(key));
// Using LINQ instead of a foreach loop for cleaner bulk loading
public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection<string> keys)
{
return keys.ToDictionary(
key => key,
key => new ProviderCacheItem(Database.GetData(key))
);
}
public ProviderDataTypeItem<IEnumerable> LoadDataTypeFromSource(string key, DistributedDataType dataType)
{
// "Switch Expression" with "Collection Expressions"
return dataType switch
{
DistributedDataType.List => new([Database.GetData(key)]),
DistributedDataType.Dictionary => new(new Dictionary<string, object>
{
[key] = Database.GetData(key)
}),
DistributedDataType.Counter => new(1000),
_ => null! // null-forgiving operator if nullable context is enabled
};
}
public void Dispose()
{
// Clean up resources if needed
}
}
Init() führt bestimmte Ressourcenzuweisungsaufgaben aus, z. B. das Herstellen von Verbindungen zur Hauptdatenquelle, während Dispose() soll alle diese Zuweisungen zurücksetzen.
Ein Write-Through-Anbieter in NCache ist eine benutzerdefinierte Klasse, die implementiert IWriteThruProvider um Cache-Updates (Hinzufügen, Aktualisieren, Entfernen) bei jeder Cache-Aktualisierung direkt in der Datenbank zu speichern.
Um es zu verwenden, implementieren Sie die Schnittstelle und stellen Sie sie mithilfe des Anbieters in bereit NCache Management Center und ermöglichen es in der Cache-Konfiguration.
using System.Collections;
using Alachisoft.NCache.Runtime.DatasourceProviders;
public class SampleWriteThruProvider : IWriteThruProvider
{
public void Init(IDictionary parameters, string cacheId)
{
// Initialize resources if needed
}
public void Dispose()
{
// Clean up resources if needed
}
public OperationResult WriteToDataSource(WriteOperation operation)
{
var product = operation.ProviderItem.GetValue<Product>();
// Standard switch is still best for side-effects (void actions)
switch (operation.OperationType)
{
case WriteOperationType.Add:
// Database.Add(product);
break;
case WriteOperationType.Update:
// Database.Update(product);
break;
case WriteOperationType.Delete:
// Database.Delete(product);
break;
}
// Target-typed "new" infers the class type automatically
return new(operation, OperationResult.Status.Success);
}
// Modern "Expression-bodied member" using LINQ projection
public ICollection<OperationResult> WriteToDataSource(ICollection<WriteOperation> operations) =<
operations.Select(WriteToDataSource).ToList();
// Handling Data Structures with LINQ
public ICollection<OperationResult> WriteToDataSource(ICollection<DataTypeWriteOperation> operations) =>
operations.Select(op =>
new OperationResult(op, OperationResult.Status.Success)
).ToList();
}
© Copyright Alachisoft 2002 - Alle Rechte vorbehalten NCache ist eine eingetragene Marke der Diyatech Corp.