Comportamento e utilizzo del dizionario nella cache
NCache Il Dizionario Distribuito è una struttura dati distribuita e non ordinata per l'archiviazione di coppie chiave-valore in un cluster. È ideale per ricerche rapide basate su chiavi. Supporta eventi a livello di cache e di elemento. NCache migliora ulteriormente il tipo di dati del dizionario fornendo NCache-funzioni specifiche come Gruppi, Tags, Scadenza, Blocco, dipendenzeE altro ancora.
Chiamato anche Hash, Map o HashMap, un NCache Il dizionario è una struttura dati generica per la memorizzazione di un gruppo di oggetti. Associa le chiavi stringa ai valori. Ad esempio, un dizionario può essere utilizzato per memorizzare le informazioni di tutti i prodotti in un supermercato in base ai loro numero identificativo del prodotto come chiave di immissione del dizionario.
Note:
In Java, una mappa corrisponde a un dizionario in .NET.
NCache Comportamento del dizionario distribuito
- Un valore del dizionario può essere di qualsiasi tipo primitivo o oggetto personalizzato.
- Un dizionario di
CacheIteme i dizionari annidati non sono ancora supportati. - I dizionari sono nominati. Pertanto, è necessario fornire una chiave cache univoca per ciascun dizionario.
- Una chiave del dizionario può essere solo di tipo stringa.
- Non sono consentite chiavi del dizionario duplicate.
Prerequisiti
Prima di usare il NCache Per le API lato client, assicurarsi che siano soddisfatti i seguenti prerequisiti:
- Installa i seguenti pacchetti NuGet nella tua applicazione client .NET:
- Impresa: Alachisoft.NCache.Sdk
- Open Source: Alachisoft.NCache.SDK open source
- Includere i seguenti spazi dei nomi nell'applicazione:
- La cache deve essere in esecuzione.
- Assicurati che i dati aggiunti lo siano serializzabile.
- Per i dettagli dell'API, fare riferimento a: ICache, Dizionario distribuito, IdataTypeManager, Crea dizionario, OttieniDizionario, ICollection Manager, Notifica di registrazione, DataTypeDataNotificationRichiamata, Tipo di evento, DataTypeEventDataFilter, bloccare, Sbloccare, DataType Manager, Ottieni, inserire, Rimuovere, DataTypeEventArg.
Come creare un dizionario e aggiungere dati
L'esempio di codice seguente mostra come viene creato un dizionario nella cache rispetto alla chiave della cache Dizionario del prodottoe quindi i dati vengono aggiunti al dizionario.
Consiglio
Puoi anche configurare gli attributi ricercabili come Gruppi/Tag/Tag con nome e attributi di invalidamento come scadenza/eliminazione/dipendenza durante la creazione di una struttura dati.
try
{
// 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);
}
}
catch (OperationFailedException ex)
{
// NCache specific exception
if(ex.ErrorCode == NCacheErrorCodes.KEY_ALREADY_EXISTS)
{
// The specified key already exists in cache,
// Either remove the existing object from cache
// Or specify another key
}
else if (ex.ErrorCode == NCacheErrorCodes.CACHEITEM_IN_DATA_STRUCTURES)
{
// Data structures cannot be of CacheItem type
// CacheItems cannot be added in data structures
}
else
{
// NCache specific exception
// Exception can occur due to:
// Connection Failures
// Operation Timeout
// Operation performed during state transfer
}
}
catch (Exception ex)
{
// Any generic exception like ArgumentNullException or ArgumentException
}
Note:
Per garantire che l'operazione sia a prova di errore, si consiglia di gestire eventuali potenziali eccezioni all'interno dell'applicazione, come spiegato in Gestione dei guasti.
Come recuperare il dizionario dalla cache
Puoi recuperare un dizionario dalla cache che accetta una chiave della cache come parametro. Questa chiave è il nome del dizionario, specificato durante la creazione del dizionario.
Avvertenza
Se l'elemento recuperato non è di tipo dizionario, a Type mismatch viene generata un'eccezione.
// Precondition: Cache is already connected
// Dictionary with this key already exists in cache
string key = "ProductDictionary";
// Get the dictionary and iterate through its items
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
}
Come recuperare i valori delle chiavi specifiche del dizionario
È possibile recuperare i valori per voci specifiche del dizionario utilizzando Get. L'esempio di codice seguente usa il dictionary istanza dall'esempio per aggiunta di dati al dizionario e ottiene valori rispetto alle chiavi specificate.
Note:
Se non esiste alcun valore rispetto alla chiave specificata, viene restituito null.
// Precondition: Cache is already connected
// 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
}
Come inserire dati in un dizionario esistente
È possibile inserire dati in un dizionario esistente utilizzando Insert. L'esempio di codice seguente recupera i nuovi prodotti dall'origine dati e li inserisce in un dizionario già esistente nella cache.
Note:
Se le chiavi esistono già, questo sovrascriverà i valori nel dizionario.
// Precondition: Cache is already connected
// 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);
Come rimuovere elementi dal dizionario
Note:
Se la chiave specificata da rimuovere non esiste, non viene restituito nulla. È possibile verificare il numero di chiavi restituite utilizzando il tipo di restituzione di Remove.
È possibile rimuovere elementi da un dizionario per una data raccolta di chiavi. Il seguente esempio di codice rimuove le voci del dizionario per i prodotti scaduti utilizzando Remove.
Consiglio
Per rimuovere l'intero dizionario dalla cache, fare riferimento al file Rimuovere le strutture di dati dalla cache .
// Precondition: Cache is already connected
// Dictionary with this key already exists in cache
string key = "ProductDictionary";
// Get the dictionary and iterate through its items
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);
Registrazione delle notifiche degli eventi sul dizionario
È possibile registrare eventi cache, eventi basati su chiave ed eventi struttura dati su una struttura dati come un dizionario. Per il comportamento fare riferimento a comportamento in termini di funzionalità.
I seguenti esempi di codice registrano ItemAdded, ItemUpdatede ItemRemoved eventi della struttura dati sul dizionario. La creazione di un dizionario attiva un ItemAdded evento a livello di cache. L'aggiunta di un elemento a un dizionario esistente attiva un ItemAdded evento della struttura dati e un ItemUpdated Evento a livello di cache.
Come registrare eventi su un dizionario creato
// Precondition: Cache is already connected
// Unique cache key for dictionary
string key = "ProductDictionary";
// Create a 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
Come specificare il callback per la notifica degli eventi
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;
}
}
Come bloccare un dizionario
Il dizionario può essere bloccato e sbloccato esplicitamente per garantire la coerenza dei dati. L'esempio di codice seguente crea un dizionario e lo blocca per un periodo di 10 secondi utilizzando bloccare e poi lo sblocca usando Sbloccare.
// Precondition: Cache is already connected
// 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();
Risorse addizionali
NCache fornisce un'applicazione di esempio per la struttura dei dati del dizionario GitHub.
Vedere anche
.NETTO: Alachisoft.NCache.Tipi.dati.client spazio dei nomi.
Giava: com.alachisoft.ncache.client.datastructures spazio dei nomi.