Verteiltes Caching ist zu einer beliebten Methode zur Verbesserung der Leistung und Skalierbarkeit von .NET-Anwendungen geworden. Aus diesem Grund speichern Entwickler immer mehr Daten im verteilten Cache. Damit einher gehen jedoch einige Herausforderungen. Eine wichtige Herausforderung besteht darin, sicherzustellen, dass die Daten im Cache immer mit der Datenbank synchronisiert sind. Dies liegt daran, dass der Cache eine Kopie der Daten aufbewahrt, die bereits in der Datenbank vorhanden sind.
Wenn Sie mehrere Anwendungen haben, die dieselben Daten in der Datenbank aktualisieren, aber nicht alle Zugriff auf den verteilten Cache haben, werden Sie am Ende in eine Situation geraten, in der die Daten im Cache älter sind und sich von ihrem Gegenstück in der Datenbank unterscheiden. Und während dies für einige Referenzdatentypen in Ordnung sein kann, ist es für Transaktionsdaten definitiv nicht akzeptabel. Referenzdaten werden häufig gelesen, aber nicht sehr häufig geändert (z. B. Produktkatalog), während Transaktionsdaten häufig gelesen und geändert werden (z. B. Kunden- oder Kontodaten).
NCache Details Cache-Abhängigkeitsdokumente NCache Docs
Wie stellen Sie sicher, dass der verteilte Cache mit der Datenbank synchronisiert bleibt?
Die Antwort ist SqlCacheDependency
. Es ist Teil von ASP.NET Cache (System.Web.Caching) und ermöglicht es Ihnen, ein Dataset in der Datenbank mit einer SQL-Anweisung anzugeben und dann .NET-Ereignisbenachrichtigungen von SQL Server 2005/2008 zu erhalten, wenn Ihr Dataset in der Datenbank geändert wird .
NCache intern eingebaut hat SqlCacheDependency
zwecks Cache mit SQL Server 2005/2008 oder Oracle-Datenbank synchronisieren. Für dich, NCache stellt eine ähnliche Schnittstelle namens SqlDependency bereit, mit der Sie eine SQL-Anweisung angeben können, die eine oder mehrere Zeilen in einer bestimmten Tabelle darstellt, die Ihr zwischengespeichertes Element bilden. NCache dann intern verwendet SqlCacheDependency
um eine Verknüpfung mit der Datenbank gegen diese Zeilen herzustellen.
Wenn also Ihre Daten in der Datenbank von einer Ihrer Anwendungen aktualisiert werden, löst SQL Server eine .NET-Ereignisbenachrichtigung aus, die NCache fängt und entfernt das entsprechende Element aus dem verteilten Cache. Dadurch wird das Problem der Dateninkonsistenz behoben, dass zwei verschiedene Kopien derselben Daten vorhanden sind. Dies liegt daran, dass Ihre Anwendung beim nächsten Mal dieselben Daten nicht im Cache findet und gezwungen ist, die neueste Kopie aus der Datenbank abzurufen, die sie dann ebenfalls zwischenspeichert. Diesen Weg, NCache stellt sicher, dass die Daten im Cache immer konsistent mit den Daten in der Datenbank sind.
Hier ist ein Quellcodebeispiel für die Verwendung von SqlDependency of NCache die intern verwendet SqlCacheDependency
:
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 |
public class Program { // A standard Load method that loads a single row from database public Customer LoadCustomer(Customer cust) { String key = "Customer:CustomerID:" + cust.CustomerID; Customer cust2 = (Customer)NCache.Cache.Get(key); if (cust2 != null) return cust2; CustomerFactory custFactory = new CustomerFactory(); // Load a single customer from the database // SELECT * FROM Customers WHERE CustomerID = 'ALFKI' custFactory.Load(cust); // Create a SqlCacheDependency for this item CacheItem item = new CacheItem(cust); item.Dependency = SqlDependencyFactory(connectionString, "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'"); // Store item in the cache along with SqlCacheDependency NCache.Cache.Insert(key, item); return cust; } // A query method public List<Customer> FindCustomers(String city) { String key = "List<Customer>:City:" + city; List<Customer> custList = (List<Customer>)NCache.Cache.Get(key); if (custList != null) return custList; CustomerFactory custFactory = new CustomerFactory(); // Load a list of customers from database based on a criteria // SELECT * FROM Customers WHERE City = 'San Francisco' custList = custFactory.FindByCity(city); // Create a SqlCacheDependency for this list of customers CacheItem item = new CacheItem(custList); item.Dependency = SqlDependencyFactory.(connectionString, "SELECT CustomerID FROM Customers WHERE City = '" + city + "'"); // Store list of customers in the cache along with SqlCacheDependency NCache.Cache.Insert (key, item); return custList; } } |
Cache-Abhängigkeit von SQL Oracle DB-Cache-Abhängigkeit Benutzerdefinierte Cache-Abhängigkeit
Zusammenfassend lässt sich sagen, dass die SqlDependency-Funktion von NCache ermöglicht es Ihnen, den Cache mit der Datenbank zu synchronisieren und die Datenintegrität aufrechtzuerhalten. Sie können jetzt mit dem Caching aller Daten beginnen, ohne befürchten zu müssen, veraltete Daten aus dem Cache zu verwenden. Und je mehr Daten Sie zwischenspeichern, desto besser wird natürlich die Leistung und Skalierbarkeit Ihrer Anwendung.
Laden Sie also eine voll funktionsfähige 60-Tage-Testversion von herunter NCache Enterprise und probiere es selbst aus.