Comportamento e uso do dicionário no cache
Um dicionário é uma estrutura de dados de uso geral para armazenar um grupo de objetos. Também é chamado de Hash, Mapa e HashMap. É uma estrutura de dados não ordenada, que fornece um mapeamento de chaves de string em relação aos valores. Por exemplo, um dicionário pode ser usado para armazenar as informações de todos os produtos em uma superloja em relação aos seus ID do produto como a chave de entrada do dicionário.
NCache aprimora ainda mais o tipo de dados do dicionário, fornecendo NCache- recursos específicos, como Grupos, Tags, Expiration, Bloqueio, Dependências, e mais contra ele.
Note
Em Java, um Mapa corresponde a um Dicionário em .NET.
Comportamento
- Um valor de dicionário pode ser de qualquer tipo primitivo ou objeto personalizado.
- Um dicionário de
CacheItem
e dicionários aninhados ainda não são suportados. - Dicionários são nomeados. Portanto, você precisa fornecer uma chave de cache exclusiva para cada dicionário.
- Uma chave de dicionário só pode ser do tipo string.
- Chaves de dicionário duplicadas não são permitidas.
Pré-requisitos
- Para aprender sobre os pré-requisitos padrão necessários para trabalhar com todos os NCache recursos do lado do cliente, consulte a página fornecida em Pré-requisitos da API do lado do cliente.
- Para obter detalhes da API, consulte: ICache, Dicionário IDistribuído, IDataTypeManager, Criar dicionário, Idicionário, ObterDicionário, ICollectionManager, CadastroNotificação, DataTypeDataNotificationCallback, Eventtype, DataTypeEventDataFilter, Travar, Destravar.
Criar dicionário e adicionar dados
O exemplo de código a seguir mostra como um dicionário é criado no cache em relação à chave de cache Dicionário de Produto e então os dados são adicionados ao dicionário.
Dica
Você também pode configurar atributos pesquisáveis como Grupos/Tags/Tags Nomeadas e atributos de invalidação como Expiração/Remoção/Dependência ao criar uma estrutura de dados.
// 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 garantir que a operação seja à prova de falhas, é recomendável lidar com possíveis exceções em seu aplicativo, conforme explicado em Como lidar com falhas.
Buscar dicionário do cache
Você pode buscar um dicionário do cache que usa uma chave de cache como parâmetro. Essa chave é o nome do dicionário, que é especificado durante a criação do dicionário.
Aviso
Se o item que está sendo buscado não for do tipo dicionário, um Type mismatch
exceção é lançada.
// 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
}
Buscar valores de chaves de dicionário específicas
Você pode obter valores apenas de entradas de dicionário usando Get
. O exemplo de código a seguir usa o dictionary
instância do exemplo para adicionando dados ao dicionário e obtém valores em relação às chaves especificadas.
Note
Se não existir nenhum valor na chave especificada, será retornado 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
}
Inserir dados no dicionário existente
Você pode inserir dados em um dicionário existente usando Insert
. O exemplo de código a seguir busca novos produtos da fonte de dados e os insere em um dicionário que já existe no cache.
Note
Se as chaves já existirem, isso substituirá os valores no dicionário.
// 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);
Remover itens do dicionário
Note
Se a chave especificada a ser removida não existir, nada será retornado. Você pode verificar o número de chaves retornadas usando o tipo de retorno de Remove
.
Os itens podem ser removidos de um dicionário em relação a uma determinada coleção de chaves. O exemplo de código a seguir remove as entidades de dicionário dos produtos expirados usando Remove
.
Dica
Para remover todo o dicionário do cache, consulte o Remover estruturas de dados do cache Disputas de Comerciais.
// 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);
Notificações de eventos no dicionário
Você pode registrar eventos de cache, eventos baseados em chave e eventos de estrutura de dados em uma estrutura de dados, como um dicionário. Para comportamento, consulte comportamento sábio em recursos.
O exemplo de código a seguir registra um evento de cache de ItemAdded
e ItemUpdated
bem como registra um evento para ItemAdded
e ItemUpdated
no dicionário no cache. Depois que um dicionário é criado no cache, um ItemAdded
evento em nível de cache é acionado. No entanto, uma vez que um item é adicionado ao dicionário, um ItemAdded
evento de estrutura de dados é acionado e um ItemUpdated
evento de nível de cache é acionado.
Registrar evento no dicionário criado
// 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 retorno de chamada para notificação 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;
}
}
Dicionário de bloqueio
O dicionário pode ser explicitamente bloqueado e desbloqueado para garantir a consistência dos dados. O exemplo de código a seguir cria um dicionário e o bloqueia por um período de 10 segundos usando Travar e, em seguida, desbloqueia usando Destravar.
// 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 adicionais
NCache fornece um aplicativo de exemplo para a estrutura de dados do dicionário em GitHub.
Veja também
.INTERNET: Alachisoft.NCache.Client.DataTypes espaço para nome.
Java: com.alachisoft.ncache.client.dataestruturas espaço para nome.
Pitão: ncache.client.dataestruturas classe.