Asp.Net Caching (Eventos)

0 views
Skip to first unread message

Felipe Oriani

unread,
Aug 23, 2010, 1:33:49 PM8/23/10
to dotn...@googlegroups.com
Olá amigos, estou desenvolvendo uma aplicação Asp.Net MVC e tenho uma dúvida sobre caching.

Tenho uma lista de objetos que conforme o passar de segundos, vários usuários irão escrever nela 
(novos objetos serão incluídos) e tende a crescer cada vez mais. Para atingir uma performace legal, acredito que mante-la em cache seria o ideal.

Como cache tem timeout, uma hora este cache irá expirar e então pretendo persistir estas informações em um banco de dados. 

Minha dúvida é, como saberei o momento em que o cache irá expirar para eu poder ler a lista e persistir no BD ?
Existe alguma forma de programar um evento ou delegate para este momento, ou algo do tipo ?

Não sei se é possível fazer nativamente isso, ou se precisarei de alguma biblioteca adicional (Aceito recomendações se for o caso)

Bem é isso, se alguém puder me ajudar agradeço =D

Obrigado!
Abraços



--
______________________________________
Felipe B. Oriani
@felipeorianifelipeoriani.com.brfbor...@gmail.com

"...Trabalhe quanto puder, tornando-se útil quanto possível..." , por André Luiz

Felipe Augusto

unread,
Aug 24, 2010, 8:07:01 AM8/24/10
to dotn...@googlegroups.com
Então Chará eu uso a enterprise library. Caching Application Block.

http://msdn.microsoft.com/en-us/library/ff650180.aspx

Espero ter ajudado,

quanto a descobrir o cache espirado, pode testar se o mesmo é igual a null.


--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
".Net Br" no Google Groups: http://groups.google.com.br/group/dotnet_br/
E-mail do Grupo: dotn...@googlegroups.com
"Your Potential. Our Passion."
 
==============================
Comunidade de desenvolvedores PHP
"LISTA PHP" no Google Groups: http://groups.google.com.br/group/listaphp
E-mail do Grupo: list...@googlegroups.com

Bruno Gross

unread,
Aug 24, 2010, 8:20:15 AM8/24/10
to dotn...@googlegroups.com
o enterprise library ainda evolui?
 
desculpe a ignorância, mas desde o 2005 eu não uso mais...

2010/8/24 Felipe Augusto <yahi...@gmail.com>



--
Visite: www.UpaLele.com

att.
Bruno Gross
Celular: (21) 78545483
Rádio ID: 83*39379

José Ferro

unread,
Aug 24, 2010, 8:21:54 AM8/24/10
to dotn...@googlegroups.com
Oi Felipe,

Eu também utilizo o cache do E.L.
Ele tem recurso de tempo de existência dos objetos inseridos.
E é até simples de utilizá-lo.

[]'s

José Ferro

Gaspar Santos

unread,
Aug 24, 2010, 8:41:08 AM8/24/10
to dotn...@googlegroups.com
Felipe,

O mecanismo de cache do ASP.NET permite o controle de expiração do conteúdo, dependência inclusive de alteração de arquivos...
No caso que indicasses, procura algo sobre CacheItemRemovedCallback que é o delegate para esse controle de expiração.

Gaspar

Em 24 de agosto de 2010 09:07, Felipe Augusto <yahi...@gmail.com> escreveu:

Felipe Oriani

unread,
Aug 24, 2010, 8:54:35 AM8/24/10
to dotn...@googlegroups.com
Obrigado a todos, estudarei as possibilidade, mas acredito que seja isso mesmo que o Gaspar sugeriu!
Preciso persistir as informações em BD sem forças a expiração do Cache!
Obrigado
Att,


2010/8/24 Gaspar Santos <gasper...@gmail.com>

Andre Baltieri

unread,
Aug 24, 2010, 11:42:14 AM8/24/10
to .NET Brasil
Fala Felipe,

Não tem algo parecido com o



André Baltieri

ASP.NET/C# Application Specialist - IBM Brasil
IBM Academic Ambassador
IBM Academic Inicitive Member

Blog:
http://www.insidedotnet.com.br/
E-mail: andre.b...@insidedotnet.com.br
Twitter: http://www.twitter.com/andrebaltieri/

   

"O futuro tem muitos nomes. Para os fracos é o inalcansável. Para os temerosos, o desconhecido. Para os valentes é a oportunidade."




From: fbor...@gmail.com
Date: Tue, 24 Aug 2010 09:54:35 -0300
Subject: Re: [.Net - BR] Asp.Net Caching (Eventos)
To: dotn...@googlegroups.com

Andre Baltieri

unread,
Aug 24, 2010, 11:42:58 AM8/24/10
to .NET Brasil

Fala Felipe, não tem algo parecido com o Session_End, só que para cache?? no Global.asax?

protected void Session_End(Object sender, EventArgs e)
{
   
// Remove user from HashTable
}

Abraços



André Baltieri

ASP.NET/C# Application Specialist - IBM Brasil
IBM Academic Ambassador
IBM Academic Inicitive Member

Blog:
http://www.insidedotnet.com.br/
E-mail: andre.b...@insidedotnet.com.br
Twitter: http://www.twitter.com/andrebaltieri/

   

"O futuro tem muitos nomes. Para os fracos é o inalcansável. Para os temerosos, o desconhecido. Para os valentes é a oportunidade."




