O Cache Distribuído tornou-se uma forma popular de melhorar o desempenho e a escalabilidade de aplicativos .NET. É por isso que os desenvolvedores estão armazenando cada vez mais dados em cache distribuído. No entanto, junto com isso vêm alguns desafios. Um desafio importante é garantir que os dados no cache estejam sempre sincronizados com o banco de dados. Isso ocorre porque o cache está mantendo uma cópia dos dados que já existem no banco de dados.
Se você tiver vários aplicativos atualizando os mesmos dados no banco de dados, mas nem todos tiverem acesso ao cache distribuído, você acabará com uma situação em que os dados no cache são mais antigos e diferentes de sua contraparte no banco de dados. E, embora isso possa ser bom para alguns tipos de dados de referência, definitivamente não é aceitável para dados transacionais. Dados de referência são aqueles que você lê muito, mas não modifica com muita frequência (por exemplo, catálogo de produtos), enquanto dados transacionais são algo que você lê e modifica com frequência (por exemplo, dados de clientes ou contas).
NCache Adicionar ao carrinho Documentos de dependência de cache NCache Docs
Como você garante que o cache distribuído permaneça sincronizado com o banco de dados?
A resposta é SqlCacheDependency
. Faz parte do ASP.NET Cache (System.Web.Caching) e permite especificar um conjunto de dados no banco de dados com uma instrução SQL e receber notificações de eventos .NET do SQL Server 2005/2008 sempre que seu conjunto de dados for modificado no banco de dados .
NCache incorporou internamente SqlCacheDependency
a fim de sincronização de cache com banco de dados SQL Server 2005/2008 ou Oracle. Para você, NCache fornece uma interface semelhante chamada SqlDependency que permite especificar uma instrução SQL representando uma ou mais linhas em uma determinada tabela que compõem seu item em cache. NCache então usa internamente SqlCacheDependency
para estabelecer um link com o banco de dados nessas linhas.
Portanto, se seus dados forem atualizados no banco de dados por um de seus aplicativos, o SQL Server acionará uma notificação de evento .NET que NCache captura e remove o item correspondente do cache distribuído. Isso resolve o problema de inconsistência de dados de ter duas cópias diferentes dos mesmos dados. Isso ocorre porque quando seu aplicativo deseja os mesmos dados da próxima vez, ele não os encontra no cache e é forçado a recuperar a cópia mais recente do banco de dados que também armazena em cache. Deste jeito, NCache garante que os dados no cache sejam sempre consistentes com os dados no banco de dados.
Aqui está um exemplo de código-fonte usando SqlDependency de NCache que usa internamente SqlCacheDependency
:
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 48 49 50 51 52 |
public class Program { // A standard Load method that loads a single row from database public Customer LoadCustomer(Customer cust) { String key = "Customer:CustomerID:" + cust.CustomerID; Customer cust2 = (Customer)NCache.Cache.Get(key); if (cust2 != null) return cust2; CustomerFactory custFactory = new CustomerFactory(); // Load a single customer from the database // SELECT * FROM Customers WHERE CustomerID = 'ALFKI' custFactory.Load(cust); // Create a SqlCacheDependency for this item CacheItem item = new CacheItem(cust); item.Dependency = SqlDependencyFactory(connectionString, "SELECT CustomerID FROM Customers WHERE CustomerID = '" + cust.CustomerID + "'"); // Store item in the cache along with SqlCacheDependency NCache.Cache.Insert(key, item); return cust; } // A query method public List<Customer> FindCustomers(String city) { String key = "List<Customer>:City:" + city; List<Customer> custList = (List<Customer>)NCache.Cache.Get(key); if (custList != null) return custList; CustomerFactory custFactory = new CustomerFactory(); // Load a list of customers from database based on a criteria // SELECT * FROM Customers WHERE City = 'San Francisco' custList = custFactory.FindByCity(city); // Create a SqlCacheDependency for this list of customers CacheItem item = new CacheItem(custList); item.Dependency = SqlDependencyFactory.(connectionString, "SELECT CustomerID FROM Customers WHERE City = '" + city + "'"); // Store list of customers in the cache along with SqlCacheDependency NCache.Cache.Insert (key, item); return custList; } } |
Dependência de cache no SQL Dependência de cache de banco de dados Oracle Dependência de cache personalizada
Em resumo, o recurso SqlDependency de NCache permite sincronizar o cache com o banco de dados e manter a integridade dos dados. Agora você pode começar a armazenar em cache todos os dados sem medo de usar dados obsoletos do cache. E, claro, quanto mais dados você armazenar em cache, melhor será o desempenho e a escalabilidade do seu aplicativo.
Então, baixe um teste de 60 dias totalmente funcional do NCache Enterprise e experimente você mesmo.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições