miércoles, 19 de octubre de 2011

Tecnicas de caché en C#

En esta entrada hablaremos sobre como implementar tecnicas de caché en C#.


Segun Wikipedia
"La caché es una memoria más pequeña y rápida, la cual almacena copias de datos ubicados en la memoria principal que se utilizan con más frecuencia.

[...]Cuando se necesita leer o escribir en una ubicación en memoria principal, primero verifica si una copia de los datos está en la caché. Si es así, de inmediato lee o escribe en la memoria caché, que es mucho más rápido que de la lectura o la escritura a la memoria principal"

De este extracto queda claro que la caché es una memoria secundaria cuyo acceso es mas rapido que el de la memoria principal. Sin embargo, hay que tener en cuenta que si bien es cierto que la implementacion del caché trae las ventajas mencionadas anteriormente, tambien trae riesgos a la hora de implementarlo en un ambiente de produccion. Esto es debido a que el caché tambien gasta recursos de memoria y tiempo de procesamiento, y si se hace un abuso del mismo se reduce la performance de nuestras aplicaciones.

Hablando en codigo, una implementacion de caché puede ser tan sencillo como implementar una tabla hash o un diccionario, hasta tan complicado como nuestro ingenio e imaginacion nos puedan llevar. En este ejemplo, presentaremos una clase Persona, y una clase CachePersona la cual se encargara de agregar, actualizar, listar, eliminar y comprobar la existencia de registros de la clase Persona.

Nota: La tecnica de caché presentada es un ejemplo basico de caracter ilustrativo. El proposito de este ejemplo es dar una introduccion acerca de las tecnicas de caché y como se implementan en el desarrollo de aplicativos.

La Clase Persona

public class Persona
    {
        public int Codigo { get; set; }
        public String Nombre { get; set; }
        public String Apellidos { get; set; }
    }

La Clase CachePersona

public class CachePersona
    {
        Dictionary<int, Persona> diccionario;
        public CachePersona()
        {
            diccionario = new Dictionary<int, Persona>();
        }
        public Boolean ExisteEnCache(int Codigo)
        {
            return diccionario.ContainsKey(Codigo);
        }
        public void AgregarAlCache(Persona persona)
        {
            if (!ExisteEnCache(persona.Codigo))
            {
                diccionario.Add(persona.Codigo, persona);
            }
        }
        public Persona[] ListarCache()
        {
            Persona[] personas = new Persona[diccionario.Count];
            int[] codigos = diccionario.Keys.ToArray<int>();
            for (int i = 0; i < codigos.Length; i++)
            {
                Int32 x = codigos[i];
                personas[i] = diccionario[x];
            }
            return personas;
        }
        public void EliminarDelCache(int codigo)
        {
            if (ExisteEnCache(codigo))
                diccionario.Remove(codigo);
        }
        public void VaciarCache()
        {
            diccionario.Clear();
        }
    }
Como podemos observar tenemos la clase Persona que tiene los atributos Codigo, Nombre y Apellidos. Y tenemos la clase CachePersona que maneja el caché de los objetos de tipo Persona. Esta clase internamente contiene un diccionario y expone las operaciones: ExisteEnCache para verificar si un objeto de tipo persona existe en el caché, AgregarAlCache para agregar un nuevo objeto de tipo persona al caché, ListarCache que devuelve todos los objetos de tipo persona que se encuentran en caché, EliminarDelCache que elimina un objeto de tipo persona del caché segun su codigo y VaciarCache para limpiar el caché. Para hacer uso del caché simplemente instanciamos un objeto de tipo CachePersona y hacemos uso de las operaciones de la clase.

Fuentes: Caching: Techniques and Best Practices
Caché (informatica)

1 comentario: