Aplicativos da Web ASP.NET, aplicativos de serviço da Web .NET e outros aplicativos de servidor .NET precisam lidar com cargas de transações extremas sem diminuir a velocidade. Embora sua camada de aplicativo seja dimensionada linearmente, a camada de armazenamento de dados e banco de dados não é dimensionada e, portanto, se torna um gargalo. Como resultado, o aplicativo inteiro não pode ser dimensionado.
Originalmente, armazenamentos simples de valores-chave distribuídos na memória, como Memcached e depois Redis foi introduzido nas plataformas Unix/Linux para ajudar a resolver esse problema de escalabilidade. Eles rapidamente se tornaram bastante populares principalmente porque forneceram escalabilidade linear assim como as camadas de aplicativos e removeram o gargalo do banco de dados
NCache Adicionar ao carrinho NCache Docs NCache APIs de cliente
Limitações em armazenamentos de valores-chave
Mas, apesar de sua popularidade, essas soluções eram muito simples, de natureza básica e realmente não resolviam muitos problemas enfrentados pelos aplicativos da vida real. Algumas das áreas em que essas soluções eram muito fracas incluíam:
- Falta de alta disponibilidade
- Falta de maneiras inteligentes de manter o cache atualizado
- Falta de consulta SQL
- Falta de código de cache do lado do servidor (por exemplo, Read-through)
Por exemplo, a alta disponibilidade era tão pobre em Memcached que terceiros começaram a desenvolver “fix ins” de alta disponibilidade para ele. Mas a arquitetura subjacente não foi projetada para alta disponibilidade e, portanto, essas soluções permaneceram bastante limitadas por natureza. Redis tiveram os mesmos problemas de disponibilidade, mas depois reprojetaram seu produto para incorporar alguns recursos de alta disponibilidade, como replicação de dados e suporte a failover. Mas ainda há grandes lacunas em todos os produtos de loja de valor-chave, como Memcached e Redis. Foi aqui que as soluções de cache distribuído vieram em socorro.
Cache Distribuído .NET como 2nd Armazenamento de valores-chave de geração
Um cache distribuído .NET como NCache por outro lado, foi projetado desde o primeiro dia para atender a todas as limitações mencionadas acima. Então, em essência, NCache é um 2nd Geração para os armazenamentos de valores-chave originais, como Memcached e Redis. NCache é um cache distribuído popular de 10 anos para .NET.
Cluster de cache dinâmico e replicação de dados
Um cache distribuído como NCache tem um cluster de cache dinâmico de autocorreção que agrupa todos os recursos de CPU e memória de todos os servidores de cache no cluster. Ao mesmo tempo, NCache fornece uma variedade de topologias de cache com diferentes estratégias de distribuição e replicação de dados. Isso permite NCache para escalar linearmente sem comprometer a alta disponibilidade. E, mesmo que um servidor de cache fique inativo, não ocorre perda de dados, o cluster de cache continua em execução e todos os aplicativos que usam o cache também continuam sem interrupções.
Mantendo o cache atualizado
Outra área onde um cache distribuído como NCache brilha, é manter os dados atualizados e sempre consistentes com o banco de dados. NCache faz isso através de uma variedade de recursos, incluindo vencimentos, condução de eventos SqlDependência, DbDependency baseado em polling e suporte para Procedimentos CLR para bancos de dados relacionais. As expirações funcionam exatamente como os armazenamentos de valores-chave, mas SqlDependência e DbDependency permitem NCache para sincronizar o cache com quaisquer alterações no banco de dados para os dados relacionados. E, Procedimentos armazenados CLR permitem que você atualize diretamente o cache do banco de dados do SQL Server quando os dados correspondentes forem alterados.
Isso significa que, mesmo que um aplicativo de terceiros altere dados no banco de dados, NCache imediatamente se atualiza de acordo. O benefício é que você pode armazenar em cache quase todos os dados do seu aplicativo em vez de armazenar em cache os dados somente leitura, proporcionando melhor desempenho e ganho de escalabilidade.
Pesquisando Cache com SQL
Portanto, quando você consegue armazenar em cache quase todos os seus dados devido aos recursos de “manter o cache atualizado”, você se depara com os problemas de não conseguir encontrar dados facilmente se o único mecanismo for o valor-chave. Mas, se você pudesse pesquisar dados com base em atributos, um cache distribuído como NCache torna-se tão fácil de pesquisar quanto um banco de dados. NCache fornece SQL e consulta LINQ para esta finalidade.
Além de Consulta SQL com base nos atributos do objeto, você pode atribuir Grupos, Tags e Tags nomeadas para itens em cache e incluí-los em suas consultas SQL. Abaixo está um exemplo de consulta SQL em C#. Por exemplo:
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 |
using Alachisoft.NCache.Runtime; using Alachisoft.NCache.Runtime.Exceptions; using Alachisoft.NCache.Web.Caching; public void SearchDataUsingSQL() { Cache cache = NCache.InitializeCache("myparitionreplica"); string query = "SELECT this.Category, " + "MAX(Prod.Product.ProductID) " + "WHERE this.Category = ? " + "GROUP BY this.Category"; Hashtable values = new Hashtable(); values.Add("Category", 4); ICacheReader reader = cache.ExecuteReader(query, values); if (reader.FieldCount > 0) { while (reader.Read()) { //you can get value through the field name... object category = reader.GetOrdinal("Category"); //perform operations } } reader.Close(); return data; } |
Código do lado do servidor
Finalmente, existe o código do lado do servidor como Leia, Gravação, Dependência personalizada e Carregador e Atualizador de Cache isso é muito útil. Esse código é desenvolvido por você, mas é chamado pelo cache distribuído e é executado no cluster de cache. Com a ajuda desse código, você pode simplificar seus aplicativos e mover muitos códigos comumente usados para a camada de cache.
Por exemplo, NCache chama seu manipulador Read-through quando seu aplicativo solicita alguns dados que não estão no cache e o aplicativo informa NCache para chamar Read-through nesse caso. Da mesma forma, você pode combinar Read-through com expirações e sincronizações de banco de dados para recarregar automaticamente o item em cache em vez de removê-lo do cache.
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 |
using Alachisoft.NCache.Runtime.Caching; using Alachisoft.NCache.Runtime.DatasourceProviders; using Alachisoft.NCache.Runtime.Dependencies; public class SampleReadThruProvider : IReadThruProvider { public void Init(IDictionary parameters, string cacheId) { // Create SQL connection and other initializations at the server side } //Responsible for loading an item from the external data source. public void LoadFromSource(string key, out ProviderCacheItem cacheItem) { //where LoadFromDataSource is the dummy method to load data from data source. object value = LoadFromDataSource(key); //Attach SQL dependency to your object string query = "SELECT ProductID FROM dbo.Products WHERE ProductID = 1001"; cacheItem = new ProviderCacheItem(value); cacheItem.Dependency = new SqlCacheDependency(connectionString, query); //Set expirations cacheItem.SlidingExpiration = new TimeSpan(0, 5, 0); //Indicates whether item should be reloaded on expiration if //ReadThru provider is specified. cacheItem.ResyncItemOnExpiration = true; } public void Dispose() { //... } } |
Write-through funciona da mesma forma que Read-through, mas para atualizações. Ele atualiza seu banco de dados quando seu aplicativo atualiza o cache. E, se preferir, o Write-behind atualiza o banco de dados de forma assíncrona, mesmo que o cache seja atualizado de forma síncrona. Por fim, o Cache Loader é chamado quando o cache é iniciado para que você possa pré-carregá-lo com os dados desejados.
Conclusão
Como você pode ver, NCache, um cache distribuído .NET de código aberto, oferece muito mais poder ao seu cache do que um simples Redis armazenamento de valor-chave ou Memcached. Abaixo está uma comparação detalhada do armazenamento de valor de chave com um serviço de cache distribuído, ou seja Redis vs NCache e Memcached vs NCache.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições