Comportement et utilisation du dictionnaire dans le cache
Un dictionnaire est une structure de données à usage général pour stocker un groupe d'objets. Il est également appelé Hash, Map et HashMap. Il s'agit d'une structure de données non ordonnée, qui fournit un mappage des clés de chaîne par rapport aux valeurs. Par exemple, un dictionnaire peut être utilisé pour stocker les informations de tous les produits d'un hypermarché par rapport à leur ID de produit comme clé d'entrée du dictionnaire.
NCache améliore encore le type de données du dictionnaire en fournissant NCache-des fonctionnalités spécifiques telles que Groupes, Tags, Expiration, Verrouillable, Dépendances, et plus contre.
Notes
En Java, une Map correspond à un Dictionary en .NET.
Comportement
- Une valeur de dictionnaire peut être de n'importe quel type primitif ou objet personnalisé.
- Un dictionnaire de
CacheItem
et les dictionnaires imbriqués ne sont pas encore pris en charge. - Les dictionnaires sont nommés. Par conséquent, vous devez fournir une clé de cache unique pour chaque dictionnaire.
- Une clé de dictionnaire ne peut être que de type chaîne.
- Les clés de dictionnaire en double ne sont pas autorisées.
Pré-requis
- Pour en savoir plus sur les prérequis standard requis pour travailler avec tous NCache fonctionnalités côté client, veuillez vous référer à la page donnée sur Prérequis de l'API côté client.
- Pour plus de détails sur l'API, reportez-vous à : ICache, IDistributedDictionary, IDataTypeManager, CréerDictionnaire, IDicionnaire, ObtenirDictionnaire, ICollectionManager, S'inscrireNotification, DataTypeDataNotificationCallbackDataTypeDataNotificationCallback, Type d'événement, DataTypeEventDataFilterDataTypeEventDataFilter, Bloquer, Débloquer.
Créer un dictionnaire et ajouter des données
L'exemple de code suivant montre comment un dictionnaire est créé dans le cache par rapport à la clé de cache Dictionnaire des produits puis les données sont ajoutées au dictionnaire.
Conseil
Vous pouvez aussi vous configurer les attributs de recherche tels que Groupes/Tags/Tags nommés et attributs d'invalidation tels que l'expiration/l'expulsion/la dépendance lors de la création d'une structure de données.
// Precondition: Cache must be connected
// Specify unique cache key for dictionary
string key = "ProductDictionary";
// 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)
{
// Add products
string productKey = $"Product:{product.ProductID}";
dictionary.Add(productKey, product);
}
Notes
Pour garantir la sécurité de l'opération, il est recommandé de gérer toutes les exceptions potentielles au sein de votre application, comme expliqué dans Gestion des échecs.
Récupérer le dictionnaire du cache
Vous pouvez récupérer un dictionnaire du cache qui prend une clé de cache comme paramètre. Cette clé est le nom du dictionnaire, qui est spécifié lors de la création du dictionnaire.
Si l'élément récupéré n'est pas de type dictionnaire, un Type mismatch
l'exception est levée.
// Dictionary with this key already exists in cache
string key = "ProductDictionary";
// Get dictionary and show items of dictionary
IDistributedDictionary<string, Product> retrievedDictionary = cache.DataTypeManager.GetDictionary<string, Product>(key);
if (retrievedDictionary != null)
{
foreach (var item in retrievedDictionary)
{
// Perform operations
}
}
else
{
// Dictionary does not exist
}
Récupérer les valeurs de clés de dictionnaire spécifiques
Vous pouvez obtenir les valeurs des seules entrées du dictionnaire en utilisant Get
. L'exemple de code suivant utilise le dictionary
instance de l'exemple pour ajouter des données au dictionnaire et obtient des valeurs par rapport aux clés spécifiées.
Notes
Si aucune valeur n'existe pour la clé spécifiée, null est renvoyé.
// Dictionary exists in cache
// Create list of keys to fetch corresponding values
var keys = new List<string>();
keys.Add("Product:1001");
keys.Add("Product:1002");
keys.Add("Product:1003");
// Get values against keys
// "dictionary" instance was created while creating dictionary
ICollection<Product> values = dictionary.Get(keys);
foreach (var value in values)
{
// Perform operations
}
Insérer des données dans le dictionnaire existant
Vous pouvez insérer des données dans un dictionnaire existant en utilisant Insert
. L'exemple de code suivant récupère de nouveaux produits à partir de la source de données et les insère dans un dictionnaire qui existe déjà dans le cache.
Notes
Si les clés existent déjà, cela écrasera les valeurs dans le dictionnaire.
// Dictionary with this key already exists in cache
string key = "ProductDictionary";
// Get dictionary to insert more values
IDistributedDictionary<string, Product> retrievedDictionary = cache.DataTypeManager.GetDictionary<string, Product>(key);
// Create dictionary of new products to be added
IDictionary<string, Product> newProducts = new Dictionary<string, Product>();
Product[] products = FetchProducts();
foreach (var product in products)
{
// Add new products
string productKey = $"Product:{product.ProductID}";
newProducts.Add(productKey, product);
}
// Append dictionary entries to existing dictionary
retrievedDictionary.Insert(newProducts);
Supprimer des éléments du dictionnaire
Notes
Si la clé à supprimer n'existe pas, rien n'est renvoyé. Vous pouvez vérifier le nombre de clés renvoyées à l'aide du type de retour de Remove
.
Les éléments peuvent être supprimés d'un dictionnaire par rapport à une collection donnée de clés. L'exemple de code suivant supprime les entités de dictionnaire pour les produits expirés à l'aide Remove
.
Conseil
Pour supprimer tout le dictionnaire du cache, reportez-vous au Supprimer les structures de données du cache .
// Dictionary with this key already exists in cache
string key = "ProductDictionary";
// Get dictionary and show items of dictionary
IDistributedDictionary<string, Product> retrievedDictionary = cache.DataTypeManager.GetDictionary<string, Product>(key);
// Create list of keys to remove
List<string> keysToRemove = FetchExpiredProducts();
// Number of keys removed is returned
int itemsRemoved = retrievedDictionary.Remove(keysToRemove);
Notifications d'événements sur le dictionnaire
Vous pouvez enregistrer des événements de cache, des événements basés sur des clés et des événements de structure de données sur une structure de données telle qu'un dictionnaire. Pour le comportement, reportez-vous à comportement intelligent.
L'exemple de code suivant enregistre un événement de cache de ItemAdded
ainsi que ItemUpdated
ainsi qu'enregistre un événement pour ItemAdded
ainsi que ItemUpdated
sur le dictionnaire dans le cache. Une fois qu'un dictionnaire est créé dans le cache, un ItemAdded
L'événement au niveau du cache est déclenché. Cependant, une fois qu'un élément est ajouté au dictionnaire, un ItemAdded
événement de structure de données est déclenché, et un ItemUpdated
l'événement de niveau cache est déclenché.
Enregistrer l'événement sur le dictionnaire créé
// Unique cache key for dictionary
string key = "ProductDictionary";
// Create dictionary of Product type
IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.CreateDictionary<string, Product>(key);
// Register ItemAdded, ItemUpdated, ItemRemoved events on dictionary created
// DataTypeNotificationCallback is callback method specified
dictionary.RegisterNotification(DataTypeDataNotificationCallback, EventType.ItemAdded |
EventType.ItemUpdated | EventType.ItemRemoved,
DataTypeEventDataFilter.Data);
// Perform operations
Spécifier le rappel pour la notification d'événement
private void DataTypeDataNotificationCallback(string collectionName, DataTypeEventArg collectionEventArgs)
{
switch (collectionEventArgs.EventType)
{
case EventType.ItemAdded:
// Item has been added to the collection
break;
case EventType.ItemUpdated:
if (collectionEventArgs.CollectionItem != null)
{
// Item has been updated in the collection
// Perform operations
}
break;
case EventType.ItemRemoved:
// Item has been removed from the collection
break;
}
}
Dictionnaire de verrouillage
Le dictionnaire peut être explicitement verrouillé et déverrouillé pour garantir la cohérence des données. L'exemple de code suivant crée un dictionnaire et le verrouille pendant une période de 10 secondes à l'aide de Bloquer puis le déverrouille en utilisant Débloquer.
// Dictionary exists with key "ProductDictionary"
// Cache Key
string key = "ProductDictionary";
// Get dictionary
IDistributedDictionary<string, Product> dictionary = cache.DataTypeManager.GetDictionary<string, Product>(key);
// Lock dictionary for 10 seconds
bool isLocked = dictionary.Lock(TimeSpan.FromSeconds(10));
if (isLocked)
{
// Dictionary is successfully locked for 10 seconds
// Unless explicitly unlocked
}
else
{
// Dictionary is not locked because either:
// Dictionary is not present in the cache
// Dictionary is already locked
}
dictionary.Unlock();
Ressources additionnelles
NCache fournit un exemple d'application pour la structure de données du dictionnaire sur GitHub.
Voir aussi
.RAPPORTER: Alachisoft.NCache.Client.DataTypes espace de noms.
Java: com.alachisoft.ncache.client.datastructures espace de noms.
python: ncache.client.datastructures classe.