Al insertar un elemento en el Cache de Aplicación, se pueden especificar elementos que determinarán cuándo el objeto es removido del cache. Entre estos elementos tenemos las dependencias, implementadas a través de la clase CacheDependency y que permiten especificar que el objeto cacheado es dependiente de un archivo o de otro elemento en el Cache de Aplicaciones. También tenemos la expiración basada en el tiempo (time-based expiration) definida mediante dos atributos:
La Expiración Absoluta (AbsoluteExpiration) , que define un punto en el tiempo a partir del cual el objeto cacheado es quitado del Cache. En general, se especifica sumando una cantidad de minutos o segundos a DateTime.Now. El siguiente ejemplo muestra cómo se agrega un objeto al cache, que será removido luego de 60 segundos.
Cache.Insert("testkey", "testvalue", null, DateTime.Now.AddSeconds(60), System.Web.Caching.Cache.NoSlidingExpiration);
La Expiración Deslizante (SlidingExpiration) define un período de tiempo máximo entre accesos al objeto cacheado, luego del cual el mismo es removido del cache. Por ejemplo, si definimos un intervalo de 10 segundos, si el objeto es agregado al Cache y luego leído antes de que transcurran los 10 segundos, el mismo se mantendrá en cache por 10 segundos más a partir de ese momento, y así sucesivamente. Si en algún momento transcurren más de 10 segundos desde que se accedió por última vez al objeto, el mismo es removido del Cache. La expiración deslizante se define como un TimeSpan. El siguiente ejemplo muestra cómo se agrega un objeto al cache con una expiración deslizante de 10 segundos.
Cache.Insert("test1", "testvalue", null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10));
ASP.NET no permite especificar ambos tipos de expiración basada en el tiempo simultaneamente. Sólo se puede definir una expiración absoluta o una deslizante.
Sin embargo, la utilización de una expiración deslizante para un objeto que sea accedido muy frecuentemente, podría hacer que se acceda permanentemente al objeto cacheado y que nunca se refresque el cache si el objeto se modifica. Para evitar esto es aconsejable utilizar adicionalmente a la expiración deslizante, una absoluta.
¿Bien, cómo hacemos esto si ASP.NET no permite definir ambos elementos a la vez? Insertando un segundo objeto en el cache, y una dependencia hacia el mismo:
Cache.Insert("trigger", "anything", null, DateTime.Now.AddSeconds(60),
System.Web.Caching.Cache.NoSlidingExpiration);
string[] dependencyKeys = {"trigger"};
var dependency = new CacheDependency(null, dependencyKeys);
Cache.Insert("test1", "testvalue", dependency, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10));
Analicemos cada línea:
La primera línea, inserta en el cache un nuevo objeto con la clave “trigger”. Este es un objeto “auxiliar”, el valor de este objeto no nos importa, sólo nos importa que tenga definida una expiración absoluta de 60 segundos.
La segunda línea, crea un array de strings para ser pasado al constructor del CacheDependency y que contiene sólo un elemento que es la clave del objeto definido en la línea 1.
La tercera línea, crea un objeto CacheDependency, que especifica una dependencia con el objeto del Cache de clave “trigger”, utilizando el array definido en el paso 2.
La cuarta línea, inserta nuestro objeto en el cache con una expiración deslizante de 10 segundos, y además, le define la dependencia del paso anterior.
De esta forma este objeto se mantendrá en el cache mientras sea leído con una frecuencia menor a 10 segundos, pero será removido a los 60 segundos independientemente de esto, ya que en ese momento será removido el objeto “trigger” y al depender del mismo, nuestro objeto también será removido.
Espero les sirva.
Hasta la próxima!