Sincronizar Cache com SQL / NoSQL Databases

NCache é um cache distribuído extremamente rápido e linearmente escalável que permite que o aplicativo de cache melhore o desempenho do seu aplicativo. Ao armazenar em cache os dados do aplicativo, você está criando uma cópia dos dados no cache que também existe em seu banco de dados. Se esses dados no banco de dados forem alterados, você deseja certificar-se de que o cache também seja atualizado para que seja sempre consistente com o banco de dados.

Para lidar com essa situação, NCache fornece recursos poderosos de sincronização de banco de dados onde o cache se sincroniza quando os dados são alterados em NoSQL database. Sincronização aqui significa remover o item em cache correspondente do cache (ou recarregá-lo com Read-through). NCache fornece o seguinte para sincronização de banco de dados:

  1. Dependência SQL
  2. Dependência Oracle
  3. Sincronizar cache com Cosmos DB/MongoDB
  4. Dependência OleDB
  5. Procedimentos CLR
  6. Recarregamento Automático com Read-Through

O diagrama a seguir mostra a arquitetura básica de como NCache suporta sincronização de banco de dados:

Sincronização de banco de dados

Dependência SQL

SqlDependência é usado por NCache caso seu banco de dados seja SQL Server. Você pode especificar um SqlDependency para qualquer item armazenado em cache ao adicioná-lo ou atualizá-lo no cache. O SQL Server monitora o conjunto de dados para quaisquer adições, atualizações ou remoções e notifica NCache através de Notificações SQL quase imediatamente após a atualização do banco de dados. Essas são notificações de banco de dados que são transformadas em eventos .NET.

SqlDependency pode ser um dos seguintes:

  • Consulta SQL parametrizada
  • Procedimento armazenado

Você pode encontrar mais detalhes sobre este tópico no blog Sincronizar cache com SQL Server.

Usando a consulta parametrizada

Aqui está como você pode usar SqlDependency em seu código .NET com consultas parametrizadas dinâmicas:

string connString = ConfigurationManager.AppSettings["connectionString"];
string query = "SELECT ProductID, ProductName, UnitPrice FROM Products WHERE ProductID > @productID";
...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("@productID", param);

SqlCacheDependency sqlDepenency = new SqlCacheDependency(connString, query, SqlCommandType.Text, sqlCmdParam);

Usando procedimentos armazenados

Aqui está como você pode usar SqlDependency em seu código .NET com procedimentos armazenados:

...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("productID", param);

SqlCacheDependency sqlDependency = new SqlCacheDependency(connString, "sp_GetProductByID", SqlCommandType.StoredProcedure, sqlCmdParams);

Dependência Oracle

Dependência Oracle é usado por NCache caso seu banco de dados seja Oracle 10g ou posterior e seja executado em Windows ou Unix. Assim como SqlDependency, você pode especificar OracleDependency para qualquer item armazenado em cache ao adicioná-lo ou atualizá-lo no cache.

OracleDependency pode ser um dos seguintes:

  • Consulta SQL parametrizada
  • Procedimento armazenado

O Oracle Server monitora esse conjunto de dados para quaisquer adições, atualizações ou remoções e, quando isso acontece, notifica NCache através do Oracle Notifications quase imediatamente após a atualização do banco de dados. Essas notificações usam a comunicação cliente/servidor da Oracle por baixo e falam com NCache através do .NET.

Como usar consultas parametrizadas

Veja como você pode usar o OracleDependency em seu código .NET com consultas parametrizadas dinâmicas:

...
var param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDepenency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam);

Usando procedimentos armazenados

Você pode usar chamadas de procedimento armazenado parametrizado na dependência do Oracle, conforme mostrado aqui:

...
OracleCmdParams param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDependency = new OracleCacheDependency(connString, "sp_GetProductByID", OracleCommandType.StoredProcedure, oracleParam);

Sincronizar cache com Cosmos DB/MongoDB

NCache também fornece mais flexibilidade e controle de como e quando invocar uma dependência em um item de cache. Dependência de notificação extensível permite que você implemente sua lógica personalizada que especifica quando remover dados do cache. Você pode escrever seu provedor personalizado para seu banco de dados subjacente, como Cosmos DB e MongoDB, e esse provedor é implantado no cache. O cache verifica todas as dependências implantadas se elas precisam ser removidas ou não.

