Hoje, os aplicativos da Web estão usando cada vez mais o cache distribuído para aumentar o desempenho e a escalabilidade, armazenando em cache os dados usados com frequência, a fim de reduzir viagens caras ao banco de dados. O cache distribuído se estende e sincroniza em vários servidores de cache para permitir que você dimensione de maneira linear. Um bom cache distribuído geralmente tem um recurso de dependência de cache para permitir que você expire itens em cache quando algo deles depende de alterações. Uma dependência de cache pode ser baseada em chave, baseada em arquivo ou baseada em banco de dados. Assim, em essência, você pode especificar que um item armazenado em cache seja dependente de outro item no cache (baseado em chave), um arquivo no sistema de arquivos (baseado em arquivo) ou uma linha ou um conjunto de dados em um banco de dados SQL Server (banco de dados -Sediada). E, quando os dados em qualquer uma dessas fontes são alterados, seu item em cache é removido automaticamente do cache porque a “dependência expirou”. Isso permite que você mantenha seus dados em cache atualizados e corretos sempre.
Isso é muito bom, mas e se você quiser que seus itens em cache sejam dependentes de dados em fontes de dados diferentes das mencionadas acima. Por exemplo, você pode ter um feed RSS (Rich Site Summary) que fornece alterações de dados. E você tem seu próprio programa para ler este feed e deseja expirar certos itens em cache com base em quaisquer alterações de dados que você vê no feed RSS. Existem muitas outras situações semelhantes em que a fonte de dados é “personalizada”. Portanto, para lidar com essas situações, um bom cache distribuído deve fornecer a flexibilidade de implementar sua própria Dependência de Cache Personalizada para seus itens em cache, para que possam expirar quando os dados em sua fonte de dados personalizada forem alterados.
NCache fornece tal Dependência de cache personalizada recurso. NCache é um poderoso cache distribuído para todos os tipos de aplicativos .NET. E, NCache permite implementar suas próprias dependências personalizadas. Deixe-me demonstrar com que facilidade você pode implementar uma dependência personalizada com NCache abaixo de. Aqui estão os passos que você tem que tomar:
- Adicionar usando Alachisoft.NCache.Runtime.Dependências; referência à sua implementação de dependência personalizada.
- NCache fornece uma classe abstrata extensível chamada ExtensibleDependency, que é a classe base de todas as dependências. Você só precisa herdar sua classe de dependência personalizada de ExtensibleDependency e, em seguida, apenas substituir sua propriedade HasChanged. Quando esta propriedade retornar true, o item dependente do item será expirado do cache.
Aqui está um exemplo completo de implementação de dependência personalizada na qual, se as unidades disponíveis de um produto especificado forem inferiores a 100, a alteração de dependência será acionada.
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using Alachisoft.NCache.Runtime.Dependencies; [Serializable] public class CustomDependency : ExtensibleDependency { private string _connString; private int _productID; public override bool Initialize(){ return false; } public CustomDependency(int productID, string connStr) { _connString = connStr; _productID = productID; } internal bool DetermineExpiration() { if (GetAvailableUnits(_productID) < 100) return true; return false; } internal int GetAvailableUnits(int productID) { OleDbDataReader reader=null; OleDbConnection connection= new OleDbConnection(_connString); connection.Open(); int availableUnits=-1; try { OleDbCommand cmd = connection.CreateCommand(); cmd.CommandText = String.Format(CultureInfo.InvariantCulture, "Select UnitsInStock From Products" + " where ProductID = {0}", productID); reader = cmd.ExecuteReader(); if (reader.Read()) { availableUnits = Convert.ToInt32(reader["UnitsInStock"].ToString()); } reader.Close(); return availableUnits; } catch (Exception) { return availableUnits; } } public override bool HasChanged { get { return DetermineExpiration(); } } } |
- Depois de implementar sua dependência personalizada e implantá-la com NCache service, tudo o que você precisa é registrar essa dependência com itens de cache dependentes em seu aplicativo sempre que necessário.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Alachisoft.NCache.Web.Caching; //add namespace //Add following code in your application Cache _cache = NCache.InitializeCache("myCache"); string connString = "Provider=SQLOLEDB;Data Source=localhost; User ID=sa;password=;Initial Catalog=Northwind"; CustomDependency hint = new CustomDependency(123, connString); _cache.Add("Product:1001", "Value", new CacheDependency(hint), Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10), Alachisoft.NCache.Runtime.CacheItemPriority.Default); |
Agora, quando os dados em sua fonte de dados personalizada forem alterados, NCache expira os itens armazenados em cache dependentes automaticamente do cache. NCache é responsável por executar seu código de dependência personalizado para que você não precise se preocupar em implementar seu próprio programa separado e hospedá-lo em algum processo confiável. Experimente e explore-o para os cenários específicos do seu aplicativo.