Os bancos de dados têm sido parte integrante da . NET aplicativos, pois você pode buscar e manipular grandes conjuntos de dados com eficiência. No entanto, ao lidar com dados altamente transacionais, os bancos de dados causam degradação de desempenho em seus aplicativos .NET. Isso ocorre porque os bancos de dados não podem ser dimensionados para várias máquinas – você pode ter apenas uma máquina servidora dedicada à camada de banco de dados e não pode adicionar mais. Assim, o banco de dados se torna um gargalo de desempenho. Para resolver esse problema, usamos uma solução de cache distribuído, como NCache para mitigar viagens desnecessárias e caras ao banco de dados.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições
Como armazenar em cache o banco de dados?
O armazenamento em cache de um banco de dados é muito mais simples do que parece. Você precisa incorporar uma camada de cache com um cache como NCache entre seu aplicativo e a camada do banco de dados para que os dados do banco de dados sejam servidos do cache. Para facilitar, os quatro padrões mais comuns de uso de cache foram resumidos. Eles são informados abaixo:
1. Cache de Objetos
Essa estratégia sugere que, se seus dados não existirem no cache, você os busque no banco de dados e os insira no cache, como NCache. As chamadas sucessivas são tratadas a partir do cache posteriormente. Para problemas relacionados a dados obsoletos, você adiciona expiração ao item de cache para que possa ser atualizado a partir do banco de dados.
O trecho de código a seguir busca uma instância de Customer do cache, se ela existir. Caso contrário, ele o busca no banco de dados e o adiciona ao cache para uma ocorrência de cache em chamadas sucessivas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var key = "Customer:1001"; // Get Customer from cache if it exists var customer = cache.Get<Customer>(key); // If customer does not exist in cache if (customer == null) { // Fetch from database customer = GetCustomerFromDB(1001); // Create sliding expiration of 15 seconds. Cache removes item after this time var expiration = new Expiration (ExpirationType.Sliding, TimeSpan.FromSeconds(15.0)); var cacheItem = new CacheItem(customer) { Expiration = expiration }; // Insert the item with expiration into cache cache.Insert(cacheKey, cacheItem); } |
NCache Adicionar ao carrinho Documentos de cache de dados NCache Guia do programador
2. Cache de dados de referência e usar consultas SQL para pesquisá-los
Os dados que são apenas lidos e não alterados com frequência são conhecidos como dados de referência. É bastante comum para um aplicativo .NET ler dados repetidamente e gravar dados com pouca frequência no banco de dados. O cache (como NCache) é mais poderoso quando usado para dados de referência, pois funciona mais rápido com esses dados.
É altamente recomendável armazenar em cache todos os dados de referência e, em seguida, usar Consultas SQL para pesquisar o cache para ele em vez de ir para o banco de dados. Observe que se você não armazenar em cache todo o conjunto de dados de referência (por exemplo, todos os clientes), suas consultas SQL no cache retornarão resultados inválidos porque alguns dos dados estão apenas no banco de dados.
Se você já pré-carregou o cache com todos os seus dados de referência, o exemplo a seguir explica como você pode pesquisá-lo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Pre-Requisite: All customer instances have already been added into cache var customerName = "John Smith"; // Write SQL query for cache var query = "SELECT $Value$ FROM Northwind.Model.Customer WHERE Name = ?"; // Create the query command that cache understands from the query var queryCommand = new QueryCommand(query); // Provide the parameters for the query queryCommand.Parameters.Add("Name", customerName); // Execute the query on cache var reader = cache.SearchService.ExecuteReader(queryCommand, true); var customer; // If a valid projection was made in the query if (reader.FieldCount > 0) { while (reader.Read()) { customer = reader.GetValue<Customer>(1); // Perform operation according to business logic } } |
NCache Adicionar ao carrinho Documentos de cache SQL Documentos de cache de dados
3. Lidando com relações um-para-muitos no cache
Principalmente, nossos dados contêm relações entre eles. Por exemplo, no contexto do banco de dados Northwind (usado pela Microsoft), a tabela 'Pedidos' está relacionada à tabela 'Clientes'. Essas entidades são consideradas entidades relacionadas no domínio da aplicação .NET. Usando um cache como NCache, você também pode relacionar essas entidades dentro do cache.
Isso é feito por associando todas as entidades relacionadas com um identificador de tag para que, em vez de buscar cada pedido de clientes individualmente, você possa buscar todos os pedidos do cliente em uma única chamada, pesquisando o cache por meio do identificador de tag. O código de exemplo dado ilustra como podemos trazer esse comportamento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
var cacheKey = "Customer:1001"; var tagName = "Customer:1001_Orders"; // Check if customer exists in cache var cachedCustomer = cache.Get<Customer>(cacheKey); // If customer does not exist in cache if (cachedCustomer == null) { // Fetch from database var customer = GetCustomerFromDb(1001); // Insert customer into cache cache.Insert(cacheKey, customer); // Fetch orders of the customer from database var relatedOrders = GetRelatedOrdersFromDb(customer); // Create a tag for all orders of the customer var tag = new Tag(tagName); foreach (Order order in relatedOrders) { var orderCacheKey = $"Customer:1001_Order:{order.OrderID}"; // Create a cache item and set the tag identifier var orderCacheItem = new CacheItem(order) { Tags = new[] { tag } }; // Insert the tagged cache item into cache cache.Insert(orderCacheKey, orderCacheItem); } } else { // Item exists in the cache // Create a tag to fetch the related orders var tagIdentifier = new Tag(relatedEntityIdentifier); // Fetch the related orders based on the tag identifier var cachedOrders = cache.SearchService.GetByTag<Order>(tagIdentifier); } |
NCache Adicionar ao carrinho Documentos de dados marcados em cache Documentos de cache de dados
4. Cache de resultados de consulta ao banco de dados (dados transacionais)
Na maioria das vezes, os dados do banco de dados são retornados na forma de conjuntos de resultados de consulta. Essa estratégia sugere que você insira todo o conjunto de resultados no cache para que as consultas sucessivas sejam atendidas do cache. As consultas com os mesmos critérios sempre se referem ao mesmo conjunto de resultados. Portanto, podemos considerar os próprios comandos de consulta como o identificador exclusivo do conjunto de resultados e usá-lo como uma chave no cache.
O seguinte trecho de código mostra como os conjuntos de resultados de consulta podem ser armazenados em cache como coleções:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Query to select East Coast Customers var query = "SELECT * FROM Northwind.Model.Customer WHERE Region = ‘EastCoast’"; // Create cache key based on the query var key = query; // Fetch the entities based on query var resultSet = cache.Get<IList<Customer>>(key); // If data against query not found in cache if (resultSet == null) { // Fetch the result set from database var customers = GetCustomersFromDb(query); // Convert the result set into a collection var cacheReadyCustomers = customers.ToList(); // Add result set to cache against query cache.Insert(cacheKey, cacheReadyCustomers); } |
NCache Adicionar ao carrinho Documentos de cache de dados Documentos de cache SQL
Conclusão
Como você pode ver, armazenar em cache um banco de dados em aplicativos .NET com um cache como NCache é bem fácil. Com base nos padrões de uso do aplicativo, você pode armazenar em cache seus dados e buscá-los por meio de consultas, como se estivesse fazendo isso para um banco de dados.
Além disso, NCache é uma solução de cache distribuído na memória. Todos os problemas encontrados ao usar um banco de dados são tratados nele e ele possui todas as implementações para um cache com requisitos padrão e muito mais.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições