Comportamiento y uso del diccionario en caché
Un diccionario es una estructura de datos de propósito general para almacenar un grupo de objetos. También se llama Hash, Map y HashMap. Es una estructura de datos desordenada, que proporciona una correlación de claves de cadena con los valores. Por ejemplo, se puede usar un diccionario para almacenar la información de todos los productos en un hipermercado contra su ID del Producto como clave de entrada del diccionario.
NCache mejora aún más el tipo de datos del diccionario proporcionando NCache-características específicas como Grupos, Etiquetas, Vencimiento, Cerraduras, Dependencias, y más en contra.
Note
En Java, un Mapa corresponde a un Diccionario en .NET.
Comportamiento
- Un valor de diccionario puede ser de cualquier tipo primitivo u objeto personalizado.
- un diccionario de
CacheItem
y los diccionarios anidados aún no son compatibles. - Los diccionarios se nombran. Por lo tanto, debe proporcionar una clave de caché única para cada diccionario.
- Una clave de diccionario solo puede ser de tipo cadena.
- No se permiten claves de diccionario duplicadas.
Requisitos previos
- Para obtener información sobre los requisitos previos estándar necesarios para trabajar con todos NCache características del lado del cliente, consulte la página proporcionada en Requisitos previos de la API del lado del cliente.
- Para obtener detalles de la API, consulte: Dolor, Diccionario IDistribuido, Administrador de tipo de datos IData, Crear diccionario, IDiccionario, ObtenerDiccionario, ICollectionManager, RegistroNotificación, Tipo de datosNotificación de datosDevolución de llamada, Tipo de evento, Tipo de datosEventoFiltro de datos, Bloquear, descubrir.
Crear diccionario y agregar datos
El siguiente ejemplo de código muestra cómo se crea un diccionario en el caché contra la clave de caché ProductoDiccionario y luego los datos se agregan al diccionario.
Consejo
También puede configurar atributos de búsqueda como Grupos/Etiquetas/Etiquetas con nombre y atributos de invalidación como Caducidad/Desalojo/Dependencia al crear una estructura de datos.
// 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
Para garantizar que la operación sea a prueba de fallas, se recomienda manejar cualquier posible excepción dentro de su aplicación, como se explica en Manejo de fallas.
Recuperar diccionario de caché
Puede obtener un diccionario del caché que toma una clave de caché como parámetro. Esta clave es el nombre del diccionario, que se especifica durante la creación del diccionario.
advertencia
Si el elemento que se busca no es de tipo diccionario, un Type mismatch
Se lanza una excepción.
// 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
}
Obtener valores de claves de diccionario específicas
Puede obtener valores de solo entradas de diccionario usando Get
. El siguiente ejemplo de código utiliza el dictionary
instancia del ejemplo para agregando datos al diccionario y obtiene valores contra las claves especificadas.
Note
Si no existe ningún valor para la clave especificada, se devuelve un valor nulo.
// 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
}
Insertar datos en el diccionario existente
Puede insertar datos en un diccionario existente usando Insert
. El siguiente ejemplo de código obtiene nuevos productos del origen de datos y los inserta en un diccionario que ya existe en la memoria caché.
Note
Si las claves ya existen, esto sobrescribirá los valores en el diccionario.
// 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);
Eliminar elementos del diccionario
Note
Si la clave especificada para eliminar no existe, no se devuelve nada. Puede verificar el número de claves devueltas utilizando el tipo de devolución de Remove
.
Los elementos se pueden eliminar de un diccionario contra una colección dada de claves. El siguiente ejemplo de código elimina las entidades del diccionario para los productos vencidos usando Remove
.
Consejo
Para eliminar todo el diccionario del caché, consulte la Eliminar estructuras de datos de la memoria caché .
// 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);
Notificaciones de eventos en el diccionario
Puede registrar eventos de caché, eventos basados en claves y eventos de estructura de datos en una estructura de datos como un diccionario. Para el comportamiento, consulte comportamiento inteligente.
El siguiente ejemplo de código registra un evento de caché de ItemAdded
y ItemUpdated
así como registra un evento para ItemAdded
y ItemUpdated
en el diccionario en el caché. Una vez que se crea un diccionario en el caché, se ItemAdded
Se activa el evento a nivel de caché. Sin embargo, una vez que se agrega un elemento al diccionario, ItemAdded
se activa un evento de estructura de datos y ItemUpdated
se activa el evento de nivel de caché.
Registrar evento en diccionario creado
// 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
Especificar devolución de llamada para notificación de eventos
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;
}
}
Diccionario de bloqueo
El diccionario se puede bloquear y desbloquear explícitamente para garantizar la coherencia de los datos. El siguiente ejemplo de código crea un diccionario y lo bloquea durante un período de 10 segundos usando Bloquear y luego lo desbloquea usando descubrir.
// 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();
Recursos adicionales
NCache proporciona una aplicación de muestra para la estructura de datos del diccionario en GitHub.
Vea también
.NETO: Alachisoft.NCache.Client.Tipos de datos espacio de nombres
Java: com.alachisoft.ncache.cliente.estructuras de datos espacio de nombres
Pitón: ncache.cliente.estructuras de datos clase.