ASP.NET-Webanwendungen, .NET-Webdienstanwendungen und andere .NET-Serveranwendungen müssen extreme Transaktionslasten bewältigen, ohne langsamer zu werden. Obwohl ihre Anwendungsschicht linear skaliert, skaliert die Datenspeicher- und Datenbankschicht nicht und wird daher zu einem Engpass. Dadurch kann die gesamte Anwendung nicht skaliert werden.
Ursprünglich waren einfache In-Memory-verteilte Schlüsselwertspeicher wie Memcached und später Redis wurde auf Unix/Linux-Plattformen eingeführt, um dieses Skalierbarkeitsproblem zu lösen. Sie wurden schnell sehr beliebt, hauptsächlich weil sie genau wie die Anwendungsebenen eine lineare Skalierbarkeit boten und den Datenbankengpass beseitigten
NCache Details NCache Docs NCache Client-APIs
Einschränkungen in Key Value Stores
Aber trotz ihrer Popularität waren diese Lösungen sehr einfach, von grundlegender Natur und lösten viele Probleme nicht wirklich, denen reale Anwendungen gegenüberstanden. Zu den Bereichen, in denen diese Lösungen sehr schwach waren, gehörten:
- Mangelnde Hochverfügbarkeit
- Mangel an intelligenten Möglichkeiten, den Cache frisch zu halten
- Fehlende SQL-Abfrage
- Fehlender serverseitiger Caching-Code (z. B. Read-through)
Beispielsweise war die Hochverfügbarkeit so schlecht Memcached dass Dritte damit begonnen haben, hochverfügbare „Fix-Ins“ dafür zu entwickeln. Die zugrunde liegende Architektur war jedoch nicht auf Hochverfügbarkeit ausgelegt und daher blieben diese Lösungen ihrer Natur nach recht begrenzt. Redis hatte die gleichen Verfügbarkeitsprobleme, überarbeitete jedoch später die Architektur seines Produkts, um einige Hochverfügbarkeitsfunktionen wie Datenreplikation und Failover-Unterstützung zu integrieren. Aber es gibt immer noch große Lücken in allen Key-Value-Store-Produkten wie z Memcached und Redis. Hier kamen verteilte Cache-Lösungen zur Rettung.
.NET Distributed Cache als 2nd Generation Key Value Store
Ein verteilter .NET-Cache wie NCache Andererseits wurde vom ersten Tag an darauf ausgelegt, alle oben genannten Einschränkungen zu berücksichtigen. Also, im Wesentlichen, NCache ist ein 2nd Generierung zu den ursprünglichen Schlüsselwertspeichern wie Memcached und Redis. NCache ist ein beliebter, 10 Jahre alter verteilter Cache für .NET.
Dynamischer Cache-Cluster und Datenreplikation
Ein verteilter Cache wie NCache verfügt über einen selbstheilenden dynamischen Cache-Cluster, der alle CPU- und Speicherressourcen aller Cache-Server im Cluster bündelt. Gleichzeitig, NCache bietet eine Vielzahl von Caching-Topologien mit unterschiedlichen Datenverteilungs- und Replikationsstrategien. Dies erlaubt NCache linear zu skalieren, ohne Kompromisse bei der Hochverfügbarkeit einzugehen. Und selbst wenn ein Cache-Server ausfällt, kommt es zu keinem Datenverlust, der Cache-Cluster läuft weiter und alle Anwendungen, die den Cache nutzen, laufen ebenfalls ohne Unterbrechungen weiter.
Cache frisch halten
Ein weiterer Bereich, in dem ein verteilter Cache beliebt ist NCache glänzt, hält die Daten aktuell und immer konsistent mit der Datenbank. NCache tut dies durch eine Vielzahl von Funktionen, darunter Ablauf, Eventfahren SQL-Abhängigkeit, abfragebasierte DbDependency und Unterstützung für CLR-Verfahren für relationale Datenbanken. Ablauffristen funktionieren genauso wie Key-Value-Stores, jedoch SQL-Abhängigkeit und DbDependency erlauben NCache um den Cache mit allen Änderungen in der Datenbank für die zugehörigen Daten zu synchronisieren. Und, Gespeicherte CLR-Prozeduren ermöglichen Ihnen, den Cache direkt aus Ihrer SQL Server-Datenbank zu aktualisieren, wenn sich die entsprechenden Daten ändern.
Dies bedeutet, dass selbst wenn eine Drittanbieteranwendung Daten in der Datenbank ändert, NCache aktualisiert sich sofort entsprechend. Der Vorteil besteht darin, dass Sie fast alle Ihre Anwendungsdaten zwischenspeichern können, anstatt schreibgeschützte Daten zwischenzuspeichern, was zu einer besseren Leistung und einem Skalierbarkeitsgewinn führt.
Cache mit SQL durchsuchen
Wenn Sie also dank der Funktion „Cache aktuell halten“ in der Lage sind, fast alle Ihre Daten zwischenzuspeichern, besteht die Gefahr, dass Sie Daten nicht einfach finden können, wenn der einzige Mechanismus ein Schlüsselwert ist. Aber wenn Sie Daten anhand von Attributen durchsuchen könnten, dann wäre ein verteilter Cache wie NCache wird so einfach zu durchsuchen wie eine Datenbank. NCache bietet Ihnen SQL und LINQ-Abfrage für diesen Zweck.
Zusätzlich zu den Modi SQL-Abfrage basierend auf Objektattributen können Sie zuweisen Groups, Schlüsselwörter und Benannte Tags zwischengespeicherten Elementen hinzufügen und sie in Ihre SQL-Abfragen einbeziehen. Unten sehen Sie ein Beispiel für SQL-Abfragen in C#. Zum Beispiel:
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 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
Serverseitiger Code
Schließlich gibt es serverseitigen Code wie Durchlesen, Durchschreiben, Benutzerdefinierte Abhängigkeit und Cache-Loader und Refresher das ist sehr nützlich. Dieser Code wird von Ihnen entwickelt, aber vom verteilten Cache aufgerufen und im Cache-Cluster ausgeführt. Mithilfe dieses Codes können Sie Ihre Anwendungen vereinfachen und viele häufig verwendete Codes in die Caching-Ebene verschieben.
Zum Beispiel, NCache ruft Ihren Read-through-Handler auf, wenn Ihre Anwendung nach Daten fragt, die sich nicht im Cache befinden, und die Anwendung teilt dies mit NCache in diesem Fall Read-through aufzurufen. Ebenso können Sie das Durchlesen mit Abläufen und Datenbanksynchronisierungen kombinieren, um das zwischengespeicherte Element automatisch neu zu laden, anstatt es aus dem Cache zu entfernen.
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 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
Das Durchschreiben funktioniert auf die gleiche Weise wie das Durchlesen, jedoch für Aktualisierungen. Es aktualisiert Ihre Datenbank, wenn Ihre Anwendung den Cache aktualisiert. Und wenn Sie es vorziehen, aktualisiert Write-behind die Datenbank asynchron, obwohl der Cache synchron aktualisiert wird. Schließlich wird der Cache Loader aufgerufen, wenn der Cache gestartet wird, damit Sie ihn mit den gewünschten Daten vorladen können.
Zusammenfassung
Wie Sie sehen können, NCache, ein verteilter Open-Source-.NET-Cache, bietet Ihrem Cache viel mehr Leistung als ein einfacher Redis Schlüsselwertspeicher oder Memcached. Nachfolgend finden Sie einen detaillierten Vergleich des Schlüsselwertspeichers mit einem verteilten Cache-Dienst, d. h Redis vs NCache und Memcached vs NCache.