lunes, 10 de octubre de 2011

ASP.NET - Almacenamiento en caché

Se encarga de guardar datos de acceso frecuente o de páginas web enteras en la memoria, donde pueden ser recuperados con mayor velocidad. Esto puede ayudar a mejorar el rendimiento de una aplicación web.

Sobre aquellos datos que son de acceso frecuente por varios usuario y además no son modificados muy seguido pueden ser útiles de almacenar en la cache. La primera vez que se acceda en este tipo de página, se guardarán los datos en la cache y las solicitudes siguientes buscarán directamente ahí hasta que la cache expire.

En ASP.NET existen dos tipos diferentes de almacenamiento en Cache:

·         Caché de aplicaciones: Esta representa una colección que puede almacenar cualquier objeto en memoria y automáticamente removerlo en función de las limitaciones de esta, limitaciones de tiempo u otras dependencias.

·         Caché de resultados de páginas: Esta permite el almacenamiento de una página, parte de esta o una versión de la página en la memoria para reducir el tiempo de carga en las próximas peticiones.

Caché de aplicaciones:

En este tipo de almacenamiento en cache no es posible almacenar páginas.
El objeto Cache se encuentra disponible como una propiedad del objeto Page.
La clase Cache implementa el almacenamiento en memoria caché con instancias por aplicación.

La duración de la caché se encuentra asociada al de la aplicación. Si la aplicación se reinicia se vuelve a crear el objeto Cache.

Los ítems de la memoria caché se pueden asignar indicando un nombre (key) y un valor (value). Para recuperar estos ítems se deberá evaluar la existencia del nombre indicado (key) y luego asignar el valor a algún objeto. Si el valor buscado es nulo puede que nunca se haya almacenado o que haya expirado de la caché.

Por ejemplo:

Cache[“test”] = “Almaceno esto en cache”;
If (Cache[“test”]!=null)
   Label1.Text = (string)Cache[“test”];
Else
   Label1.Text = “Se borró”;

La caché permite almacenar cualquier tipo de objeto, incluyendo los tipos de objeto personalizados. Eso si recuerde que al momento de recuperar los valores se deberán convertir al tipo de objeto correcto.

Así como en el ejemplo anterior se almacenó un elemento dentro de la caché asignando un key y value, también es posible realizarlo mediante el método Insert. Este método posee varias sobrecargas que permiten además de agregar los valores anteriores, agregar las dependencias, directivas de expiración, una notificación a la aplicación antes de que se elimine el elemento de la caché y además la prioridad de eliminación del elemento. Vale aclarar que si el elemento a insertar ya existe, el mismo será reemplazado.

Otro método que se puede utilizar para agregar elemento en la caché es el Add, el cual tiene las mismas sobrecargas que el método insert pero en el caso de ejecutarse y un elemento con el mismo nombre ya existe, entonces el método generará un error.

Las sobrecargas de los métodos Insert y Add son las siguientes:

·         Key: (System.String) El nombre del objeto que será utilizado para acceder a los objetos almacenados en la colección de caché.
·         Value: (System.Object) Son los datos de tipo objeto que se quieren guardar.
·         Dependencies: (System.Web.Caching.CacheDependency) Identifica un archivo o un Key con otro elemento de
la memoria caché. En el momento en que el archivo o elemento cacheado cambia, se ejecutará un trigger que dará lugar a que sea removido de la caché.
·         absoluteExpiration: (System.DateTime). Es el tiempo que tiene un objeto para expirar y ser removido de la caché. Si se utiliza slidingExpiration, el parámetro absoluteExpiration debe ser NoAbsoluteExpiration. El tiempo de este parámetro no tiene en cuenta si fue accedido recientemente por un usuario.
·         slidingExpiration: (System.TimeSpan) Es el tiempo que debe transcurrir luego del último acceso al objeto para que expire y sea borrado de la caché. Si se utiliza una absolutExpiration, el parámetro slidingExpiration debe ser NoSlidingExpiration.
·         Priority: (System.Web.Caching.CacheItemPriority) Es un enumerado que se puede utilizar para determinar que objetos se eliminarán primero cuando la memoria caché empieza a agotarse. Cuanta más baja sea la prioridad, más pronto se eliminarán. Los valores de prioridad son los siguientes:
§  Low
§  BelowNormal
§  Normal (por defecto)
§  AboveNormal
§  High
§  NotRemovable
·         onRemoveCallback: (System.Web.Caching.CacheItemRemovedCallback) Es un delegado que se llama cuando se quita un objeto de la memoria caché. Se puede utilizar para enviar notificaciones a aplicaciones cuando algún objeto se elimina de la caché.

En el próximo artículo voy a comentar sobre el tipo de almacenamiento "Caché de resultados de páginas".


Ejemplos (en C#):

Dependencies:

En el siguiente ejemplo se agregan 2 dependencias al objeto de la cache.

System.Web.Caching.CacheDependency dependencia1 = new System.Web.Caching.CacheDependency(Server.MapPath("archivo.txt"));
string[] keyDependencia2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dependencia2 = new System.Web.Caching.CacheDependency(null, keyDependencia2);
System.Web.Caching.AggregateCacheDependency DependenciasAgregadas = new System.Web.Caching.AggregateCacheDependency();
DependenciasAgregadas.Add(dependencia1);
DependenciasAgregadas.Add(dependencia2);
Cache.Insert("ArchivoCache", File.ReadAllText("archivo.txt"), DependenciasAgregadas);


absoluteExpiration:

en el ejemplo se le agregan 30 minutos al objeto para eliminarse:

Cache.Insert("ArchivoCache", "CacheContents", null, DateTime.Now.AddMinutes(30),Cache.NoSlidingExpiration);

slidingExpiration:

en este ejemplo se indican 30 minutos para la eliminación si el objeto no se utiliza:

Cache.Insert("CacheItem", "Item en cache", null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); // horas, minutos, segundos.

priority:

en el ejemplo siguiente se asigna prioridad alta al objeto s:

String s = “Cadena a guardar”; Cache.Insert("Cadena",s, null, DateTime.Now.AddMinutes(30), Cache.NoSlidingExpiration, CacheItemPriority.High, onRemove)