Você pode criar seu provedor personalizado e implantá-lo no cache para usar a dependência personalizada em seu aplicativo. O trecho de código a seguir mostra como um provedor personalizado implantado para sincronização do Cosmos DB pode ser usado em seu código .NET ao adicionar itens ao cache:

Customer customer = LoadCustomerFromDB(customerId);

CacheDependency cosmosDbDependency = new CosmosDbNotificationDependency<Customer>(. . .) ;

var cacheItem = new CacheItem(customer);
cacheItem.Dependency = cosmosDbDependency;
cache.Insert("Customer:" + customer.Id, cacheItem);

Dependência OleDB

Dependência OleDB A dependência OleDB é usada por NCache caso seu banco de dados não seja SQL Server nem Oracle, mas seja um banco de dados compatível com OLEDB. Você também pode usar DbDependency com SQL Server e Oracle se não quiser que suas notificações de eventos possam ficar confusas caso seus dados mudem muito rapidamente.

Em DbDependency, você cria uma tabela chamada ncache_db_sync no banco de dados que contém uma linha para cada item em cache com DbDependency. Você modifica seus gatilhos de banco de dados para atualizar linhas nesta tabela quando os dados correspondentes no banco de dados são alterados. NCache pesquisa esta tabela para linhas atualizadas, então em uma pesquisa, NCache busca milhares de linhas e as sincroniza com o banco de dados.

Aqui está como você pode usar DbDependency em seu código .NET.

DBCacheDependency oledbDependency = DBDependencyFactory.CreateOleDbCacheDependency(connectionString, "PrimaryKey:dbo.Products");

var cacheItem = new CacheItem(product);
cacheItem.Dependency = oledbDependency;
cache.Insert(key, cacheItem);

Procedimentos CLR

Quando você tem um número muito grande de itens no cache e todos eles precisam ser sincronizados com o banco de dados, é muito melhor escrever um Procedimento CLR no SQL Server no Windows. Este procedimento CLR é chamado de seus gatilhos de banco de dados quando os dados relevantes são alterados. Este procedimento CLR então torna assíncrona NCache Chamadas de API para adicionar, atualizar ou remover o item em cache correspondente do cache.

Aqui está um exemplo de um procedimento CLR que remove o objeto se ele for atualizado.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void RemoveOnUpdate(string cacheName, string key)
{            
    cacheName = "demoClusteredCache";
    Cache cache = CacheManager.GetCache(cacheName);
    cache.RemoveAsync(key);
}

Recarregamento automático com manipulador de leitura

O comportamento padrão da sincronização do banco de dados é remover o item armazenado em cache do banco de dados quando os dados correspondentes no banco de dados forem alterados. No entanto, existem situações em que você simplesmente deseja atualizá-lo com a versão mais recente dos dados.

Para lidar com essa necessidade, NCache permite combinar a sincronização de banco de dados com o Leia recurso de manipulador de NCache. Com isso, NCache simplesmente chama o manipulador Read-through para recarregar a cópia mais recente do item armazenado em cache e, em seguida, atualiza o cache com ele. Este recurso oferece a flexibilidade de sincronizar NCache com qualquer relacional ou NoSQL database que foi configurado, incluindo o seguinte (e mais):

  1. SQL Server
  2. Oracle
  3. Cosmos DB
  4. MongoDB

O snippet de código a seguir mostra como os dados podem ser recarregados automaticamente em massa em NCache do Cosmos DB usando Read-Through. Você também pode encontrar mais detalhes no blog Sincronizar cache com CosmosDB.

public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList docs, CancellationToken cancellationToken) 
{
    cacheItems = cache.GetBulk(DocsKeys, new ReadThruOptions {Mode = ReadMode.ReadThruForced} );
    return Task.CompletedTask;
}

O que fazer a seguir?

NCache Adicionar ao carrinho
Baixe a chave de instalação gratuita de 30 dias
Solicite uma demonstração AO VIVO personalizada
Leia a documentação do produto
© Copyright Alachisoft 2002 - . Todos os direitos reservados. NCache é uma marca registrada da Diyatech Corp.