Structures de données distribuées dans NCache

NCache est un cache distribué extrêmement rapide et évolutif pour .NET, Java, Node.js et Python applications. NCache est utilisé par les applications serveur .NET à transactions élevées pour la mise en cache des données d'application, ASP.NET / ASP.NET Core stockage de session, et Messagerie Pub/Sub.

NCache offre Structures de données distribuées qui peuvent être partagées entre plusieurs utilisateurs. Contrairement aux structures locales résidant dans le tas de l'application cliente, ces structures sont hébergées dans le cluster de cache distribué, ce qui réduit la pression sur la mémoire locale et la charge du ramasse-miettes. Elles comprennent :

Fonctionnalité Collections en cours de traitement standard NCache Structures distribuées
Domaine Lié aux processus (Tas local) Ressource réseau partagée à l'échelle du cluster
Cycle de vie Perdu lors du redémarrage/recyclage de l'application Indépendamment du cycle de vie de l'application
Disponibilité Point de défaillance unique (le processus) Haute disponibilité (via des topologies de partitionnement/réplication)
Cohérence Sécurité des threads uniquement au sein d'un seul processus Cohérence garantie sur plusieurs serveurs

Les sections suivantes fournissent des détails et des exemples de code pour les applications .NET et Java.

 

File d'attente distribuée

A File d'attente distribuée met en œuvre le IDistributedQueue<T> Cette interface permet de créer une file d'attente partagée entre plusieurs applications .NET et Java exécutées dans un environnement distribué. La file d'attente garantit le maintien de l'ordre d'entrée des données. Toutes les applications récupérant des données de cette file d'attente peuvent ainsi se fier à l'exactitude de cet ordre.

string cacheName = "demoCache";
string QueueName = "DistributedQueue:Customers";
  
// Initialize an instance of the cache to begin performing operations
ICache cache = CacheManager.GetCache(cacheName);
  
// Create a thread-safe distributed queue visible to all cluster nodes
IDistributedQueue<Customer> distQueue = 
cache.DataTypeManager.CreateQueue<Customer>(QueueName);
  
distQueue.Enqueue(new Customer {
	ContactName = "David Johnes", 
	CompanyName = "Lonesome Pine Restaurant"
});
String cacheName = "demoCache";
String queueName = "DistributedQueue:Customers";

// Initialize an instance of the cache to begin performing operations
Cache cache = CacheManager.getCache(cacheName);

// Create a thread-safe distributed queue visible to all cluster nodes
DistributedQueue<Customer> distQueue = cache.getDataStructuresManager().createQueue(queueName, Customer.class);

distQueue.add(new Customer("David Johnes", "Lonesome Pine Restaurant"));
distQueue.add(new Customer("Carlos Gonzalez", "LILA-Supermercado"));