From: fbor...@gmail.com
Date: Tue, 24 Aug 2010 09:54:35 -0300
Subject: Re: [.Net - BR] Asp.Net Caching (Eventos)
To: dotn...@googlegroups.com

Felipe Oriani

unread,
Aug 24, 2010, 1:51:36 PM8/24/10
to dotn...@googlegroups.com
Fala André, acredito que não cara!
Acho que a sugestão do Gaspar irá solucionar o problema, vou testar logo mais!
Obrigado


2010/8/24 Andre Baltieri <andreb...@hotmail.com>

Felipe Augusto

unread,
Aug 24, 2010, 8:43:51 AM8/24/10
to dotn...@googlegroups.com

prep-f...@ucf.edu.cu

unread,
Aug 24, 2010, 6:25:16 PM8/24/10
to dotn...@googlegroups.com
A dias estava vendo um video de "How do I" que falava sobre cache.

Procura por "A Tour of Caching"  no site de "How do I", acho que pode ajudar.

Ou se quiser te envio o codigo utilizado no video.

Abrazos.
Leza Morais Lutonda, Lemol-C
...no paro sin llegar ahi...
¡no hay dudas!


Convencion Internacional de Psicologia y Ciencias Sociales y Humanas

Cienfuegos, Cuba, del 19 al 22 de abril del 2011

http://promociondeeventos.sld.cu/hominis2011

Felipe Oriani

unread,
Aug 25, 2010, 7:51:18 AM8/25/10
to dotn...@googlegroups.com
Valeu pessoal, consegui resolver de uma forma simples e objetiva, obrigado!
Porém tenho uma dúvida a respeito de segurança...  terei vários usuários lendo e escrevendo neste cache simultaneamente. Existe algum risco ? Digo, do cache ficar corrompido e eu perde-lo ? Existe alguma forma de resolver isso ?

Obrigado!

segue o exemplo funcionando que fiz com o delegate CacheItemRemovedCallback:

        private const string chave = "_cache";
        public string ValorEmCache
        {
            get
            {
                if (context.Current.Cache[chave] == null)
                {
                    var onRemoveCallback= new CacheItemRemovedCallback(this.PersistCacheAndRemove);

                    context.Current.Cache.Add(chave, DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"), null,
                                              DateTime.Now.AddSeconds(15), Cache.NoSlidingExpiration,
                                              CacheItemPriority.Normal, onRemoveCallback);
                }

                return context.Current.Cache[chave].ToString();
            }
        }
        private void PersistCacheAndRemove(string key, object value, CacheItemRemovedReason reason)
        {
            //aqui persistiria em alguma fonte...
            using (var streamWriter = new StreamWriter("C:\\cache.txt", true))
            {                
                streamWriter.WriteLine(value.ToString());
                streamWriter.Flush();
                streamWriter.Close();
            }
        }


Gaspar Santos

unread,
Aug 25, 2010, 8:29:50 AM8/25/10
to dotn...@googlegroups.com
Felipe,

Maravilha que conseguistes resolver a bronca ai.
A classe  System.Web.Caching.Cache é thread safe, porém em relação a possíveis problemas é possível afirmar que se perderes o domínio da aplicação (alterar algo no webconfig, reiniciar o IIS ...) o conteúdo do cache é perdido.
A escrita é feita diretamente (Cache[] = valor) ou tem alguma propriedade para isso? Talvez pensar eme tratar a situação onde por exemplo alguma thread tenta escrever no cache quando ele teve o valor removido.

Gaspar

Felipe Augusto

unread,
Aug 25, 2010, 8:49:12 AM8/25/10
to dotn...@googlegroups.com
Para resolver o uso do Cache é que indiquei a Enterprise library, pois alem das melhores práticas a possibilidade de alterar o local de armazenamento somente alterando a configuração, com o auxílio de outros blocos da biblioteca, mas de forma nativa o que ela faz é so utilizar o cache.

Felipe Oriani

unread,
Aug 25, 2010, 9:17:17 AM8/25/10
to dotn...@googlegroups.com
Olá pessoal, obrigado pelas respostas!

@Gaspar, no meu caso real utilizarei uma IList<T> em Cache e penso em uma propriedade para encapsular o mecanismo.... acho que não terei problemas então ou terei?

@Felipe, legal a Enterprise Library, conheço alguma coisa dela, já usei outros blocos mas queria evitar o uso de terceiros o máximo possível!


2010/8/25 Felipe Augusto <yahi...@gmail.com>

Gaspar Santos

unread,
Aug 25, 2010, 9:49:28 AM8/25/10
to dotn...@googlegroups.com
Felipe,
A coleção contida no objeto (IList) não é thread safe, dai sugiro implementar algo de sincronização no acesso a essa coleção, na classe onde vais encapsular.

Tenta algo como...

class xxx
{
  private static object syncRoot = new Object();

  lock (syncRoot)
  {              
        // operações sobre a coleção (thread-safe).
  }
}

Gaspar

Felipe Oriani

unread,
Aug 25, 2010, 10:32:35 AM8/25/10
to dotn...@googlegroups.com
Entendi Gaspar, legal meu... utilizarei lock(obj) pra tratar o thread-safe da coleção!
Obrigado novamente
[]'s


2010/8/25 Gaspar Santos <gasper...@gmail.com>
Reply all
Reply to author
Forward
0 new messages