Caché en la Capa de Acceso a Datos

En muchas aplicaciones suele ser comíºn que existan conjuntos de datos que cambien muy poco o nada a lo largo del tiempo. Por ejemplo, si almacenamos en nuestra base de datos tablas con Paí­ses, Provincias, Comunidades Autónomas… lo más seguro es que los registros que conformen la tabla no varí­en en el tiempo o si lo hacen sean cambios totalmente excepcionales.
Si esto es así­ e imaginando el tí­pico formulario web donde tenemos que seleccionar un desplegable con provincias, podrí­a resultar ineficiente hacer una consulta a base de datos por cada carga del formulario que realizaran los distintos usuarios de la aplicación. ¿Para qué vamos a consultar otra vez la base de datos si podemos asegurar en un 99% que no habrán cambiado? Sobre todo teniendo en cuenta que el acceso a base de datos suele ser de lo que más penaliza el rendimiento de una aplicación.
Una buena idea serí­a que en segíºn que métodos de nuestra capa de acceso a datos, antes de realizar una consulta directa a una tabla, comprobáramos si los datos ya se han almacenado en entidad fí­sica mucho más rápida de acceder que la base de datos, por ejemplo, en una caché. Inicialmente esta caché estarí­a vací­a, en la primera carga se rellenarí­a a partir de la información de la base de datos, y el resto de veces ya se atacarí­a siempre a la memoria cache.
El resultado, claramente es un tiempo de respuesta mucho más bajo en cada transacción de este tipo.
¿Algíºn ejemplo con pseudo-codigo?
public Lista<ProvinciaDTO> GetProvincias()
{
  if (IsVacio(CacheProvincias))
  {
    CacheProvincias = RellenaConAccesoATablaProvincias();
  }
  return TransformaCacheEnLista(CacheProvincias);    
}
Como véis sólo rellenaremos la caché de provincias con los datos de la tabla si la caché está vací­a, si no lo está, directamente retornaremos los datos desde la caché.
En el pseudo-código no se están resolviendo temas de concurrencia (cómo resolver si dos usuarios al mismo tiempo comprueban si está vací­o y da verdadero), y se abstrae 100% la solución propia de cómo cachear precisamente para hacerlo independiente de la tecnologí­a en que queráis aplicar el método.
Otro tema interesante que podrí­an incorporarse, es la posibilidad de que la caché caduque, es decir, que no se almacene la información en la caché de forma infinita mientras la aplicación no se reinicie, si no que se establezcan periodos temporales en los como máximo la caché será renovada. Por ejemplo si tenemos una tabla que almacene Marcas puede que nos interese que se reuneve la caché cada 24 horas ya que almenos una vez al dí­a se añade una marca nueva (me lo estoy inventando obviamente, es por dar un ejemplo). Si ante la petición de un usuario se comprueba que la caché está caducada, esta se vaciarí­a y se volverí­a a rellenar de forma automática tras una consulta a la tabla correspondiente de la base de datos.
¿Interesante?
Saludos.
Miguel.
 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.