Cache de objetos em WebServices

Publicado: 07/01/2005 em IntoSpaces
Olá Pessoal!!!!!!
Estou de volta ao TheSpoke!
Hoje quero falar de algo muito simples, porém que pode nos ajudar e muito em aplicações que se utilizam de WebServices e precisam de uma resposta muito rápida e com o mínimo de consumo de memória possível, é aí que entra o Asp.NET Caching.

Não vou me aprofundar no assunto explicando tudo do cache, mas cache é basicamente uma forma que o computador utiliza para realizar de forma muitao mais rápida determinadas tarefas.
Existem algumas modalidades interessantes de Cache no Asp.NET, para quem quiser se aprofundar, veja esse excelente artigo do Miguel Ferreira, publicado no MSDN Brasil e na MSDN Magazine http://www.microsoft.com/brasil/msdn/tecnologias/aspnet/aspnetcache.mspx

A modalidade que utilizaremos para o nosso exemplo é o Cache de Objetos, onde você determina para o servidor web que ele deve guardar uma cópia desse objeto em memória por um determinado tempo. Esse objeto pode ser de qualquer espécie, um DataSet por exemplo.
Mas com isso me ajudaria? É simples, se você tem um banco de dados e uma consulta muito grande, com certeza seu servidor ficará sobrecarregado se tiver muitas requisições e se sua consulta tem um resultado muito repetitivo, o cache armazena esse resultado em memória e quando for acessado, não irá ao banco pesquisar, já serah retornado imediatamente para a requisição.

No nosso caso, nosso WebService retornará um número grande, que consome processamento durante algum tempo do servidor, vejamos o nosso WebMethod.

[WebMethod]

public long Numero()
{
   long n = 0;
   for(int i = 0; i < 99999; i++)
   {
      for(int ii = 0; ii < 99999; ii++)
      {
         n++;
      }
   }
   return n;
}É um método bem simples que retorna um Long no valor de 99.99.800.001, o processamento leva em média 00:00:42.5312500

Agora veremos como colocar esse objeto em Cache e assim evitar esse processamento da máquina por um longo tempo e diminuir o intervalo entre requisição e resposta.

[WebMethod]

public long Numero()
{
   long n = 0;

   //Adquirindo o cache da requisição http atual
   System.Web.Caching.Cache cache = System.Web.HttpContext.Current.Cache;
   //Verifica se o objeto já está em cache
   if(cache["NumeroLongo"] == null)
   {
      for(int i = 0; i < 99999; i++)
      {
         for(int ii = 0; ii < 99999; ii++)
         {
            n++;
         }
       }

   //Adicionando o valor ao cache
   cache.Insert("NumeroLongo",n,null,DateTime.Now.AddMinutes(1),
                     System.Web.Caching.Cache.NoSlidingExpiration,

   System.Web.Caching.CacheItemPriority.Normal,null);

   }else
      n = (long)cache["NumeroLongo"];

   return n;
}

Observem como é bem simples.
Criamos uma cópia da instância do objeto Cache da requisição HTTP para explorarmos sua coleção de objetos em cache.
Depois uma verificação para saber se o objeto está em Cache ou não, se ele não estiver o nosso processamento será realizado normalmente, porém após isso, adicionamos nosso objeto no cache do servidor por um determinado tempo, no caso, 1 minuto. Assim se tivermos 1000 requisições em 1 minuto não perderemos mais 43 segundos com o processamento do servidor sendo utilizado, teremos um tempo de resposta muito menor, no caso 00:00:00.
Um bom ganho de performance não?

É uma prática que se bem utilizada pode ajudar muito sua aplicação.
A única diferença dessa implementação com a implementação em um Página web é que a Pagina já herda da Classe System.Web.Page que possui uma instância do Cache da requisição atual, onde não precisamos declarar o nosso cache.

Agora é só utilizar e inovar com seus WebServices e deixar os chefes de queixo caído com a velocidade na resposta!!

Grande Abraço
Shinji

Deixe uma resposta

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

Logotipo 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 )

Foto do Google+

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

Conectando a %s