Mit der Zeit wird verteiltes Caching immer beliebter, da es die Anwendungsleistung verbessert und Skalierbarkeit bietet. Und mit dem Bedarf an einer schnellen und skalierbaren Methode werden immer mehr Daten in den Cache zwischengespeichert. Je leistungsfähiger die Anwendung ist, desto größer ist die Anzahl der Client-Anwendungen. Es besteht jedoch eine hohe Wahrscheinlichkeit, dass Ihre Datenbank und der Cache nicht mehr synchron sind, wenn mehrere Clients Daten in und aus der Datenquelle platzieren und abrufen. Um diesem Problem entgegenzuwirken, verwenden die meisten Menschen eine Datenablauftechnik namens Time to Live (TTL) oder Absoluter Ablauf. Dieser Ablauf entfernt automatisch das angegebene Cache-Element nach der angegebenen Zeit. Obwohl er beliebt ist, ist dieser Mechanismus eine fundierte Vermutung darüber, wie lange die Daten im Cache unverändert bleiben.
Wenn Sie sicher sind, dass sich Ihre Daten in diesem Zeitraum wahrscheinlich nicht ändern werden, oder Ihre Daten nicht sehr sensibel sind, was bedeutet, dass Sie es sich leisten können, alte veraltete Daten aus dem Cache zu lesen, dann können Sie verwenden Ablauf. Aber wenn Ihre Daten geschäftssensibel sind und Sie es sich nicht leisten können, ungenaue Daten aus dem Cache zu lesen, dann werden Sie veraltete Daten viel kosten. In dieser Situation ist der Zugriff auf veraltete Daten ein Risiko, das Sie nicht eingehen sollten.
NCache Details Arten des Datenablaufs NCache Docs
Synchronisieren NCache mit SQL Server
Um zu vermeiden, dass die oben genannte Situation in Ihrer .NET-Anwendung auftritt, müssen Sie sicherstellen, dass Ihr Cache jederzeit mit der Datenbank synchron bleibt. Und genau zu diesem Zweck NCache bietet Ihnen eine Datenbank-Synchronisationsfunktion namens SQL-Abhängigkeit Dadurch können Sie Ihren Cache mit der SQL Server-Datenbank synchronisieren. Die SQL-Abhängigkeit verwendet Abfragebenachrichtigungen, um Ihren Cache mit der Datenbank zu synchronisieren, wenn Änderungen in den Datensätzen auftreten.
NCache Details SQL-Abhängigkeit NCache Docs
Abfragebenachrichtigungen in SQL Server
Abfragebenachrichtigungen sind eine Funktion von SQL Server, die alle Datenbankclients benachrichtigt, wenn sich ein Dataset in der Datenbank ändert. NCache Server verwendet dieses Feature, um ein SQL Server-Client zu werden und sich über SQL-Abhängigkeit bei SQL Server zu registrieren.
Auf diese Weise benachrichtigt SQL Server NCache wenn sich bestimmte Daten in der Datenbank ändern. Und NCache hält eine Zuordnung von zwischengespeicherten Elementen und den entsprechenden Datensätzen der Datenbank. Mit diesem, NCache kann das zwischengespeicherte Element ungültig machen, sodass eine neue Kopie aus der Datenbank abgerufen wird, wenn die Anwendung sie das nächste Mal benötigt.
NCache stellt Ihnen die SQL-Abhängigkeits-API über seine Client-API zur Verfügung. Sie müssen jedoch die folgenden Parameter über diese API bereitstellen, wenn Sie zwischengespeicherte Elemente hinzufügen NCache.
- Verbindungszeichenfolge: um eine Verbindung mit der Datenbank herzustellen.
- Befehlstext: um den von der Abhängigkeit verwendeten CommandText zu bestimmen.
NCache Details SQL-Abhängigkeit Richten Sie die SQL Server-Umgebung ein
Synchronisierung NCache mit SQL Server: Ein kurzes Beispiel
Angenommen, Sie haben ein .NET-basiertes Online-Shopping-System mit einer Reihe durchsuchbarer Artikel, auf die Hunderte von Clients gleichzeitig zugreifen. Das Einkaufsportal öffnet am Weihnachtstag mit 40 % Rabatt auf den gesamten Bestand. Der Anwendungsserver aktualisiert den Einheitspreis der Produkte in der Datenbank, während der Cache diese Änderung nicht wahrnimmt.
Wenn Clients auf Artikel aus dem Cache zugreifen, bleibt die ältere Kopie dieser Artikel ohne Rabatt verfügbar. Wenn Kunden nach Produkten suchen, erhalten sie die alten Einheitspreise zu Weihnachten – was dazu führt, dass die Kunden frustriert und unzufrieden mit dem Geschäft sind.
Aber wenn Sie die verwenden NCache Datenbanksynchronisierungsfunktion mit dem SQL-Server kann der Benutzer Benachrichtigungen aktivieren, um die Daten bei jedem Update mit der Datenbank zu synchronisieren. In diesem Fall hat die Anwendung dieses Datenintegritätsproblem nicht, da der Cache immer die richtigen Daten enthält.
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 |
// Creating connection string to get connected with database. string connectionString = "Server=SERVERNAME; Database=NORTHWIND; UserId=USERID; Password=PASSWORD;"; // Getting products from database. List products = FetchProductFromDB(); // Creating dictionary of CacheItems. Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>(); foreach(Product product in products) { string productKey = $"Product: {product.ProductID}"; // Creating an SQL dependency on the unit price of product. Whenever the Unitprice changes, the product is removed from the cache. string query = $"Select UnitPrice from dbo.Products where ProductID = {product.ProductID}"; // Creating dependency on all the products. SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query); CacheItem productItem = new CacheItem(product); // Adding Dependency to product item productItem.Dependency = dependency; } // Adding CacheItems in cache cache.Add(productKey, productItem); |
Der Grund, warum Sie die verwenden sollten NCache SqlCacheDependency Methode zum Synchronisieren von Daten mit dem SQL-Server ist einfach. Ihre Cache-Daten werden nie veraltet, und Sie können getrost alle Arten von Daten ablegen und abrufen, ohne dass es zu Datenintegritätsproblemen kommt.
NCache Details SqlCacheDependency NCache Docs
Cache-Element automatisch über ReadThru Provider neu laden
Anstatt ein zwischengespeichertes Element ungültig zu machen, müssen Sie Folgendes implementieren, wenn Sie möchten, dass der Cache es automatisch neu lädt, wenn sich die entsprechenden Daten in der Datenbank ändern: IReadThruProvider Schnittstelle in NCache. Jetzt, wann immer NCache erhält eine Aktualisierungsbenachrichtigung vom SQL Server, anstatt dieses Element aus dem Cache zu entfernen, NCache ruft Ihren ReadThru-Anbieter auf, um die aktualisierten Daten aus der Datenbank abzurufen.
Sie fügen die folgende Codezeile hinzu, bevor Sie Daten in den Cache einfügen, und NCache übernimmt die automatische Synchronisierung der Daten für Sie.
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add sql dependency to it CacheItem item = new CacheItem(product); item.Dependency = sqlDependency; // Resync if enabled, will automatically resync cache with SQL server item.ResyncOptions = new ResyncOptions(true); // Add cache item in the cache with SQL Dependency and Resync option enabled cache.Insert(key, item); |
NCache Details Datenquellenanbieter Read-Through NCache Docs
Parametrisierte Abfragen in SQL-Abhängigkeiten
Zu viele Änderungen in der Datenbank erfordern eine häufige Invalidierung von zwischengespeicherten Elementen. Für jede Dateninvalidierung muss eine SELECT-Abfrage bereitgestellt werden. Und das bedeutet, dass SQL Server diese SQL-Abfrage vor der Ausführung kompilieren muss. Dies führt zu Leistungseinbußen, da die Abfragekompilierung sehr lange dauert.
Um dieses Leistungsproblem zu beheben, NCache ermöglicht die Verwendung parametrisierter SQL-Abfragen, bei denen Sie Parameterwerte zur Laufzeit angeben und diese Werte sich bei jeder Ausführung ändern. Hier wird die SQL-Abfrage selbst bei der ersten Ausführung kompiliert und muss nicht mehr neu kompiliert werden, was viel Zeit spart und die Leistung verbessert.
Um parametrisierte Abfragen in Ihrer Anwendung zu verwenden, implementieren Sie die folgende Abfrage, anstatt eine normale Auswahlabfrage zu schreiben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Creating Param to be passed in stored procedure dictionary. SqlCmdParams paramProductID = new SqlCmdParams { Type = CmdParamsType.Int, Value = product.ProductID }; // Creating stored procedure params. Dictionary<string, SqlCmdParams> parameter = new Dictionary<string, SqlCmdParams>(); parameters.Add("@ProductID", paramProductID); CacheItem productItem = new CacheItem(product); /*Creating an SQL dependency on the unit price of the product. Whenever the unit price changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query, SqlCommandType.Text, parameters); // Adding Dependency to the product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Details SqlCacheDependency SqlCacheDependency
Auf gespeicherten Prozeduren basierende SQL-Abhängigkeit
Viele Organisationen ziehen es vor, alle von ihren Anwendungen verwendeten SQL-Abfragen in Form von gespeicherten Prozeduren in ihrer Datenbank zu speichern. Dies verbessert die Leistung, da alle diese gespeicherten Prozeduren vorkompiliert sind und viel schneller ausgeführt werden als dynamische SQL-Abfragen. Zweitens können sie alle SQL-Abfragen für den Datenbankzugriff an einem Ort aufbewahren und sind nicht in jeder Anwendung verstreut, was schwierig zu ändern ist, wenn sie ihre SQL-Abfragen aktualisieren möchten.
Für diese Organisationen NCache unterstützt eine auf gespeicherten Prozeduren basierende SQL-Abhängigkeit, bei der Sie anstelle einer dynamischen SQL-Abfrage oder sogar einer parametrisierten SQL-Abfrage einen Aufruf einer gespeicherten Prozedur angeben können.
Die folgende SQL-Abfrage erstellt eine Prozedur mit ProductID als Parameter. Diese gespeicherte Prozedur kann in Ihrer Anwendung verwendet werden, um den Cache mit der Datenbank zu synchronisieren.
1 2 3 4 |
create PROCEDURE sp_GetUnitPriceByProductID @ProductID int as Select UnitPrice from dbo.Products where ProductID = @ProductID; |
Um diese gespeicherte Prozedur in Ihrer .NET-Anwendung aufzurufen, verwenden Sie den folgenden Codeausschnitt.
1 2 3 4 5 6 7 8 9 10 11 |
// Specifying stored procedure, created in database. string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID"; /*Creating an SQL dependency on the unit price of product. Whenever the unitprice changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters); // Adding Dependency to product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Details Gespeicherte Prozeduren SQL-Abfrage
Zusammenfassung
Wenn du es nicht benutzt hast NCache als primäre Datenquelle für eine ASP.NET-basierte Anwendung, verwenden Sie sie jetzt als:
- NCache ist eine In-Memory-Lösung, die keine Client-Eingriffe benötigt, um Daten automatisch neu auszugleichen, was Ihre Anwendung extrem flexibel macht.
- Damit können Sie zur Laufzeit beliebig viele Server hinzufügen und erhalten so die am besten skalierbare Lösung für Ihre .NET-Anwendung.
Wenn Sie eine ASP.NET-Anwendung haben, aber die von Ihnen verwendete Datenbank keine Benachrichtigungen unterstützt, NCache bietet Ihnen eine Methode namens abfragebasierte Abhängigkeit.