El almacenamiento en caché de memoria (a menudo simplemente conocido como almacenamiento en caché) es una técnica en la que las aplicaciones informáticas almacenan temporalmente datos en la memoria principal de un equipo (es decir, memoria de acceso aleatorio o RAM) para permitir la recuperación rápida de esos datos. La memoria RAM que se utiliza para el almacenamiento temporal se conoce como caché. Dado que el acceso a la RAM es significativamente más rápido que el acceso a otros medios, como unidades de disco duro o redes, el almacenamiento en caché ayuda a que las aplicaciones se ejecuten más rápido debido a un acceso más rápido a los datos. El almacenamiento en caché es especialmente eficiente cuando la aplicación muestra un patrón común en el que accede repetidamente a los datos a los que se accedió previamente. El almacenamiento en caché también es útil para almacenar cálculos de datos que, de otro modo, requerirían mucho tiempo de procesamiento. Al almacenar los cálculos en una caché, el sistema ahorra tiempo al evitar la repetición del cálculo.
¿Cómo funciona el Almacenamiento en Caché de Memoria?
El almacenamiento en caché de memoria funciona reservando primero una porción de RAM para ser utilizada como caché. Cuando una aplicación intenta leer datos, normalmente de un sistema de almacenamiento de datos como una base de datos, comprueba si el registro deseado ya existe en la caché. Si lo hace, entonces la aplicación leerá los datos de la caché, eliminando así el acceso más lento a la base de datos. Si el registro deseado no está en la caché, la aplicación lee el registro de la fuente. Cuando recupera esos datos, también escribe los datos en la memoria caché para que, cuando la aplicación necesite esos mismos datos en el futuro, pueda obtenerlos rápidamente de la memoria caché.
Dado que el tamaño de la caché es limitado, eventualmente se tendrán que eliminar algunos datos que ya están en la caché para dejar espacio para los nuevos datos a los que la aplicación accedió más recientemente. Esto significa que el sistema de almacenamiento en caché necesita una estrategia sobre la que eliminar registros para hacer espacio. La estrategia dependerá de la naturaleza de los accesos a los datos de la aplicación y, por lo general, intentará eliminar registros a los que no se espera que se vuelva a acceder pronto. Por ejemplo, una estrategia de uso menos reciente (LRU) eliminará el registro cuyo último acceso fue anterior a cualquier otro registro en la caché. La suposición aquí es que si ha pasado mucho tiempo desde que se accedió al registro, es probable que no se vuelva a acceder pronto. O para decirlo de otra manera, es probable que los registros que se usaron más recientemente se vuelvan a usar pronto. Una estrategia de uso menos frecuente (LFU) implica rastrear el número de accesos de cada registro en la caché y eliminar el registro con la menor cantidad de accesos. La suposición aquí es que un registro que se usa con poca frecuencia probablemente no se vuelva a usar pronto.
El desafío con las cachés es cómo minimizar los «errores de caché», p. ej. intentó lee por la aplicación de registros que no están en la caché. Si tiene demasiadas fallas, la eficiencia de su caché disminuye. Una aplicación que solo lee datos nuevos no se beneficiaría de una caché y, de hecho, exhibiría un rendimiento menor debido al trabajo adicional de verificar la caché y, sin embargo, no encontrar el registro deseado en ella. Una forma de mitigar este desafío es aprovechando cachés más grandes. Esto a menudo no es práctico en un solo equipo, por lo que las cachés distribuidas son opciones populares para acelerar las aplicaciones que necesitan acceder a conjuntos de datos más grandes. Una caché distribuida agrupa la memoria RAM de varios equipos conectados en un clúster para que pueda crear una caché más grande que pueda seguir creciendo añadiendo más equipos al clúster. Tecnologías como Hazelcast IMDG se pueden utilizar como un clúster distribuido para acelerar aplicaciones a gran escala.
Otro desafío de las cachés es el riesgo de leer datos «obsoletos», en los que los datos de la caché no reflejan los datos más recientes de la fuente subyacente. A menudo, este riesgo es una compensación aceptable para el rendimiento de la aplicación. En los casos en que no lo sea, corresponde a la aplicación que actualiza la fuente de datos subyacente actualizar el registro en cuestión en la caché.
Ejemplos de casos de uso
Un caso de uso amplio para el almacenamiento en caché de memoria es acelerar las aplicaciones de bases de datos, especialmente aquellas que realizan muchas lecturas de bases de datos. Al reemplazar una parte de las lecturas de la base de datos con lecturas de la caché, las aplicaciones pueden eliminar la latencia que surge de los accesos frecuentes a la base de datos. Este caso de uso se encuentra típicamente en entornos donde se ve un gran volumen de accesos a datos, como en un sitio web de alto tráfico que cuenta con contenido dinámico de una base de datos.
Otro caso de uso implica la aceleración de consultas, en la que los resultados de una consulta compleja a una base de datos se almacenan en la caché. Las consultas complejas que ejecutan operaciones como la agrupación y el orden pueden tardar mucho tiempo en completarse. Si las consultas se ejecutan repetidamente, como es el caso de un panel de inteligencia empresarial (BI) al que acceden muchos usuarios, almacenar los resultados en una caché permitiría una mayor capacidad de respuesta en esos paneles.
Temas relacionados
Caché de JCache / Java
Error de caché
Caché de segundo Nivel Hibernado
Lectura adicional
Caso de uso de almacenamiento en caché
Almacenamiento en caché de bases de datos
Hazelcast Nube
Almacenamiento en caché Hecho de botín: Caché de primavera + Hazelcast