MemoryCache – pesquisando dados

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Recentemente vimos aqui como trabalhar com o MemoryCache, uma classe do .net framework para trabalharmos com cache no .net. Em nosso post anterior, vimos alguns de seus recursos, sendo um deles recuperar os valores através de chaves. Hoje vamos ver como recuperar nossos objetos através de pesquisas em seus valores, sem precisar usar sua chave. Para começar, vamos nos basear na aplicação que fizemos anteriormente e está disponível no GitHub: https://github.com/desenvolvedorninja/memorycache-trabalhando-com-cache.

Após baixar a aplicação, abra a classe UnitTest1, e crie um método chamado TestSearchName, que será usado para procurarmos por um desenvolvedor pela sua propriedade Nome:

[TestMethod]
public void TestSearchName()
{
    CacheItemPolicy policy = new CacheItemPolicy();
    policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(60);

    Desenvolvedor devNinja = new Desenvolvedor();
    devNinja.Nome = "Ninja";
    devNinja.Linguagem = "C#";
    devNinja.AnosExperiencia = 15;
    memoryCache.Add("devNinja", devNinja, policy);

    Desenvolvedor devSamurai = new Desenvolvedor();
    devSamurai.Nome = "Samurai";
    devSamurai.Linguagem = "Java";
    devSamurai.AnosExperiencia = 10;
    memoryCache.Add("devSamurai", devSamurai, policy);

    Desenvolvedor devRonin = new Desenvolvedor();
    devRonin.Nome = "Ronin";
    devRonin.Linguagem = "Java";
    devRonin.AnosExperiencia = 2;
    memoryCache.Add("devRonin", devRonin, policy);

    Desenvolvedor devMestre = new Desenvolvedor();
    devMestre.Nome = "Mestre";
    devMestre.Linguagem = "JavaScript";
    devMestre.AnosExperiencia = 15;
    memoryCache.Add("devMestre", devMestre, policy);

    var devGet = memoryCache.Where(dev => dev.Value is Desenvolvedor && (dev.Value as Desenvolvedor).Nome == "Ninja").Select(dev => (Desenvolvedor)dev.Value).First();
    Assert.AreEqual(devNinja, devGet);
}

O que fizemos aqui foi adicionar ao cache 4 objetos do tipo Desenvolvedor, com suas respectivas chaves, e no final, fizemos uma pesquisa no cache usando Linq, para isso primeiro nós testamos se o objeto é do tipo que estamos procurando e depois fazemos um cast para Desenvolvedor, e testamos se o nome é igual ao que desejamos.

memoryCache.Where(dev => dev.Value is Desenvolvedor && (dev.Value as Desenvolvedor).Nome == "Ninja")

E para completar, retornamos apenas o objeto contido no cache, sem sua chave, e já fazemos o cast para nossa classe Desenvolvedor,  e retornamos apenas o primeiro objeto que encontrarmos:

Select(dev => (Desenvolvedor)dev.Value).First()

Agora vamos fazer uma busca que retorne mais de um objeto, para isso crie um método chamado TestSearchLanguage:

[TestMethod]
        public void TestSearchLanguage()
        {
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(60);

            Desenvolvedor devNinja = new Desenvolvedor();
            devNinja.Nome = "Ninja";
            devNinja.Linguagem = "C#";
            devNinja.AnosExperiencia = 15;
            memoryCache.Add("devNinja", devNinja, policy);

            Desenvolvedor devSamurai = new Desenvolvedor();
            devSamurai.Nome = "Samurai";
            devSamurai.Linguagem = "Java";
            devSamurai.AnosExperiencia = 10;
            memoryCache.Add("devSamurai", devSamurai, policy);

            Desenvolvedor devRonin = new Desenvolvedor();
            devRonin.Nome = "Ronin";
            devRonin.Linguagem = "Java";
            devRonin.AnosExperiencia = 2;
            memoryCache.Add("devRonin", devRonin, policy);

            Desenvolvedor devMestre = new Desenvolvedor();
            devMestre.Nome = "Mestre";
            devMestre.Linguagem = "JavaScript";
            devMestre.AnosExperiencia = 15;
            memoryCache.Add("devMestre", devMestre, policy);

            var listDevs = memoryCache.Where(dev => dev.Value is Desenvolvedor && (dev.Value as Desenvolvedor).Linguagem == "Java").Select(dev => (Desenvolvedor)dev.Value).ToList();
            Assert.AreEqual(2, listDevs.Count);
        }

O que fizemos de diferente, foi trocar o First() pelo ToList(), já que nossa pesquisa por linguagem vai retornar mais de um item.

O uso do Linq para pesquisarmos no MemoryCache é bastante útil, mas tem que ser usado com cuidado. Vale também lembrar que a pesquisa por chave é muito mais rápida.

O código-fonte de nosso exemplo está disponível no GitHub: https://github.com/desenvolvedorninja/memorycache-pesquisando-dados.

Quase 20 anos de experiência no mercado de TI.
Atuação em grandes empresas como Netshoes, Borland, JBS, Bradesco, Hospital das Clínicas, Rede, Prodam, HSPE, Instituto Ayrton Senna, e também em empresas internacionais como Delta Dental, T-Mobile, Pepsi e Mckesson.
Fundador da TecPrime Solutions, administrador da comunidade nopCommerce Brasil, e autor dos sites InvestFacil.net e Desenvolvedores.ninja

Facebooktwittergoogle_plusredditpinterestlinkedinmail

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *