MemoryCache

Disponível desde a versão 4 do .NET Framework, a classe MemoryCache funciona de maneira similar ao cache do ASP.NET, exceto pelo fato de que a classe MemoryCache foi criada para ser utilizada em qualquer tipo de aplicação .NET, não apenas em aplicações ASP.NET.

Outra vantagem da classe MemoryCache é que ela é thread safe. Essa característica assegura o seu uso em operações assíncronas, operações executadas paralelamente e acessos originados de diferentes threads.

A classe MemoryCache possui uma propriedade chamada CacheMemoryLimit. Essa propriedade define a quantidade de memória (em bytes) que pode ser utilizada para o armazenamento de dados em cache. Se o limite de memória for excedido, então a classe MemoryCache passa a remover os dados de cache automaticamente, a fim de permitir a entrada de novos dados em cache sem exceder o limite configurado. Outra propriedade existente é a PhysicalMemoryLimit, que determina a porcentagem máxima de memória física que pode ser consumida pelo cache. Se ambas as propriedades forem configuradas com ZERO, então o uso de memória é dinamicamente alocado – este é o comportamento padrão.

Outra vantagem desta classe é que ela pode ser configurada em arquivos App.Config e Web.Config. O trecho de código abaixo demonstra como a classe MemoryCache pode ser configurada:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.runtime.caching>
    <memoryCache>
      <namedCaches>
        <add name="Default" physicalMemoryLimitPercentage="0" cacheMemoryLimitMegabytes="0" />
      </namedCaches>
    </memoryCache>
  </system.runtime.caching>
</configuration>

 

Seu uso é tão simples quanto as demais soluções de cache. Abaixo uma demonstração do seu funcionamento:

private IEnumerable<RegionalState> GetAllRegionaStates() {

    ObjectCache cache = MemoryCache.Default;

    IEnumerable<RegionalState> returnValue = cache["states"] as IEnumerable<RegionalState>;

    if (returnValue == null) {

        var repository = new RegionalStatesRepository();
        returnValue = repository.GetRegionalStates();

        cache.Set("states",
                    returnValue, 
                    new DateTimeOffset(DateTime.Now.AddMinutes(10)));

        //or another possibility...
        //cache.Set("states",
        //          returnValue,
        //          new CacheItemPolicy() {
        //              AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddMinutes(10))
        //          });
    }

    return returnValue;

    // Obs: 
    //  RegionalState and RegionalStatesRepository are just samples...
    //  So don't worry about the use of these classes!
}

 

Por
MSc. Fernando Henrique Inocêncio Borba Ferreira
Microsoft Most Valuable Professional – Visual C#

Referências:
http://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.100).aspx
http://msdn.microsoft.com/pt-br/library/system.runtime.caching.cacheitempolicy(v=vs.110).aspx

Publicidade

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.