NCache é um armazenamento de chave-valor. Ele recupera rapidamente itens em cache por sua chave. Mas também pode pesquisar entradas em cache por outras propriedades. Por exemplo, em vez de pesquisar produtos em cache por sua chave, também podemos pesquisá-los por categoria, faixa de preço e peso. Vamos aprender como indexar itens em cache para torná-los pesquisáveis.
Busca
Além de encontrar itens por sua chave, com NCache, podemos consultar entradas em cache usando uma sintaxe semelhante a SQL. Podemos escrever consultas SELECT e DELETE para localizar e excluir entradas. NCache não suporta consultas INSERT ou UPDATE. Como uma consulta SELECT de banco de dados, podemos recuperar projeções, objetos inteiros em cache ou apenas chaves. Também, NCache suporta consulta básica e operadores lógicos e funções agregadas.
Por exemplo, se estivermos armazenando produtos, podemos escrever uma consulta como SELECT FROM Product WHERE UnitPrice <= 5.00` para localizar todos os produtos em cache com preços inferiores a 5. Para obter mais exemplos de como pesquisar itens e usar operadores e funções agregadas , verifique usando Consultas SQL com cache distribuído.
Indexação
Ao contrário dos bancos de dados relacionais, para encontrar itens por outros atributos, NCache requer índices. Caso contrário, ele teria que verificar todo o cache para encontrar itens e suas propriedades relacionadas. vai fazer NCache lento. Com índices, nossas operações de pesquisa são mais rápidas. Para usar uma propriedade de um objeto em uma consulta de pesquisa semelhante a SQL, precisamos indexá-la primeiro. Podemos indexar todos os campos e propriedades primitivos públicos, privados e protegidos de um objeto. Estejamos cientes de que não podemos indexar campos ou propriedades do tipo referência. Uma vez NCache adiciona um item a um índice, ele é retornado como resultado de uma consulta se atender aos critérios de nossas consultas de pesquisa.
Existem dois mecanismos para definir índices com NCache: indexação estática e dinâmica.
Indexação Estática
Para pesquisar objetos personalizados, precisamos indexá-los primeiro. Podemos definir índices por meio de alterações de configuração ou programaticamente.
Criando índices via configuração
Podemos criar índices usando o NCache Manager ou um cmdlet do Powershell. Primeiro, devemos parar nosso cache, criar nossos índices e reiniciá-lo. O NCache O Manager nos pede para carregar o assembly com nossas classes e escolher quais propriedades e campos indexar. Depois disso, NCache indexa automaticamente novas entradas. Para mais detalhes sobre o NCache Gerenciador e Powershell Add-QueryIndex
cmdlet, verifique Configurar índices de consulta.
Criando índices programaticamente
Para criar índices programaticamente, precisamos anotar os campos de nossos objetos para indexá-los. NCache tem o QueryIndexed
atributo para indexar campos e propriedades.
Por exemplo, para indexar um nome de produto e preço unitário, precisamos anotar seu Name
e UnitPrice
propriedades. Assim,
1 2 3 4 5 6 7 8 9 10 11 |
public class Product { public int ID { get; set } [QueryIndexed] public string Name { get; set } [QueryIndexed] public decimal UnitPrice { get; set } public decimal Weight { get; set } } |
Por padrão, o NCache nomeia índices após as propriedades anotadas. Mas podemos especificar um nome diferente com o QueryIndexed
atributo. Esse recurso é útil ao trabalhar com dois aplicativos cliente que usam nomes diferentes para a propriedade que desejamos indexar. Por exemplo, se um aplicativo usa UnitPrice
e outro, pricePerUnit
; podemos usar price
como o nome do índice em ambos os aplicativos e escrever nossas consultas de pesquisa semelhantes a SQL usando price
ao invés.
Além de anotar propriedades individuais, podemos anotar classes com o QueryIndexable
atributo. Por aqui, NCache indexa automaticamente todas as propriedades e campos públicos. Mas precisamos anotar campos privados com QueryIndexed
. E se não quisermos indexar algumas propriedades, precisamos anotá-las com NonQueryIndexed
. Vamos indexar uma classe apenas se precisarmos indexar todas as propriedades. Mas vamos adotar a abordagem de indexar apenas as propriedades necessárias para a pesquisa, pois adicionar muitos índices gera uma sobrecarga de memória e desempenho.
Por exemplo, para indexar todas as propriedades de um produto, excluindo Weight
, precisamos anotar a classe e o Weight
propriedade. Assim,
1 2 3 4 5 6 7 8 9 10 11 12 |
[QueryIndexable] public class Product { public int ID { get; set } public string Name { get; set } public decimal UnitPrice { get; set } [NonQueryIndexed] public decimal Weight { get; set } } |
Para obter mais detalhes sobre anotações de índice, verifique Definir índices programaticamente.
Indexação Dinâmica
Definimos alguns atributos de nossas entradas em cache em tempo de execução usando o NCache cliente. Não podemos usar anotações para indexar esses atributos. Para atributos de tempo de execução, NCache usa indexação dinâmica. Existem três tipos de índices dinâmicos: grupos, tags e índices de tags nomeados.
Índice de Grupo
Com Grupos, podemos particionar logicamente nossas entradas para eficiência. Os grupos funcionam como categorias lógicas. Por exemplo, podemos usar grupos para nossos “clientes mais importantes” e “produtos comprados com frequência”. Podemos recuperar e remover todas as entradas pertencentes ao mesmo grupo. Além disso, podemos escrever consultas SELECT semelhantes a SQL usando grupos. NCache indexa grupos automaticamente. Quando adicionamos uma entrada a um grupo que não existe, NCache cria um índice para o grupo e armazena todas as entradas que pertencem a um grupo no mesmo índice. Para saber mais sobre Grupos, verifique Dados de cache de grupo: uma visão geral.
Índice de Tag
Tags são identificadores de string que associamos com nossas entradas. Com Tags, podemos organizar melhor nossos dados, pois podemos recuperar e remover entradas com base em suas tags. Ao contrário dos grupos, podemos associar uma ou mais tags às nossas entradas de cache. Por exemplo, podemos categorizar nossos clientes com base em sua localização usando “Clientes da Costa Leste” e “Clientes da Costa Oeste” como tags. NCache oferece suporte à pesquisa e exclusão de entradas usando um nome de marca ou a sintaxe de consulta semelhante a SQL. Podemos encontrar todos os itens que contenham uma ou mais tags, por exemplo: para cada nova tag, NCache cria um índice de marca e salva todos os itens em cache relacionados com esse índice.
Índice de tags nomeadas
Tags nomeadas são Tags aprimoradas. Ao contrário de Grupos e Tags, que suportam apenas strings como identificadores, com Tags Nomeadas, podemos associar tipos de dados primitivos, strings e datas às nossas entradas. Tags nomeadas são uma lista de pares chave-valor anexados às nossas entradas em tempo de execução.
Por exemplo, podemos usar Tags Nomeadas para armazenar o desconto que damos a clientes recorrentes.
Para pesquisar e excluir entradas usando nomes de tags ou a sintaxe semelhante a SQL, NCache cria automaticamente um índice quando adicionamos entradas com tags nomeadas que não existem. Também, NCache armazena todos os itens em cache relacionados nesse índice. Como os índices Named Tag suportam não apenas strings, mas todos os tipos primitivos, temos a alternativa de procurar itens com uma gama mais ampla de tipos de dados.
Para saber mais sobre Tags e Tags nomeadas, consulte o Dados de cache de tags e Tags nomeadas com dados de cache guias.
Conclusão
Graças a índices e consultas distribuídas, NCache oferece recursos de pesquisa em tempo real com uma sintaxe semelhante a SQL. Sem índices, NCache teria que escanear todo o cache para encontrar nossas entradas. É por isso NCache precisa de índices. Lembre-se de que precisamos indexar todos os atributos pesquisáveis de nossos itens primeiro. Podemos definir nossos índices por meio de configuração, programaticamente ou com uma combinação de ambas as abordagens. E vamos indexar apenas as propriedades que precisamos em nossas consultas. Os índices têm custos de memória e desempenho.
Para obter mais detalhes sobre como criar índices e como funcionam as consultas SQL, consulte o guia de indexação e Consulta SQL: Visão geral de comportamento e uso.