Com o tempo, o cache distribuído está se tornando popular, pois melhora o desempenho do aplicativo e fornece escalabilidade. E com a necessidade de um método rápido e escalável, as pessoas estão armazenando cada vez mais dados no cache. Quanto maior o desempenho do aplicativo, maior o número de aplicativos clientes. No entanto, há uma grande probabilidade de que seu banco de dados e o cache fiquem fora de sincronia quando vários clientes colocam e buscam dados de e para a fonte de dados. Para combater esse problema, a maioria das pessoas usa uma técnica de expiração de dados chamada tempo de vida (TTL) ou Expiração Absoluta. Essa expiração remove automaticamente o item de cache especificado após o tempo especificado. Embora seja popular, esse mecanismo é um palpite sobre quanto tempo os dados permanecem inalterados no cache.
Se você se sentir confiante de que seus dados provavelmente não serão alterados nessa duração ou se seus dados não forem muito confidenciais, o que significa que você pode se dar ao luxo de ler dados obsoletos antigos do cache, poderá usar expiração. Mas se seus dados forem confidenciais e você não puder ler dados imprecisos do cache, os dados obsoletos custarão muito. Nessa situação, acessar dados desatualizados é um risco que você não deve correr.
NCache Adicionar ao carrinho Tipos de expiração de dados NCache Docs
Sincronizando NCache com SQL Server
Para evitar que a situação mencionada acima surja em seu aplicativo .NET, você precisa garantir que seu cache permaneça sincronizado com o banco de dados o tempo todo. E para este exato propósito, NCache fornece um recurso de sincronização de banco de dados chamado Dependência SQL que permite manter seu cache sincronizado com o banco de dados SQL Server. SQL Dependency usa notificações de consulta para sincronizar seu cache com o banco de dados se ocorrer alguma alteração nos conjuntos de dados.
NCache Adicionar ao carrinho Dependência SQL NCache Docs
Notificações de consulta no SQL Server
As notificações de consulta são um recurso do SQL Server que notifica todos os clientes de banco de dados quando um conjunto de dados é alterado no banco de dados. NCache O servidor usa esse recurso para se tornar um cliente do SQL Server e se registrar no SQL Server por meio da Dependência do SQL.
Dessa forma, o SQL Server notifica NCache quando dados específicos são alterados no banco de dados. E NCache mantém um mapeamento de itens em cache e os conjuntos de dados correspondentes do banco de dados. Com isso, NCache pode invalidar o item armazenado em cache, portanto, uma nova cópia é obtida do banco de dados na próxima vez que o aplicativo precisar dela.
NCache fornece a API de dependência SQL por meio de sua API de cliente. No entanto, você deve fornecer os seguintes parâmetros por meio desta API ao adicionar itens em cache a NCache.
- String de conexão: para estabelecer uma conexão com o banco de dados.
- ComandoTexto: para determinar o CommandText usado pela dependência.
NCache Adicionar ao carrinho Dependência SQL Configurar ambiente do SQL Server
sincronização NCache com SQL Server: um exemplo rápido
Digamos que você tenha um sistema de compras on-line baseado em .NET com uma variedade de itens pesquisáveis acessados por centenas de clientes simultaneamente. O portal de compras abre no dia de Natal com 40% de desconto em todo o stock. O servidor de aplicativos atualiza o preço unitário dos produtos no banco de dados enquanto o cache desconhece essa alteração.
Se os clientes acessarem itens do cache, a cópia mais antiga desses itens, sem desconto, permanece disponível. Quando os clientes procuram produtos, eles obtêm os antigos preços unitários de Natal – resultando em clientes frustrados e insatisfeitos com o negócio.
Mas se você usar o NCache recurso de sincronização do banco de dados com o servidor SQL, o usuário pode habilitar notificações para manter os dados sincronizados com o banco de dados a cada atualização. Nesse caso, o aplicativo não enfrenta esse problema de integridade de dados, pois o cache sempre possui os dados corretos.
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 |
// Creating connection string to get connected with database. string connectionString = "Server=SERVERNAME; Database=NORTHWIND; UserId=USERID; Password=PASSWORD;"; // Getting products from database. List products = FetchProductFromDB(); // Creating dictionary of CacheItems. Dictionary<string, CacheItem> cacheItems = new Dictionary<string, CacheItem>(); foreach(Product product in products) { string productKey = $"Product: {product.ProductID}"; // Creating an SQL dependency on the unit price of product. Whenever the Unitprice changes, the product is removed from the cache. string query = $"Select UnitPrice from dbo.Products where ProductID = {product.ProductID}"; // Creating dependency on all the products. SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query); CacheItem productItem = new CacheItem(product); // Adding Dependency to product item productItem.Dependency = dependency; } // Adding CacheItems in cache cache.Add(productKey, productItem); |
A razão pela qual você deve usar o NCache SqlCacheDependency método para sincronizar dados com o servidor SQL é simples. Seus dados de cache nunca ficam obsoletos e você pode colocar com confiança todos os tipos de dados e buscá-los sem enfrentar problemas de integridade de dados.
NCache Adicionar ao carrinho SqlCacheDependency NCache Docs
Recarregar automaticamente o item de cache por meio do provedor ReadThru
Em vez de invalidar um item em cache, se você quiser que o cache o recarregue automaticamente quando seus dados correspondentes forem alterados no banco de dados, você precisará implementar o IReadThruProvider interface em NCache. Agora, sempre que NCache recebe uma notificação de atualização do SQL Server em vez de remover esse item do cache, NCache chama seu provedor ReadThru para buscar os dados atualizados do banco de dados.
Você adiciona a seguinte linha de código antes de inserir dados no cache e NCache lida com a sincronização automática dos dados para você.
1 2 3 4 5 6 7 8 9 |
// Create a new cache item and add sql dependency to it CacheItem item = new CacheItem(product); item.Dependency = sqlDependency; // Resync if enabled, will automatically resync cache with SQL server item.ResyncOptions = new ResyncOptions(true); // Add cache item in the cache with SQL Dependency and Resync option enabled cache.Insert(key, item); |
NCache Adicionar ao carrinho Provedores de Fonte de Dados Read-Through NCache Docs
Consultas parametrizadas em dependências SQL
Muitas alterações no banco de dados requerem invalidação frequente de itens em cache. Para cada invalidação de dados, uma consulta SELECT precisa ser fornecida. E isso significa que o SQL Server precisa compilar essa consulta SQL antes de executá-la. Isso causa degradação do desempenho porque a compilação da consulta leva muito tempo.
Para resolver esse problema de desempenho, NCache permite usar consultas SQL parametrizadas nas quais você especifica valores de parâmetro em tempo de execução e esses valores mudam a cada execução. Aqui, a própria consulta SQL é compilada na primeira execução e não precisa mais de recompilação, economizando muito tempo e melhorando o desempenho.
Para usar consultas parametrizadas em seu aplicativo, em vez de escrever uma consulta de seleção normal, você implementa a consulta a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Creating Param to be passed in stored procedure dictionary. SqlCmdParams paramProductID = new SqlCmdParams { Type = CmdParamsType.Int, Value = product.ProductID }; // Creating stored procedure params. Dictionary<string, SqlCmdParams> parameter = new Dictionary<string, SqlCmdParams>(); parameters.Add("@ProductID", paramProductID); CacheItem productItem = new CacheItem(product); /*Creating an SQL dependency on the unit price of the product. Whenever the unit price changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, query, SqlCommandType.Text, parameters); // Adding Dependency to the product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Adicionar ao carrinho SqlCacheDependency SqlCacheDependency
Dependência SQL Baseada em Procedimento Armazenado
Muitas organizações preferem manter todas as suas consultas SQL usadas por seus aplicativos dentro de seu banco de dados na forma de procedimentos armazenados. Isso melhora o desempenho porque todos esses procedimentos armazenados são pré-compilados e executados muito mais rapidamente do que as consultas SQL dinâmicas. Em segundo lugar, eles podem manter todas as consultas SQL de acesso ao banco de dados em um só lugar e não espalhadas dentro de cada aplicativo, o que é difícil de modificar se quiserem atualizar suas consultas SQL.
Para essas organizações, NCache suporta Dependência SQL Baseada em Procedimento Armazenado onde ao invés de especificar consulta SQL dinâmica ou mesmo consulta SQL parametrizada, você pode especificar uma chamada de Procedimento Armazenado.
A consulta SQL a seguir cria um procedimento com ProductID como parâmetro. Este procedimento armazenado pode ser usado em seu aplicativo para sincronizar o cache com o banco de dados.
1 2 3 4 |
create PROCEDURE sp_GetUnitPriceByProductID @ProductID int as Select UnitPrice from dbo.Products where ProductID = @ProductID; |
Para chamar esse procedimento armazenado em seu aplicativo .NET, use o trecho de código a seguir.
1 2 3 4 5 6 7 8 9 10 11 |
// Specifying stored procedure, created in database. string spGetUnitPriceByProductID = "sp_GetUnitPriceByProductID"; /*Creating an SQL dependency on the unit price of product. Whenever the unitprice changes, the product is removed from the cache*/ SqlCacheDependency dependency = new SqlCacheDependency(connectionString, spGetUnitPriceByProductID, SqlCommandType.StoredProcedure, parameters); // Adding Dependency to product item productItem.Dependency = dependency; cache.Add(productKey, productItem); |
NCache Adicionar ao carrinho Procedimentos armazenados Consulta SQL
Conclusão
Se você não estiver usando NCache como uma fonte de dados primária para um aplicativo baseado em ASP.NET, comece a usá-lo agora como:
- NCache é uma solução em memória que não precisa de nenhuma interferência do cliente para reequilibrar automaticamente os dados, tornando seu aplicativo extremamente flexível.
- Ele permite que você adicione quantos servidores desejar em tempo de execução, fornecendo a solução mais escalável para seu aplicativo .NET.
Se você tiver um aplicativo ASP.NET, mas o banco de dados que está usando não oferece suporte a notificações, NCache fornece um método chamado dependência baseada em votação.
NCache Adicionar ao carrinho Comparação de edições NCache Baixar