Manejando el Cache en ASP.NET

Hace unos dias tuve la necesidad de implementar una pequeña rutina de cache en una sitio desarrollado en ASP.NET, y me encontre que el manejo de objetos en cache en .net es muy sencillo y ofrece varias opciones para las distintas necesidades que tenemos en nuestros proyectos.

El espacio de nombres (namespace) que debemos usar es: System.Web.Caching, por lo tanto es necesario incluirlo con la sentencia using System.Web.Caching … en C#

Es asi que ASP.NET nos permite tener el manejo de Cache basado en politicas de dependencia o expiracion de manera que el manejo de Cache se hace manera automatica. De manera que cuando agregamos un item nuevo al Chache tenemos la opcion de especificarle al CLR cuando tenemos que invalidar dicho item, todo esto de manera automatica, es ese el concepto de dependencia.

Las dependencias que nos ofrece ASP.NET son: por archivo, por llave y por tiempo.

DEPENDENCIA POR ARCHIVO (file dependency)

Esta dependecia se usa para aquellos casos en los que queremos que el item que creamos en cache se invalide basado en algun cambio en cierto archivo fisico, por ejemplo en caso de que se este leyendo informacion desde un archivo xml y esta informacion se guarda en Cache mientras no se haya modificado el archivo, en el momento que el archivo cambia la dependencia lo detecta y de esta manera invalida el item de Cache, esto por supuesto debe ir acompañado de un manejo de Cache en codigo para detectar que el item ya fue invalidado y que necesita leer nuevamente el archivo desde su localizacion y guardarlo nuevamente en Cache.

CacheDependency cDep = new CacheDependency(”Clientes.xml”);
Cache.Insert(”Clientes”, xmlObject, cDep);

… donde xmlObject es el objeto que contiene la informacion que fue leida del xml

DEPENDENCIA POR LLAVE (key dependency)

Esta dependencia es usada cuando queremos invalidar algun item que agregamos a Cache basados en el cambio de algun otro item existente en el Cache, por ejemplo si tenemos el nombre en una item del cache y el apellido en otro y en caso de que el nombre cambie entonces el item del cache que contien el apellido deberia de ser invalidado 

Cache["Nombre"] = “Roberto”;
String[] dependencyKey = newString[1];
dependencyKey[0] = “Nombre”;
CacheDependency cDepend = new CacheDependency(null, dependencyKey);
Cache.Insert(”Apellido”, “Galindo Venzor”, cDepend);

DEPENDENCIA POR TIEMPO (time expiration)

Esta es una de las mas comunes, ya que la mayoria de los casos deseamos tener un objeto en cache por cierto tiempo. Este metodo tiene dos opciones: podemos definir un tiempo exacto en el que queremos que el item sea invalidado o podemos definir un periodo de tiempo en el cual el objeto puede estar en cache si que haya sido usado.

Podemos usar la primera opcion cuando queremos que nuestros items se actualizen por ejemplo una vez al dia en la mañana.

Podemos usar la segunda opcion si deseamos que los objetos se mantengan en cache cuando son usados de manera frecuente. Este metodo es tambien llamado en ingles: “sliding window”

Cache.Insert(“Clientes”, clientesObject, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(30));

esta instruccion hara que el objeto se mantenga en memoria 30 segundos si nadie hace uso de el, de lo contrario en cuanto algun proceso haga uso de este objeto el “cronometro” se reinicia y se inicia la cuenta.

… espero que sea de utilidad… :D

2 comentarios

  1. Eber Irigoyen dijo:

    Abril 30, 2008 en 12:48 pm

    muy bueno, justo acabo de escribir una implementacion para el cache, espero bloguearla pronto

  2. Roberto Galindo Venzor dijo:

    Mayo 1, 2008 en 8:18 am

    Gracias Eber, cuando tengas listo tu post nos compartes el link… saludos

Escribe un comentario