Native Datenstrukturen bieten eine herkömmliche Methode zum Speichern und Abrufen von Daten. Durch ihre Implementierung sorgen sie für Parallelität zu Ihren eigenständigen Anwendungen – was großartig ist, außer dass sie nur auf die Threads innerhalb eines Anwendungsprozesses beschränkt sind. Und da skalierbare Anwendungen auf mehr als einem Server laufen, entsteht die Notwendigkeit, den Zustand der Datenstrukturen zwischen den Anwendungen zu teilen.
Hier kommen verteilte Datenstrukturen ins Spiel. Verteilte Datenstrukturen bieten zwar die Funktionalität herkömmlicher Datenstrukturen, ermöglichen aber mehreren Prozessen und Anwendungsinstanzen das gleichzeitige Hinzufügen, Abrufen und Entfernen von Daten, ohne die Konsistenz der Daten zu beeinträchtigen. Diese Datenstrukturen lösen das Problem, das herkömmliche Datenstrukturen nicht lösen konnten; diese ermöglichen eine parallele Berechnung.
Wo ist das? NCache sich einfügen?
NCache, eine In-Memory-Caching-Lösung, erweitert alle Funktionalitäten, die verteilte Datenstrukturen bieten. Verwenden NCache Da ein verteilter Cache den Zugriff auf Ihre strukturierten Daten von Threads außerhalb des Prozesses ermöglicht.
Sie können Ihre Daten in eine verteilte Datenstruktur einfügen, sie auf einem der Server zwischenspeichern und staunen, wie die Daten jetzt für alle Anwendungen, Prozesse und Instanzen zugänglich sind, die Teil Ihres Systems sind, unabhängig davon, auf welchem Server diese Daten gespeichert sind.
Um das Ganze abzurunden, NCache Bietet hohe Verfügbarkeit in Form einer partitionierten Replikat-Topologie. Die Daten, die Sie auf den Cache-Servern speichern, sind für Sie verständlicherweise wichtig. Ein Verlust dieser Daten aufgrund eines Serverfehlers ist in keinem Fall akzeptabel. Genau aus diesem Grund NCache ermöglicht es Ihnen, Replikate Ihrer Daten auf dem Caching-Server aufzubewahren, sodass bei einem Ausfall eines Knotens immer ein replizierter Satz genau derselben Daten übrig bleibt, der in solchen Szenarien verwendet werden kann. Auf diese Weise kommt es nie zu Datenverlusten in Ihrer .NET-Anwendung. Darüber hinaus haben Sie die Berechtigung, zur Laufzeit entsprechend Ihren Anforderungen Caching-Serverknoten hinzuzufügen.
NCache Bietet die Funktionalität zum Replizieren, Partitionieren und Skalieren von Daten, die in den Datenstrukturen gekapselt sind. Daher müssen sich Entwickler, die diese Datenstrukturen verwenden, keine Gedanken über die Verteilungslogik innerhalb ihrer .NET-Anwendungen machen.
NCache Details Datenstrukturen in NCache
Verteilte Datenstrukturen in NCache
NCache stellt verschiedene Datenstrukturen bereit, um Skalierbarkeit, Parallelität und Genauigkeit in Ihrer .NET-Anwendung zu erreichen. Sehen wir uns diese Datenstrukturen an, die die Gesamtleistung Ihrer Anwendung verbessern.
Verteilte Liste
NCache bietet VerteilteListe Das ist eine native .NET-Implementierung der IList-Schnittstelle. NCache Die Tatsache, dass es sich um eine native .NET-Caching-Lösung handelt, ist auch dann von Vorteil, wenn Ihre Anwendung ausschließlich auf .NET basiert. Was gibt es Schöneres für Ihre .NET-Anwendung als alles, was nativ und gastfreundlich ist?
Die folgenden Codeausschnitte zeigen, wie eine verteilte Liste erstellt, gefüllt und entvölkert wird NCache.
Eine Anwendung erstellt und füllt eine Liste:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Specify unique cache key for list string key = "ExpensiveProducts"; DataTypeAttributes dataTypeAttributes = new DataTypeAttributes(); dataTypeAttributes.Expiration = new Expiration(ExpirationType.Sliding, new TimeSpan(0, 2, 0)); // Create list of Product type IDistributedList<Product> list = cache.DataTypeManager.CreateList<Product>(key, dataTypeAttributes); // Get products to add to list Product[] products = FetchProductsFromDB(); foreach (var product in products) { // Add products to list list.Add(product); } |
Eine andere Anwendung ruft abgekündigte Produkte ab und entfernt sie aus der Liste
1 2 3 4 5 6 |
// Get list of Product type IDistributedList<Product> list = IDistributedList <Customer> list = cache.DataTypeManager.GetList<Product>("ExpensiveProducts"); // Get range of discontinued products to be removed List<Product> itemsToRemove = FetchDiscontinuedProducts(); list.RemoveRange(itemsToRemove); |
Die Einbindung einer verteilten Liste in alltägliche Anwendungen ist sehr einfach. Im Folgenden finden Sie einige Szenarien, die Anwendungen darstellen, die eine Implementierung einer verteilten Liste benötigen.
Anwendungsfall: Einkaufswagen
Nehmen wir an, dass Ihre .NET-Anwendung eine E-Commerce-Plattform ist. In dieser Anwendung können Kunden Artikel zum Warenkorb hinzufügen und daraus entfernen. Damit diese Anfragen entsprechend bearbeitet werden können, müssen Sie die Daten jedes Kunden speichern, die die Identität des Kunden und die Artikel enthalten, die anhand dieser ID hinzugefügt oder entfernt werden. Der beste und am besten organisierte Weg hierfür ist die Verwendung einer verteilten Liste.
Eine verteilte Liste in einer Umgebung mit mehreren Servern speichert die Daten Ihrer Kunden und stellt sie auf allen Servern zur Verfügung. Sie können diese Liste alle Artikel verfolgen lassen, die ein Kunde gekauft hat, an denen er Interesse gezeigt hat, oder sogar diejenigen, die er ignoriert hat. Dies verbessert nicht nur den Gesamtwert Ihrer Anwendung durch die Pflege einer ausgefeilten Aufzeichnung, sondern macht die Daten auch für Sie hochgradig verfügbar.
Anwendungsfall: Bestenliste
Für Menschen, die sich für Spiele interessieren, ist die Bestenliste eine wichtige Informationsquelle, sei es Online-Spiele oder weltweite Spiele. Diese Leute sind immer daran interessiert zu wissen, welches Team führt und wer zurückbleibt. Informationen wie diese können in eine Anwendung integriert werden, die eine Listendatenstruktur verwendet, um die erforderlichen Daten zu speichern und sie an alle interessierten Benutzer zu senden.
NCache Details Listen ein NCache
Verteilte Warteschlange
NCache stellt eine First-in-First-out-Implementierung bereit, die als a bekannt ist Verteilte Warteschlange. Warteschlangen werden aufgrund ihres FIFO-Verhaltens zur Laufzeit verwendet, um wertvolle Informationen zu speichern.
IDistributedQueue ist eine einfach zu verstehende und zu implementierende Datenstruktur, die bereitgestellt wird von NCache. Sehen Sie sich den folgenden Code an, um sich mit grundlegenden Vorgängen in einer Warteschlange vertraut zu machen, wie z. B. das Erstellen einer Warteschlange, das Hinzufügen und Entfernen von Daten aus ihr.
Eine Anwendung erstellt und füllt die Warteschlange
1 2 3 4 5 6 7 8 9 |
string key = "CandidateQueue"; // Create Queue of Candidate type IDistributedQueue<Candidate> queue = cache.DataTypeManager.CreateQueue<Candidate>(key); foreach(var candidate in candidates) { // Add candidates to queue queue.Enqueue(candidate); } |
Eine andere Anwendung ruft die Warteschlange aus dem verteilten Cache ab und entfernt das erste Element aus der Warteschlange
1 2 3 4 |
IDistributedQueue<Candidate> queue = cache.DataTypeManager.GetQueue<Candidate>("CandidateQueue"); // Remove first item of queue var firstCandidate = queue.Dequeue(); |
Nachfolgend sind einige der Anwendungsfälle einer verteilten Warteschlange aufgeführt, um Ihnen eine ungefähre Vorstellung davon zu geben, wo Sie eine Warteschlange verwenden können und welche Vorteile Sie daraus ziehen werden.
Anwendungsfall: Nachrichtenwarteschlange
Ihre auf mehreren Servern gehostete .NET-Anwendung, die mehrere Clients gleichzeitig bedient, muss Nachrichten an einen der Clients senden, die Ihre Anwendung verwenden. Was machst du hier? In einer verteilten Umgebung haben Sie keine Kontrolle über die Verbindung zwischen Ihren Servern und den Clients, was bedeutet, dass Sie nicht wissen, welcher Server welchen Client bedient.
In einem solchen Szenario benötigen Sie eine verteilte Warteschlange, um alle Nachrichten zu verfolgen, die an die Clients übermittelt werden müssen. Diese Liste wird auf alle Cache-Server verteilt, um sicherzustellen, dass alle Clients, die mit Ihrer Anwendung verbunden sind, jederzeit Zugriff auf dieselben Daten haben. NCache übernimmt für Sie die Replikation der verteilten Daten. Daher können Sie durch die Verwendung einer verteilten Warteschlange in einem verteilten Cache Datenparallelität und Hochverfügbarkeit erreichen.
Anwendungsfall: Stimmungsanalyse
Eine Anwendung, die von einem Geheimdienst verwendet wird, um bedrohliche oder vertrauliche Tweets herauszufiltern, könnte vollständig von einer verteilten Warteschlange profitieren, die von bereitgestellt wird NCache. Nehmen wir an, dass Ihre Webanwendung auf mehreren Knoten ausgeführt wird. Was Sie wollen, ist, diese Tweets in einer verteilten Umgebung mit einer solchen Präzision zu verarbeiten, dass ein Tweet nicht mehr als einmal verarbeitet wird. Der Weg, dies zu erreichen, besteht darin, dass diese Anwendung eine verteilte Warteschlange verwendet, um alle eingehenden Tweets darin zu speichern. Dadurch wird sichergestellt, dass kein Tweet zweimal verarbeitet wird, wodurch die Gesamtleistung und Genauigkeit Ihrer Anwendung verbessert wird.
NCache Details Warteschlangen NCache
Verteiltes HashSet
NCache bietet eine extrem schnelle und skalierbare Implementierung von Mengen namens DistributedHashSet. HashSet ist ein ungeordneter Datentyp, dessen Werte einzigartig und unverwechselbar sind.
Sehen wir uns den folgenden Code an, um zu verstehen, wie Sie ein HashSet erstellen und füllen können.
Erste Anwendung, die ein Hashset auffüllt
1 2 3 4 5 6 7 8 9 10 |
// Create unique keys for hashSets string mondayUsersKey = "UsersLoggedInOnMonday"; // Create hashSets of object type IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.CreateHashSet<string>(mondayUsersIds); // Add user IDs for Monday userSetMonday.Add("john_smith"); userSetMonday.Add("mike_cohn"); userSetMonday.Add("mike_ross"); |
Zweite Anwendung ruft Hashset ab und ändert es
1 2 3 4 5 6 |
// Getting hashset from cache IDistributedHashSet<string> userSetMonday = cache.DataTypeManager.GetHashSet<string>("UsersLoggedInOnMonday"); // Remove user with given ID from the set userSetMonday.Remove("mike_cohn"); userSetMonday.RemoveRandom(); |
Sie können verteilte HashSets verwenden, wenn Ihre Anwendung Vorgänge für Daten ausführen muss, die ihrer Natur nach einzigartig sind. Hier sind einige Anwendungsszenarien, deren Leistung durch die Implementierung von DistributedHashSet verbessert wird.
Anwendungsfall: Nachverfolgung von IP-Adressen
Da Hashsets keine doppelten Werte enthalten, können Sie verwenden NCache's Implementierung von verteilten HashSets, um alle Benutzer und Besucher der Website zu verfolgen. Wenn Sie beispielsweise einen Online-Buchladen haben, kann HashSets Ihnen dabei helfen, ganz einfach festzustellen, welcher Benutzer an welchen Büchern interessiert ist und wie viele Bücher gekauft hat und so weiter.
Anwendungsfall: Analyse von E-Commerce-Verkäufen
Sie können alle benötigten Informationen in einem HashSet speichern. Alles, was ein HashSet benötigt, ist ein eindeutiger Wert, um ihm mehrere Werte zuzuweisen. Sie möchten beispielsweise den Überblick über alle Benutzer behalten, die über Ihre Online-Shop-Anwendung etwas gekauft haben. Sie möchten ihre IDs und für jede ID möchten Sie eine Liste der Artikel führen, die der Kunde gekauft hat, der Artikel, die auf die Wunschliste gesetzt wurden, und der Artikel, die von der Wunschliste entfernt wurden. Da Sie nun alle diese Informationen in einem verfeinerten Satz haben, können Sie ganz einfach mehrere Vorgänge daran durchführen.
NCache Details HashSets in NCache
Verteiltes Wörterbuch
Verteiltes Wörterbuch Zur Verfügung gestellt von NCache ist ein Schlüssel-Wert-Paar, das eine native .NET-Implementierung der IDictionary-Schnittstelle ist. Ein Wörterbuch enthält einen Wert für einen bestimmten Schlüssel, und wenn dieser Wert geändert werden muss, müssen Sie ihn überschreiben.
Sie können IDistributedDictionary in verwenden NCache um eine Aufzeichnung der Produkte zu führen. Sie können Produktinformationen auf folgende Weise zu einem Wörterbuch hinzufügen bzw. daraus entfernen.
Erste Anwendung, die ein Wörterbuch erstellt und füllt
1 2 3 4 5 6 7 8 9 10 11 12 |
string key = "ExpensiveProducts"; // Create dictionary of Product type IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.CreateDictionary<string, Product>(key); // Adding products to dictionary Product[] products = FetchProducts(); foreach(var product in products) { string productKey = $"Product:{product.ProductID}"; dictionary.Add(productKey, product); } |
Zweites Anwendungswörterbuch zum Abrufen und Ändern
1 2 3 4 5 6 7 8 9 10 11 |
// Fetch dictionary of Product type from cache IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.GetDictionary<string, Product>("ExpensiveProducts"); // Create list of keys to remove List<string> keysToRemove = FetchDiscontinuedProducts(); // Get values from dictionary against the given keys ICollection<Product> values = dictionary.Get(keysToRemove); // Remove items from dictionary with given keys int itemsRemoved = dictionary.Remove(keysToRemove); |
Ein verteiltes Wörterbuch kann in mehreren Fällen verwendet werden und erweist sich in jedem von ihnen als äußerst praktisch und effizient. Beispiele für solche Fälle sind unten aufgeführt.
Anwendungsfall: Speichern verschlüsselter Werte im Cache
Einer der vielen Vorteile der Verwendung eines Wörterbuchs in einer verteilten Umgebung besteht darin, dass Sie kryptografische Schlüssel speichern müssen. Diese Schlüssel müssen allen Servern zur Verfügung stehen, die Teil dieses verteilten Systems sind. Sie speichern verschlüsselte Daten in einem der Cache-Server als Dictionary-Wert zusammen mit ihrem Entschlüsselungsschlüssel. Auf diese Weise können alle Server, die diese Daten in Zukunft möglicherweise benötigen, nicht nur auf die Daten, sondern auch auf den Entschlüsselungsschlüssel gemeinsam zugreifen.
Anwendungsfall: Speichern von Anmeldeinformationen
Ein verteiltes Wörterbuch ist die effizienteste Möglichkeit, die Anmelde-ID und das Kennwort eines Benutzers zu speichern und darauf zuzugreifen. Angenommen, es gibt eine Anwendung, die auf mehreren Servern ausgeführt wird und deren Benutzer Sicherheitsanmeldeinformationen angeben müssen, damit sie auf vertrauliche Daten zugreifen können. Um sicherzustellen, dass alle Server, die Ihre Anwendung bedienen, Zugriff auf diese wichtigen Informationen haben, können Sie diese Werte als Wörterbuch-Schlüssel-Wert-Paare zwischenspeichern. Dadurch wird sichergestellt, dass, wenn ein Server dem Wörterbuch ein neues Schlüssel-Wert-Paar hinzufügt, jeder andere Server das Wörterbuch problemlos nach den erforderlichen Daten durchsuchen kann.
NCache Details Wörterbuch in NCache
Verteilter Zähler
NCache bietet IZähler Datenstruktur, die zum einfachen Erhöhen und Verringern des Werts verwendet wird. Um Ihr Leben ein ganzes Stück besser zu machen, NCache ermöglicht es Ihnen, die in einem Zähler abgelegten Daten zu sperren, um die Datenkonsistenz zu gewährleisten.
Für Ihre .NET-Anwendung hilft Ihnen der folgende Code zu verstehen, wie Sie eine ICounter-Instanz erstellen, sie mit Daten füllen und diesen Wert erhöhen/verringern.
Erste Anwendung, die den Zähler mit einem Anfangswert erstellt
1 2 3 4 5 6 7 8 |
string key = "SubscriptionCounter"; long initialValue = 15; // Create counter ICounter counter = cache.DataTypeManager.CreateCounter(key, initialValue); // Set the initial value of counter to 100 counter.SetValue(100); |
Zweite Anwendung ruft den Zähler ab und ändert ihn
1 2 3 4 5 6 7 8 |
// Create counter ICounter counter = cache.DataTypeManager.GetCounter("SubscriptionCounter"); // Increment value of counter counter.Increment(); // Decrement value of counter counter.Decrement(); |
Sie können Zähler in unzähligen Szenarien verwenden, Sie müssen sich nur umsehen und fast jedes Problem, das Sie finden, kann durch die Verwendung verteilter Zähler in einer Caching-Umgebung gelöst werden. Einige dieser Szenarien sind wie folgt.
Anwendungsfall: Anzahl der Seitenaufrufe
Um zu sehen, wie viele Aufrufe eine Webseite je nach Wunsch pro Stunde oder pro Tag erhält, könnte dies problemlos mit verteilten Zählern in implementiert werden NCache. Bei jeder neuen Ansicht wird der Zähler im Cache-Server entsprechend erhöht. Dieser Wert wird zusammen mit allen Werten, die auf allen Caching-Servern vorhanden sind, nach einer bestimmten Zeit in der Datenbank aktualisiert. Dadurch vermeiden Sie viele unnötige Aufrufe der Datenbank und verbessern somit die Gesamtleistung Ihrer .NET-Anwendung.
Anwendungsfall: Tweets-Analyse
Nehmen wir an, Sie haben eine Anwendung, die alle wichtigen Tweets von Politikern und Prominenten zählt. Es verfolgt auch die Anzahl der Likes und Dislikes, Kommentare und anderen Dinge, die ihre Tweets erhalten. Nehmen wir nun an, dass es sich um eine Person handelt A Tweets und Likes auf seinem Tweet steigen in weniger als einer halben Stunde von 0 auf eine Million. Dies ist die Art von Daten, die nicht vorübergehend sind, die Sie aber trotzdem beibehalten müssen. Aber die Geschwindigkeit, mit der Sie aufrechterhalten müssen, ist weitaus langsamer als die Geschwindigkeit, mit der die Daten aktualisiert werden.
Um eine derart abrupte und häufige Änderung aufzuzeichnen, benötigen Sie auf jeden Fall eine sekundäre Komponente, die Ihre Datenbank nicht durch die Datenhäufigkeit ersticken lässt. Und genau hier brauchen Sie NCache. Ein In-Memory-Cache ist praktisch, wenn Sie Informationen vorübergehend speichern und sie dann nach einem bestimmten Intervall vollständig in die Datenbank schreiben müssen. Hier beginnen Sie mit dem Caching der Anzahl der Likes Wie Tweets, anstatt den Wert direkt in der Datenbank zu ändern, vermeiden Sie eine ganze Reihe unnötiger Netzwerkaufrufe.
NCache Details Zähler drin NCache
Alles zusammenfassend
Wenn Sie eine Single-Tier-Architektur haben, benötigen Sie überhaupt keine verteilten Datenstrukturen. Sie können jede Datenstruktur, die Sie benötigen, in Ihrer Anwendung beibehalten und implementieren. Wenn Sie jedoch auf mehrere Server umziehen und sich mit vorübergehenden Daten befassen, die nicht gespeichert werden müssen, oder mit Daten, deren Änderung extrem kostspielig ist, wird Ihre Datenbank gedrosselt und die Leistung beeinträchtigt. Um zu vermeiden, dass eine solche Tragödie Ihrer Anwendung widerfährt, benötigen Sie verteilte Datenstrukturen. Und wenn Sie von verteilt sprechen, sollten Sie immer haben NCache im Hinterkopf.
NCache ist extrem skalierbar und die Tatsache, dass es sich um eine In-Memory-Lösung handelt, macht es zur bestmöglichen Lösung für alle Ihre Daten-Caching-Probleme.