Comme vous pouvez le voir ci-dessus, une file d'attente distribuée vous permet d'ajouter (Mettre en file d'attente) des éléments dans une séquence afin que vous puissiez les supprimer ultérieurement (Dequeue) dans la même séquence (FIFO). Voici l'interface de la file d'attente distribuée :

public interface IDistributedQueue<T> : IEnumerable<T>, IEnumerable, ICollection, IDistributedDataTypes, ILockable, INotifiable
  {
      void Clear();
      bool Contains(T item);
      void CopyTo(T[] array, int arrayIndex);
      T Dequeue();
      IList<T> DequeueBulk(int maxitems = 10);
      void Enqueue(T item);
      void EnqueueBulk(IList<T> items);
      T Peek();
      T[] ToArray();
  }
public interface DistributedQueue<T> extends Queue<T>, DistributedDataStructure, Notifiable {
    void clear();

    void copyTo(T[] var1, int var2);

    T peek();

    Object[] toArray();
}
 

Ensemble de hachage distribué

A Ensemble de hachage distribué Se comporte comme la classe .NET HashSet, mais de manière partagée par plusieurs applications et utilisateurs. Elle fournit toutes les opérations Set, telles que :

  • - Pas de doublons : dans l'Ensemble
  • - Opérations sur les ensembles : comme Union, Intersection et Différence

Étant un HashSet partagé par plusieurs applications ou utilisateurs, il constitue une structure de données puissante. Voici un exemple d'utilisation.

string cacheName = "demoCache";
string hashSetName = "DistributedHashSet:UniqueValueHashSet";

// Initialize an instance of the cache to begin performing operations:
ICache cache = CacheManager.GetCache(cacheName);

// Creating a distributed HashSet with absolute expiration
IDistributedHashSet<string> hashSet;
hashSet = cache.DataTypeManager.CreateHashSet<string>(hashSetName);

// Create data for HashSet
var daysOfWeek = new string[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };

// Add multiple entries to the HashSet
hashSet.AddRange(daysOfWeek);

// Since this entry already exists, no change to the HashSet is made by this call
hashSet.Add("Monday");
String cacheName = "demoCache";
String hashSetName = "DistributedHashSet:UniqueValueHashSet";

// Initialize an instance of the cache to begin performing operations:
Cache cache = CacheManager.getCache(cacheName);

// Creating a distributed HashSet with absolute expiration
DistributedHashSet<String> hashSet;
hashSet = cache.getDataStructuresManager().createHashSet(hashSetName, String.class);

// Add entries to the hashset
hashSet.add("Monday");
hashSet.add("Tuesday");
hashSet.add("Wednesday");
hashSet.add("Thursday");
hashSet.add("Friday");
hashSet.add("Saturday");
hashSet.add("Sunday");

// Since this entry already exists, no change to the hashset is made by this call
hashSet.add("Monday");

Comme vous pouvez le voir, lorsque vous ajoutez « lundi » la deuxième fois, il n’est pas ajouté au HashSet.

 

Dictionnaire distribué

A Dictionnaire distribué L'interface IDistributedDictionary remplace avantageusement l'interface IDictionary standard de .NET, mais de manière partagée entre plusieurs applications et utilisateurs. Elle offre toutes les opérations de dictionnaire, telles que l'ajout, la mise à jour, la suppression, la vérification du contenu, etc.

En plus des fonctionnalités habituelles du dictionnaire, Distributed Dictionary offre la possibilité d'expirer des éléments en fonction de NCache options d'expiration comme Expiration absolue et Expiration glissante.

ICache cache = CacheManager.GetCache("demoCache");
string dictName = "DistributedDictionary:Customers";

IDistributedDictionary<string, Customer> dict = cache.DataTypeManager.GetDictionary<string, Customer>(dictName);

if (dict == null)
{
	DataTypeAttributes attributes = new DataTypeAttributes {
		Expiration = new Expiration(ExpirationType.Absolute, new TimeSpan(0, 1, 0))
	};
	// Creating a distributed Dictionary with an absolute expiration of 1 minute
	dict = cache.DataTypeManager.CreateDictionary<string, Customer>(dictName, attributes);
}

Customer cust = new Customer
{	
	CustomerID = "customer1",
	ContactName = "David Johnes",
	CompanyName = "Lonesome Pine Restaurant",
	ContactNo = "(1) 408-354-9768",
	Address = "Silicon Valley, Santa Clara, California",
};
	   
dict.Add("customer1", cust);

Customer cachedCust;
bool fetched = dict.TryGetValue("customer1", out cachedCust);
String cacheName = "demoCache";
String dictName = "DistributedDictionary:Customers";
 
// Initialize an instance of the cache to begin performing operations
Cache cache = CacheManager.getCache(cacheName);

DistributedMap<String, Customer> dict = cache.getDataStructuresManager().createMap(dictName, Customer.class);

Customer customer = new Customer("David Johnes", "Lonesome Pine Restaurant", "Customer1", "(1) 408-354-9768");

dict.put("customer1", customer);
Customer cachedCustomer = dict.get("customer1");
 

Liste distribuée

Liste distribuée met pleinement en œuvre le System.Collections.Generic.IList<T> L'interface permet à cette liste de remplacer avantageusement les listes standard. Sa principale différence réside dans sa nature distribuée, ce qui lui permet d'être partagée entre plusieurs applications et processus. Une liste distribuée est une liste non triée, et vous pouvez y ajouter des éléments, soit à la fin, soit via l'interface. Ajouter () méthode ou à tout endroit via le Insérer () méthode en fournissant un index.

Vous trouverez ci-dessous un exemple d'utilisation d'une liste distribuée.

ICache cache = CacheManager.GetCache("demoCache");
string listName = "DistributedList:Customers";

IDistributedList<Customer> distList = cache.DataTypeManager.GetList<Customer>(listName);

if (distList == null)
{
	DataTypeAttributes attributes = new DataTypeAttributes {
		Expiration = new Expiration(ExpirationType.Absolute, new TimeSpan(0, 1, 0))
	};

	// Creating Distributed List with absolute expiration of 1 minute
	distList = cache.DataTypeManager.CreateList<Customer>(listName, attributes);
}

Customer cust = new Customer
{
	CustomerID = "customer1",
	ContactName = "David Johnes",
	CompanyName = "Lonesome Pine Restaurant",
	ContactNo = "(1) 408-354-9768",
	Address = "Silicon Valley, Santa Clara, California",
};

distList.Add(cust);
Customer cachedCustomer = distList[0];
String cacheName = "demoCache";
String listName = "DistributedList:Customers";

// Initialize an instance of the cache to begin performing operations:
Cache cache = CacheManager.getCache(cacheName);

DistributedList distributedList = cache.getDataStructuresManager().createList(listName,   Customer.class);

Customer customer = new Customer("David Johnes", "Lonesome Pine Restaurant", "Customer1", "(1) 408-354-9768");

distributedList.add(customer);
Customer cachedCustomer = (Customer) distributedList.get(0);

Vous pouvez également supprimer des éléments de la liste, parcourir celle-ci et effectuer de nombreuses autres opérations.

 

Compteur distribué

Compteur distribué est une structure de données puissante dans NCache qui vous permet de maintenir un compteur unique dans un environnement distribué partagé par plusieurs applications. Cela a de nombreuses utilisations et vous permet de développer rapidement des applications autour de cela. Ci-dessous un exemple :

ICache cache = CacheManager.GetCache("demoCache");
string counterName = "DistributedCounter:Customers";

ICounter counter = cache.DataTypeManager.GetCounter(counterName);
if (counter == null)
{
   DataTypeAttributes attributes = new DataTypeAttributes {
      Expiration = new Expiration(ExpirationType.Absolute, new TimeSpan(0, 1, 0))
   };

   // Creating Distributed Counter with absolute expiration to modify cache properties of the Counter, provide an instance of DataTypeAttributes in the second parameter
   counter = cache.DataTypeManager.CreateCounter(counterName, attributes);
}

counter.SetValue(1000);
long newValue = counter.IncrementBy(5);
newValue = counter.Value;
newValue = counter.DecrementBy(2);
String cacheName = "demoCache";
String counterName = "DistributedCounter:Customers";

// Initialize an instance of the cache to begin performing operations
Cache cache = CacheManager.getCache(cacheName);

Counter counter = cache.getDataStructuresManager().createCounter(counterName);
counter.setValue(1000);
long newValue = counter.incrementBy(5);
newValue = counter.getValue();
newValue = counter.decrementBy(2);

Que faire ensuite?

Questions fréquentes

Oui. NCache Il garantit la sécurité des threads sur l'ensemble du cluster. Il utilise un verrouillage distribué interne pour gérer la concurrence, évitant ainsi que les mises à jour simultanées de plusieurs applications n'entraînent une corruption des données ou des conditions de concurrence.

Un dictionnaire distribué est partagé entre les processus et les serveurs, tandis qu'un dictionnaire standard existe uniquement dans la mémoire locale d'une seule application. De plus, NCache Prend en charge l'expiration des données (absolue et glissante) et la haute disponibilité via la réplication, des fonctionnalités absentes des collections .NET standard.

Les données restent disponibles. Étant donné que les structures sont hébergées sur un serveur externe NCache Les clusters (hors processus) sont indépendants du cycle de vie de l'application. Vos données sont préservées même en cas de redémarrage, de plantage ou de déploiement de l'application.

Une refactorisation minimale est nécessaire. NCache implémente des interfaces .NET standard comme IDictionary<K,V> et IList<T>Vous pouvez utiliser des méthodes standard (comme Ajouter, Supprimer, Contient) et remplacez simplement l'initialisation de l'objet pour utiliser le NCache manipuler.

Contactez-Nous

TÉLÉPHONE

+1 214-619-2601 (Etats-Unis)

© Copyright Alachisoft 2002 - . Tous droits réservés. NCache est une marque déposée de Diyatech Corp.