Comportamento e utilizzo del dizionario nella cache
Un dizionario è una struttura di dati generica per la memorizzazione di un gruppo di oggetti. Viene anche chiamato Hash, Map e HashMap. È una struttura dati non ordinata, che fornisce una mappatura delle chiavi stringa rispetto ai valori. Ad esempio, un dizionario può essere utilizzato per memorizzare le informazioni di tutti i prodotti in un superstore rispetto al loro numero identificativo del prodotto come chiave di immissione del dizionario.
NCache migliora ulteriormente il tipo di dati del dizionario fornendo NCache-funzioni specifiche come ATTIVITA' E GRUPPI, tag, Scadenza, Blocco, dipendenze, e più contro di essa.
Note:
In Java, una mappa corrisponde a un dizionario in .NET.
Comportamento
- Un valore del dizionario può essere di qualsiasi tipo primitivo o oggetto personalizzato.
- Un dizionario di
CacheItem
e i dizionari nidificati 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
- Per conoscere i prerequisiti standard richiesti per lavorare con all NCache Per le funzionalità lato client fare riferimento alla pagina specificata Prerequisiti dell'API lato client.
- Per i dettagli dell'API, fare riferimento a: ICache, Dizionario distribuito, IdataTypeManager, Crea dizionario, Dizionario, OttieniDizionario, ICollection Manager, Notifica di registrazione, DataTypeDataNotificationRichiamata, Tipo di evento, DataTypeEventDataFilter, bloccare, Sbloccare.
Crea dizionario e aggiungi dati
L'esempio di codice seguente mostra come viene creato un dizionario nella cache rispetto alla chiave della cache Dizionario del prodotto e 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.
// 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);
}
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.
Recupera 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.
avvertimento
Se l'elemento recuperato non è di tipo dizionario, a Type mismatch
viene generata un'eccezione.
// 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
}
Recupera i valori di chiavi di dizionario specifiche
È possibile ottenere i valori delle sole voci 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.
// 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
}
Inserisci dati nel 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.
// 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);
Rimuovi 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
.
Gli elementi possono essere rimossi da un dizionario rispetto a una determinata raccolta di chiavi. L'esempio di codice seguente rimuove le entità dizionario per i prodotti scaduti che utilizzano Remove
.
Consiglio
Per rimuovere l'intero dizionario dalla cache, fare riferimento al file Rimuovere le strutture di dati dalla 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);
Notifiche di 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 caratteristica comportamento saggio.
L'esempio di codice seguente registra un evento cache di ItemAdded
ed ItemUpdated
così come registra un evento per ItemAdded
ed ItemUpdated
sul dizionario nella cache. Una volta creato un dizionario nella cache, an ItemAdded
viene generato un evento a livello di cache. Tuttavia, una volta aggiunto un elemento al dizionario, an ItemAdded
viene attivato l'evento della struttura dati e un ItemUpdated
l'evento a livello di cache viene attivato.
Registra l'evento sul dizionario creato
// 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
Specificare la richiamata per la notifica dell'evento
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;
}
}
Dizionario di blocco
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.
// 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.strutture.dati.client spazio dei nomi.
Pitone: ncache.strutture.dati.client classe.