Com o rápido aumento de aplicativos de alto tráfego, a escalabilidade é a necessidade para esta era. Por esse motivo, os sistemas de cache distribuído chegaram aos corações e almas dos aplicativos atuais. NCache – o principal cache distribuído para aplicativos .NET, não é exceção.
Quando geralmente consideramos um sistema de cache, é naturalmente considerado volátil e não persistente, que quaisquer dados armazenados no cache não estarão mais disponíveis se o cache for reinicializado.
Suponha que uma loja de comércio eletrônico online com centenas e milhares de transações de usuários todos os dias, salve todos os seus dados em um cache distribuído, o que resulta em que os usuários tenham acesso a esses dados em uma taxa muito rápida. A loja de comércio eletrônico deseja salvar todos os seus dados em um cache distribuído não volátil e reter os dados mesmo que o cache falhe ou reinicie devido a qualquer circunstância imprevista.
Temos uma solução que utiliza NCache's server-side deployments para modificar seu cache e torná-lo persistente. Você pode encontrar a solução no GitHub como NCache Cache Persistente. Esta solução usa provedores Read-Thru e Write-Thru para alterar o comportamento do cache como um cache persistente. Um cache persistente não é de forma alguma um substituto para seu banco de dados regular, mas apenas uma extensão para torná-lo mais rápido e acessível. Ele pode ser implementado com os dois principais sistemas de banco de dados SQL e Cosmos DB da NET sem a necessidade de qualquer código adicional. Vamos dar uma olhada mais detalhada nisso.
utilização NCacheRecursos do 's para um cache persistente
NCache armazenamento de dados persistente permite que você armazene dados por períodos de tempo mais longos. Normalmente, os dados são armazenados em um armazenamento persistente com um tempo de expiração predefinido ou até que o aplicativo envie um comando de exclusão. O armazenamento de persistência fica fora do cache distribuído e quaisquer dados armazenados no cache serão salvos automaticamente no armazenamento persistente para serem disponibilizados quando o cache for limpo devido à sua natureza volátil. Em cada solicitação de leitura feita pelo aplicativo, se não houver dados solicitados no cache, o cache recuperará automaticamente a entrada do armazenamento persistente e nenhum dado do cache será perdido. Isso é mostrado na Figura 1:
NCache O armazenamento persistente fornece os seguintes recursos de implantação do lado do servidor para garantir transações suaves e contínuas quando os dados armazenados no cache estiverem indisponíveis.
- Carregador de inicialização persistente: Esse provedor carrega dados no cache do armazenamento persistente toda vez que o cache é inicializado. Com cada operação de gravação feita no cache, o armazenamento persistente é atualizado e todos os dados persistentes são carregados no cache sempre que o cache é reiniciado. Portanto, não haverá perda de dados em cache, mesmo depois que o cluster de cache completo ficar inativo por qualquer motivo e, em seguida, iniciar novamente.
- Provedor de gravação persistente: Esse provedor é chamado automaticamente quando você grava algo no cache persistente. Ele replica o que está escrito no armazenamento persistente para que permaneça disponível quando o cache for reiniciado. Existem 2 opções para configurar este provedor – Write-Thru e Write-Behind. Eles permitem que o usuário faça a replicação em segundo plano ou replique antes da operação de gravação.
Com o Escreveru, em cada operação de gravação, os dados são salvos simultaneamente no armazenamento persistente e, em seguida, o controle é devolvido ao aplicativo.
Com o Escrever atrás, NCache en-queues a operação e a faz em segundo plano, retornando o fluxo para o usuário antes que as operações do banco de dados sejam executadas. - Provedor de leitura persistente: Esse provedor é chamado caso o usuário precise de dados que não estão disponíveis no cache. O cluster de cache que está usando o provedor Read Through buscará esses dados do armazenamento persistente e os preservará no cache.
Exemplo rápido de provedor WriteThru de persistência
Vejamos um exemplo rápido de como você pode usar um cache persistente com NCache. Neste exemplo, adicionaremos um item ao cache usando o Provedor WriteThru. Quando o usuário adiciona o item ao cache, o provedor de gravação implementado com o servidor de cache é chamado e o item é salvo simultaneamente no armazenamento de dados persistente. Agora, caso o cache seja encerrado ou o item seja removido do cache sem usar Write-Thru, o item será removido do cache, mas não do armazenamento persistente; os dados não serão perdidos, pois estarão dentro do armazenamento persistente. Quando esse item for necessário, ele será buscado do armazenamento persistente para o cache.
Aqui está o código básico mostrando a interface do provedor Write-Thru.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PersistenceWriteThruProvider : ProviderBase, IWriteThruProvider { public OperationResult WriteToDataSource(WriteOperation operation) { OperationResult operationResults = new OperationResult(operation, OperationResult.Status.Success); switch (operation.OperationType) { case WriteOperationType.Add: var items = new Dictionary<string, ProviderItemBase>(); items.Add(operation.Key, operation.ProviderItem); _persistenceProvider.Add(items); break; // Update and remove cases are similar and need to be handled } return operationResults; } } |
Veja como você pode inserir um item no cache com write-thru ativado para que ele utilize sua implementação de write-through implantada:
1 2 3 4 5 6 |
// Enable write through for the cacheItem created var writeThruOptions = new WriteThruOptions(); writeThruOptions.Mode = WriteMode.WriteThru; // Add the item in the cache with WriteThru enabled CacheItemVersion itemVersion = cache.Insert(key, cacheItem, writeThruOptions); |
NCache Adicionar ao carrinho Documentos de cache de gravação
Provedor de ReadThru de persistência
Suponha que o aplicativo queira alguns dados do cache. Esses dados foram armazenados anteriormente no cache, mas por algum motivo não estão mais disponíveis. Normalmente, se o usuário tentar acessar esses dados, o cache retornará um valor nulo, pois o cache não contém os dados necessários e o código adicional contendo consultas precisaria ser gravado para buscar dados do banco de dados. Isso fará com que a lógica do aplicativo se torne muito complexa. O cache é pesquisado primeiro pelo item necessário e, se não estiver disponível, verifique o banco de dados e, em seguida, carregue os dados.
Quando usamos o NCache armazenamento de dados de persistência, os dados removidos do cache ainda seriam armazenados no armazenamento de dados persistente e o cache chamaria o ReadThruProvider implementação e os dados seriam chamados no cache e retornados ao usuário. Portanto, agora você obterá os dados desejados mesmo que tenham sido excluídos do cache sem a necessidade de código adicional.
Aqui está o código básico mostrando a interface do provedor Read-Thru:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class PersistenceReadThruProvider : ProviderBase, IReadThruProvider { public ProviderCacheItem LoadFromSource(string key) { return (ProviderCacheItem)(_persistenceProvider.Get(new string[] { key })[key]); } public ProviderDataTypeItem LoadDataTypeFromSource(string key, DistributedDataType dataType) { ... } public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection keys) { ... } } |
Você pode buscar dados do cache com a leitura habilitada, portanto, se não existir no cache, ele irá buscá-los na fonte de dados conforme sua implementação do provedor de leitura.
1 2 3 4 5 6 |
// Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache Adicionar ao carrinho Documentos de cache lidos
Carregador de inicialização de persistência
Conforme discutido anteriormente, um cache é volátil e todos os dados em um cache são limpos quando o cache é desligado. Ao reiniciar, o cache está vazio e precisa ser preenchido novamente. Carregar cada entrada quando necessário usando o provedor Read-Thru torna o processo de obtenção de dados e operações mais lento. E se pudéssemos carregar todos os dados no cache na inicialização do cache? Com o Carregador de cache interface fornecida por NCache, todos os dados do armazenamento persistente são duplicados para o cache na inicialização para que estejam disponíveis para uso do aplicativo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class PersistenceStartupLoader : ProviderBase, ICacheLoader { public LoaderResult LoadNext(object userContext) { if (persistentItems == null) persistentItems = _persistenceProvider.GetAll(); LoaderResult result = new LoaderResult(); foreach (var item in persistentItems) { result.Data.Add(new KeyValuePair<string, ProviderItemBase>(item.Key, item.Value)); } return result; } } |
NCache Adicionar ao carrinho Documentos do carregador de inicialização do cache
Excluir dados do armazenamento de dados persistente
Na solução que fiz, o armazenamento persistente está vinculado ao seu cache para que qualquer alteração feita dentro do cache também seja feita dentro do armazenamento persistente. Por exemplo, um item de dados é armazenado no cache, bem como em um armazenamento persistente. Quando o usuário o exclui do cache, ele também será excluído do armazenamento persistente, com a ajuda do provedor de gravação. Isso garantirá que o cache principal permaneça sincronizado com o armazenamento de dados persistente.
No entanto, isso é completamente flexível, você pode alterar isso e ter itens armazenados no armazenamento persistente mesmo que o aplicativo envie um comando de exclusão.
Sua marca NCache?
NCache é um cache distribuído em memória rápido e escalável, líder de mercado, feito 100% para .NET / .NET Core formulários. Ele fornece recursos do lado do servidor para suportar a persistência de cache e há muitas configurações que podem ser feitas para usar a persistência de cache conforme necessário. Os dados podem ser persistidos do cache para qualquer banco de dados de nossa escolha. NCache armazena em cache os dados do aplicativo e remove gargalos de desempenho relacionados ao armazenamento de dados e bancos de dados. Ele permite que você armazene seus dados no cache por períodos mais longos para garantir que seus dados estejam disponíveis quando você precisar. NCache O armazenamento de dados de persistência elimina a necessidade de mover dados do banco de dados para o cache toda vez que o cache é iniciado. Isso garante a alta disponibilidade de seus dados sem a necessidade de escrever código extra!
Cabeça sobre a NCache Documentos para saber mais sobre como você pode implementar e usar NCache armazenamento de dados persistente junto com seu cache distribuído.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições