Tutorial de ASP.NET
Vista Previa de ASP.NET 2.0

Cacheando los datos de la página

ASP.NET dispone de un motor de caché completo que puede ser usado por las páginas para almacenar y recuperar cualquier tipo de objeto a través de las peticiones HTTP. La caché de ASP.NET es privada para cada aplicación y almacena los objetos en memoria. La duración de la cache es equivalente a la duración de la aplicación; esto significa que cuando una aplicación se reinicia, la cache se vuelve a crear.

La caché proporciona una interface con un Diccionario simple que permite a los programadores facilmente poner objetos en la caché y recuperarlos. En elcaso más simple, volcar un elemento en la cache es como añadir un elemento a un diccionario:

 Cache["myKey"] = myValue;

La recuperación de datos del cache es muy simple. Hay que tener en cuenta que debe de comprobarse la existencia del objeto en cache antes de recuperarlo, como se muestra en el ejemplo siguiente:



myValue = Cache["mykey"];
if(myValue != null ) {
DisplayData(myValue);
}

Usando los datos de la Caché

El siguiente ejemplo muestra otro uso sencillo de la caché. Ejecuta una consulta a la base de datos y guarda en caché el resultado, qué se seguirá usando durante la vida de la aplicación. Cuando ejecutéis el ejemplo, observad el mensaje en la parte inferior de la página. Con la primera petición, indica que los datos han sido recuperados de la base de datos. Despues de refrescar la página, se apunta que se ha usado la copia de la caché.

C# Datos de Caché

El siguiente ejemplo muestra un elemento de la caché que depende de un fichero XML. Es similar al primer ejemplo pero en este caso, el dato es recuperado de una fuente XML en vez de un servidor de base de datos.  Cuando el dato es guardado en la caché, el fichero XML se le añade como una dependencia. Cuando se añade un nuevo registro usando el formulario al final de la página, el fichero XML se actualiza y el elemento de la caché se refresca.

C# Data Cache 2

Fíjese que el fichero de dependencia se añade usando Cache.Insert y mediante un objeto CacheDependency referenciando al fichero XML. Puede usarse el mismo mecanismo para dependencias personalizadas.


Cache.Insert("MyData", Source,
new CacheDependency(Server.MapPath("authors.xml")));

Un elemento de la caché puede depender de uno o varios ficheros o claves. Como vimos antes, una aplicación también puede establecer la política de caducidad de un elemento de la cache. El siguiente código establece un tiempo de caducidad absoluto para el objeto de la caché.


Cache.Insert("MyData", Source, null,
DateTime.Now.AddHours(1), TimeSpan.Zero);

El parametro más importante es la llamada a DateTime.Now.AddHours(1), que indica que el elemento caduca una hora después de que se ha insertado. El último argumento, TimeSpan.Zero, indica que no hay una política relativa de caducidad en este item.

El siguiente código muestra como estableces una política de caducidad relativa. Se inserta un item en la caché que caduca 20 minutos después de su último acceso. Observad el uso de DateTime.MaxValue, que indica que no se establece una política absoluta de caducidad para este elemento.


Cache.Insert("MyData", Source, null, DateTime.MaxValue,
TimeSpan.FromMinutes(20));

Para aquellas aplicaciones que necesitan una funcionalidad más sofisiticada, el cache de ASP.NET suporta barrido, caducidad y dependencias de ficheros y de claves.

Barrido de los elementos de cache

La técnica del barrido es el proceso que intenta quitar de la caché elementos poco usados o no importantes cuando la memoria empieza a escasear. Si un programador quiere controlar como se ejecuta el barrido puede establecer las características de barrido de los objetos cuando se insertan en al cache, indicando la importancia del elemento y la frecuencia con la que el elemento debe utilizarse para mantenerse disponible en cache.

Caducidad de los elementos de cache

La caducidad permite a los programadores indicar a cada elemento de la caché su tiempo de duración. Pueden indicarse se forma explicita ( por ejemplo, caduca a las 6:00) o puede indicarse de forma relativa a la ultima vez que el elemento fue usado( por ejemplo, caduca 20 minutos después de que se usó por ultima vez). Cuando un elemento caduca, es eliminado de la cache y los siguientes intentos de recuperarlo devolveran un valor null a menos que vuelva a ser insertado en la caché.

Dependencias de la cache

Las dependencias de la caché permiten establecer la validez de un elemento de la cache basado en un fichero externo o en otro elemento de la cache. Cuando una dependencia cambia, el elemento de la cache dependiente se invalida y es eliminado de la cache. Para ver un ejemplo de como usar esta prestación, imaginemos el siguiente escenario: una aplicación lee información financiera de un fichero xml que se actualiza periodicamente. La aplicación procesa los datos del fichero y crea un gráfico de objetos que representan los datos de forma visible. La aplicacion guarda en cache los datos e inserta una dependencia del fichero del cual los datos se leen. Cuando el fichero se actualiza, los datos se eliminan de la cache y la aplicación puede volver a leer el fichero e insertar la copia actualizada de los datos en la cache.

ASP.NET 2.0 permite la herencia de la clase System.Web.Caching.CacheDependency, facilitando que cualquier programador pueda reescribir su propia implementación de una dependencia de caché. Desarrollando su propiar dependencia de cache, puede aprovechar las ventajas del mecanismo de invalidación  para mantener el contenido de la caché actualizado con el origen de los datos. ésta es una forma mas eficaz y rentable de asegurar la validez de los datos y habilitar la sincronización de la cache que la utilización de la expiración de los elementos de la cache frecuentemente. ASP.NET dispone de dos tipos de dependencias construidas sobre la base de CacheDependency: AggregateCacheDependency, qué permite el uso de múltiples dependencias para elementos de cache complejos que dependan de mas de un tipo de recurso, y SqlCacheDependency, que se describe en Invalidación de la Caché SQL.