Heutzutage nutzen Webanwendungen zunehmend verteilten Cache, um die Leistung und Skalierbarkeit zu steigern, indem sie häufig verwendete Daten zwischenspeichern und so teure Datenbankfahrten reduzieren. Der verteilte Cache erstreckt sich über mehrere Cache-Server und synchronisiert diese, um eine lineare Skalierung zu ermöglichen. Ein guter verteilter Cache verfügt normalerweise über eine Cache-Abhängigkeitsfunktion, mit der Sie zwischengespeicherte Elemente verfallen lassen, wenn sich etwas ändert, von dem sie abhängen. Eine Cache-Abhängigkeit kann schlüsselbasiert, dateibasiert oder datenbankbasiert sein. Im Wesentlichen können Sie also angeben, dass ein zwischengespeichertes Element von einem anderen Element im Cache (schlüsselbasiert), einer Datei im Dateisystem (dateibasiert) oder einer Zeile oder einem Datensatz in einer SQL Server-Datenbank (Datenbank) abhängig ist -basierend). Und wenn sich Daten in einer dieser Quellen ändern, wird Ihr zwischengespeichertes Element automatisch aus dem Cache entfernt, da die „Abhängigkeit abgelaufen“ ist. Dadurch können Sie Ihre zwischengespeicherten Daten immer aktuell und korrekt halten.
Das ist alles schön und gut, aber was ist, wenn Sie möchten, dass Ihre zwischengespeicherten Elemente von Daten in anderen als den oben genannten Datenquellen abhängig sind? Beispielsweise verfügen Sie möglicherweise über einen RSS-Feed (Rich Site Summary), der Sie über Datenänderungen informiert. Und Sie haben Ihr eigenes Programm zum Lesen dieses Feeds und möchten bestimmte zwischengespeicherte Elemente basierend auf den Datenänderungen, die Sie im RSS-Feed sehen, ablaufen lassen. Es gibt viele andere ähnliche Situationen, in denen die Datenquelle „benutzerdefiniert“ ist. Um diese Situationen zu bewältigen, sollte Ihnen ein guter verteilter Cache die Flexibilität bieten, Ihre eigene benutzerdefinierte Cache-Abhängigkeit für Ihre zwischengespeicherten Elemente zu implementieren, damit diese ablaufen können, wenn sich Daten in Ihrer benutzerdefinierten Datenquelle ändern.
NCache bietet eine solche Benutzerdefinierte Cache-Abhängigkeit -Funktion NCache ist ein leistungsstarker verteilter Cache für alle Arten von .NET-Anwendungen. Und, NCache ermöglicht Ihnen die Implementierung Ihrer eigenen benutzerdefinierten Abhängigkeiten. Lassen Sie mich zeigen, wie einfach Sie eine benutzerdefinierte Abhängigkeit implementieren können NCache unter. Hier sind die Schritte, die Sie unternehmen müssen:
- Verwendung hinzufügen Alachisoft.NCache.Runtime.Dependencies; Verweis auf Ihre benutzerdefinierte Abhängigkeitsimplementierung.
- NCache stellt eine erweiterbare abstrakte Klasse mit dem Namen ExtensibleDependency bereit, die die Basisklasse aller Abhängigkeiten ist. Sie müssen lediglich Ihre benutzerdefinierte Abhängigkeitsklasse von ExtensibleDependency erben und dann einfach deren HasChanged-Eigenschaft überschreiben. Wenn diese Eigenschaft „true“ zurückgibt, wird das vom Element abhängige Element aus dem Cache gelöscht.
Hier ist ein vollständiges Beispiel einer benutzerdefinierten Abhängigkeitsimplementierung, bei der eine Abhängigkeitsänderung ausgelöst wird, wenn die verfügbaren Einheiten eines bestimmten Produkts weniger als 100 betragen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using Alachisoft.NCache.Runtime.Dependencies; [Serializable] public class CustomDependency : ExtensibleDependency { private string _connString; private int _productID; public override bool Initialize(){ return false; } public CustomDependency(int productID, string connStr) { _connString = connStr; _productID = productID; } internal bool DetermineExpiration() { if (GetAvailableUnits(_productID) < 100) return true; return false; } internal int GetAvailableUnits(int productID) { OleDbDataReader reader=null; OleDbConnection connection= new OleDbConnection(_connString); connection.Open(); int availableUnits=-1; try { OleDbCommand cmd = connection.CreateCommand(); cmd.CommandText = String.Format(CultureInfo.InvariantCulture, "Select UnitsInStock From Products" + " where ProductID = {0}", productID); reader = cmd.ExecuteReader(); if (reader.Read()) { availableUnits = Convert.ToInt32(reader["UnitsInStock"].ToString()); } reader.Close(); return availableUnits; } catch (Exception) { return availableUnits; } } public override bool HasChanged { get { return DetermineExpiration(); } } } |
- Sobald Sie Ihre benutzerdefinierte Abhängigkeit implementiert und mit bereitgestellt haben NCache Für den Dienst müssen Sie diese Abhängigkeit lediglich mit abhängigen Cache-Elementen in Ihrer Anwendung registrieren, wo immer dies erforderlich ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Alachisoft.NCache.Web.Caching; //add namespace //Add following code in your application Cache _cache = NCache.InitializeCache("myCache"); string connString = "Provider=SQLOLEDB;Data Source=localhost; User ID=sa;password=;Initial Catalog=Northwind"; CustomDependency hint = new CustomDependency(123, connString); _cache.Add("Product:1001", "Value", new CacheDependency(hint), Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10), Alachisoft.NCache.Runtime.CacheItemPriority.Default); |
Wenn sich nun Daten in Ihrer benutzerdefinierten Datenquelle ändern, NCache Läuft die abhängigen zwischengespeicherten Elemente automatisch aus dem Cache ab. NCache ist für die Ausführung Ihres benutzerdefinierten Abhängigkeitscodes verantwortlich, sodass Sie sich nicht darum kümmern müssen, Ihr eigenes separates Programm zu implementieren und es in einem zuverlässigen Prozess zu hosten. Probieren Sie es für Ihre anwendungsspezifischen Szenarien aus.