Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«

Et - Bill
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com

Interessantes truques com Cache em aplicações Web

Pesquisa personalizada
Pesquisar Dicas:






 

Vamos tomar como base a página web que construimos no artigo http://www.bufaloinfo.com.br/artigos/artigo2107.asp , sobre personalização da start page do VS. Essa página será muito acessada mas os dados mudarão pouco. Portanto esta página é uma excelente candidata para a aplicação de cache com longa duração.

Podemos, porém, dividir a necessidade de cache nesta página em 2 pontos principais :

- Acesso a dados. Devido a frequencia com que os dados mudam podemos aplicar aqui um cache razoável. Porém a análise com relação ao tempo de cache a ser aplicado deve ser feita levando-se em consideração "Qual o tempo máximo que uma informação pode levar para aparecer no resultado ?"

O ideal é que pudessemos ter uma ligação imediata do banco com o cache, fazendo com que no momento em que os dados forem atualizados no banco o cache seja eliminado. Isso é possível de se fazer usando triggers e com um acesso razoável aos servidores, ou com uso do Yukon. Mas quando utilizamos um provedor de hospedagem e temos acesso limitado aos servidores, a perfeição de ter a eliminação imediata do cache infelizmente se torna impossível.

- Processamento. Podemos observar no exemplo citado que é feito um considerável processamento com os dados. Esse processamento também poderia ser colocado em Cache. O acesso aos dados pode ter um cache de, por exemplo, 10 minutos. Mas se ao fazermos o acesso aos dados descobrirmos que nada mudou, ao invés de repetirmos o processamento todo novamente (e assim repeti-lo a cada 10 minutos), podemos simplesmente devolver o antigo resultado do processamento, do cache. Desta forma a cada 10 minutos iriamos ao banco para saber se existe alguma mudança nos dados, mas se descobrirmos que não existe continuamos a devolver o conteúdo do cache.

O Problema

Se aplicarmos o outputcache, não temos controle sobre o acesso a dados. Então se utilizarmos um outputcache de, por exemplo, 24 horas, uma informação pode levar até 24 horas para aparecer na saida da página.

Se, por outro lado, fizermos uma inserção de forma "manual" dos datasets no objeto de cache, o processamento estaria sempre sendo refeito ou, combinando isso com o outputcache, estaria sendo refeito, quem sabe, de 10 em 10 minutos.

Como então combinar as duas necessidades de cache ?

A solução

A solução para este problema está na aplicação do atributo varyByCustom na tag outputcache.

O atributo varyByCustom permite que façamos a criação de uma variável personalizada que determinará se o ASP.NET deverá entregar o conteúdo existente no cache ou re-processar a página. A cada pedido da página o ASP.NET nos pergunta qual o valor da variável. Se houver se mantido o mesmo, então o ASP.NET entrega a página do cache, caso contrário, re-processa.

Então podemos utilizar o seguinte procedimento para tratar o cache :

- Inserir os dataSets no cache por um período qualquer, 10 minutos por exemplo.

- Inserir no cache o hash dos datasets pelo mesmo período. O calculo de um Hash nós vimos em um artigo aqui mesmo neste site, em http://www.bufaloinfo.com.br/artigos/artigo2405.asp

- Programar a devolução do valor da variável definida no varybycustom, da seguinte forma :

A) Verifica se o hash está no cache. Se estiver, devolve o hash. Isso garantirá um cache total de 10 minutos, por exemplo.

B) Se o hash não estiver no cache, vai ao banco e recupera novamente os dados. Então a ida ao banco será a cada 10 minutos.

C) Recalcula e devolve o hash.

Resultado

O cache da página será baseado no hash dos datasets utilizados, portanto a ida ao banco será a cada 10 minutos (ou qualquer tempo que você definir), mas o processamento da página só acontecerá quando os dados realmente mudarem, sem um limite de tempo para isso.

O Hash controlará o cache de processamento da página. Enquanto os dados forem os mesmos o hash será o mesmo e fará com que a página seja entregue do cache e não re-processada.

Alternativas e Observações

Para uma aplicação como a de personalização da start page (artigo em http://www.bufaloinfo.com.br/artigos/artigo2107.asp) haveria alternativa mais simples. Poderíamos guardar no objeto de cache o resultado do processamento (xmldocument) e devolve-lo do cache quando desejarmos. Assim evitamos lidar com o varybycustom. Porém não é toda a página que terá esta alternativa.

É claro que ter 100% de precisão, com o banco avisando quando as informações forem alteradas, seria preferível. Mas quando isso não for possível essa combinação de cache de dados e cache da página se torna bem interessante e pode facilmente ser transformada em um pattern de desenvolvimento para a camada de interface.



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página