Hoy nos sumergimos en el mundo del almacenamiento en caché. El almacenamiento en caché es un arma secreta para crear sistemas escalables y de alto rendimiento. Hay muchos tipos de almacenamiento en caché, pero en este artículo nos centraremos en el almacenamiento en caché de objetos de backend (almacenamiento en caché de backend). Dominarlo le ayudará a crear software confiable y de alto rendimiento.
En este artículo, exploraremos:
¿Qué es el almacenamiento en caché? Exploraremos el almacenamiento en caché y explicaremos cómo almacena datos temporalmente para un acceso más rápido.
Beneficios del almacenamiento en caché : descubra cómo el almacenamiento en caché aumenta la velocidad, reduce la carga del servidor, mejora la experiencia del usuario e incluso puede reducir costos.
Patrón de almacenamiento en caché : en esta sección, analizaremos diferentes formas de utilizar el caché. Recuerde, cada enfoque tiene ventajas y desventajas, ¡así que asegúrese de elegir el patrón adecuado para sus necesidades!
Mejores prácticas de almacenamiento en caché : ahora ya sabe cómo almacenar y recuperar datos almacenados en caché. Pero, ¿cómo puede asegurarse de que sus datos almacenados en caché se mantengan actualizados? ¿Y qué pasa cuando el caché alcanza su capacidad?
Cuándo no almacenar en caché : si bien el almacenamiento en caché ofrece muchos beneficios, hay ocasiones en las que es mejor evitarlo. Implementar el almacenamiento en caché en el sistema incorrecto puede aumentar la complejidad y potencialmente incluso ralentizar el rendimiento.
Crear una aplicación escalable y de alto rendimiento consiste en eliminar los cuellos de botella y hacer que el sistema sea más eficiente. Las bases de datos a menudo obstaculizan el rendimiento del sistema debido a sus requisitos de almacenamiento y procesamiento. Esto los convierte en un componente costoso porque es necesario ampliarlos con frecuencia.
Afortunadamente, existe un componente que puede ayudar a descargar el uso de recursos de la base de datos y al mismo tiempo mejorar la velocidad de recuperación de datos: ese componente se llama caché .
La caché es un almacenamiento temporal diseñado para escribir y leer datos rápidamente. Utiliza almacenamiento de memoria de baja latencia y estructuras de datos optimizadas para operaciones rápidas. Probablemente ya hayas usado Redis o Memcached, o al menos hayas escuchado sus nombres. Estos son dos de los sistemas de almacenamiento en caché distribuido más populares para servicios backend. Redis puede incluso actuar como base de datos principal, ¡pero ese es un tema para otro artículo!
El principal beneficio del almacenamiento en caché es su velocidad. Leer datos de un caché es significativamente más rápido que recuperarlos de una base de datos (como SQL o Mongo). Esta velocidad proviene de cachés que utilizan estructuras de datos de diccionario (o HashMap) para operaciones rápidas y almacenan datos en memoria de alta velocidad en lugar de en disco.
En segundo lugar, el almacenamiento en caché reduce la carga de su base de datos. Esto permite que las aplicaciones obtengan los datos que necesitan del caché en lugar de acceder constantemente a la base de datos. Esto reduce drásticamente el uso de recursos de hardware; en lugar de buscar datos en el disco, su sistema simplemente accede a ellos desde la memoria rápida.
Estos beneficios mejoran directamente la experiencia del usuario y pueden generar ahorros de costos. Su aplicación responde mucho más rápido, creando una experiencia más fluida y satisfactoria para los usuarios.
El almacenamiento en caché reduce los costos de infraestructura. Si bien un sistema distribuido como Redis requiere sus propios recursos, los ahorros generales suelen ser significativos. Su aplicación accede a los datos de manera más eficiente, lo que potencialmente le permite reducir la escala de su base de datos. Sin embargo, esto conlleva una compensación: si su sistema de caché falla, asegúrese de que su base de datos esté preparada para manejar el aumento de carga.
Ahora que comprende el poder del almacenamiento en caché, ¡profundicemos en las mejores formas de usarlo! En esta sección, exploraremos dos categorías esenciales de patrones: patrones de escritura en caché y patrones de falta de caché . Estos patrones proporcionan estrategias para administrar las actualizaciones de la caché y manejar situaciones en las que los datos que necesita aún no están en la caché.
Los patrones de escritura dictan cómo interactúa su aplicación tanto con el caché como con su base de datos. Veamos tres estrategias comunes: reescritura , escritura directa y escritura recíproca . Cada uno ofrece ventajas y compensaciones únicas:
Cómo funciona:
Ideal para: aplicaciones con mucha escritura donde la velocidad es crítica y algunas inconsistencias son aceptables por el bien del rendimiento. Los ejemplos incluyen aplicaciones de métricas y análisis.
Ventajas:
Desventajas:
Cómo funciona:
Ventajas:
Desventajas:
Con Write-Around, su aplicación escribe datos directamente en la base de datos, sin pasar por el caché durante el proceso de escritura. Para llenar el caché, emplea una estrategia llamada patrón de caché aparte :
Llega la solicitud de lectura: la aplicación comprueba el caché.
Error de caché: si los datos no se encuentran en el caché, la aplicación los recupera de la base de datos y luego los almacena en el caché para uso futuro.
Ventajas:
Desventajas:
Una pérdida de caché ocurre cuando los datos que su aplicación necesita no se encuentran en el caché. Aquí hay dos estrategias comunes para abordar esto:
La aplicación comprueba el caché.
Si falla, recupera datos de la base de datos y luego actualiza el caché.
Punto clave: la aplicación es responsable de administrar el caché.
Usar un patrón Cache-Aside significa que su aplicación administrará el caché. Este enfoque es el más común de usar porque es simple y no necesita desarrollo en otros lugares además de la aplicación.
La aplicación realiza una solicitud sin conocer el caché.
Un mecanismo especializado verifica el caché y recupera datos de la base de datos si es necesario.
El caché se actualiza de forma transparente.
Los patrones de lectura reducen la complejidad de las aplicaciones, pero aumentan la complejidad de la infraestructura. En su lugar, es útil descargar el recurso de la aplicación al middleware.
En general, el patrón de escritura con caché aparte se utiliza con mayor frecuencia debido a su facilidad de implementación. Sin embargo, recomiendo incluir también el patrón de escritura simultánea si tiene datos que se utilizarán inmediatamente después de almacenarlos en caché. Esto proporcionará un ligero beneficio al rendimiento de lectura.
En esta sección, exploraremos las mejores prácticas para usar un caché. Seguir estas prácticas garantizará que su caché mantenga datos actualizados y administre su almacenamiento de manera efectiva.
Imagine que ha almacenado datos en el caché y luego se actualiza la base de datos. Esto hace que los datos en el caché difieran de la versión de la base de datos. A este tipo de datos de caché lo llamamos "obsoletos". Sin una técnica de invalidación de caché, los datos almacenados en caché podrían permanecer obsoletos después de las actualizaciones de la base de datos. Para mantener los datos actualizados, puede utilizar las siguientes técnicas:
Invalidación de caché al actualizar: cuando actualice datos en la base de datos, actualice también la entrada de caché correspondiente. Los patrones de escritura simultánea y reescritura manejan esto de manera inherente, pero la escritura simultánea/guardada en caché requiere la eliminación explícita de los datos almacenados en caché. Esta estrategia evita que su aplicación recupere datos obsoletos.
Tiempo de vida (TTL): TTL es una política que puede establecer al almacenar datos en la caché. Con TTL, los datos se eliminan automáticamente después de un tiempo específico. Esto ayuda a borrar los datos no utilizados y proporciona un sistema de seguridad contra datos obsoletos en caso de invalidaciones omitidas.
Si almacena en caché una gran cantidad de datos, su almacenamiento en caché podría llenarse. Los sistemas de caché suelen utilizar memoria, que suele ser más pequeña que el almacenamiento de la base de datos principal. Cuando el caché está lleno, es necesario eliminar algunos datos para dejar espacio. Las políticas de reemplazo de caché determinan qué datos eliminar:
Menos utilizados recientemente (LRU): esta política común desaloja los datos que no se han utilizado (leídos o escritos) durante más tiempo. LRU es adecuado para la mayoría de los casos de uso del mundo real.
Uso menos frecuente (LFU): similar a LRU, pero se centra en la frecuencia de acceso. Los datos recién escritos podrían ser desalojados, así que considere agregar un período de preparación durante el cual los datos no se puedan eliminar.
Existen otras políticas de reemplazo como FIFO (primero en entrar, primero en salir), reemplazo aleatorio, etc., pero son menos comunes.
Antes de profundizar en la implementación de la caché, es importante saber cuándo podría no ser la mejor opción. El almacenamiento en caché a menudo mejora la velocidad y reduce la carga de la base de datos, pero puede que no tenga sentido si:
Tráfico bajo: si su aplicación tiene poco tráfico y el tiempo de respuesta aún es aceptable, es probable que aún no necesite el almacenamiento en caché. Agregar un caché aumenta la complejidad, por lo que es mejor implementarlo cuando enfrenta cuellos de botella en el rendimiento o anticipa un aumento significativo en el tráfico.
Su sistema tiene mucha escritura: el almacenamiento en caché es más beneficioso en aplicaciones con mucha lectura. Esto significa que los datos de su base de datos se actualizan con poca frecuencia o se leen varias veces entre actualizaciones. Si su aplicación tiene un gran volumen de escrituras, el almacenamiento en caché podría generar sobrecarga y ralentizar las cosas.
En este artículo, cubrimos los conceptos básicos del almacenamiento en caché y cómo utilizarlo de forma eficaz. Aquí hay un resumen de los puntos clave:
Confirme la necesidad: asegúrese de que su sistema tenga muchas lecturas y requiera las ofertas de almacenamiento en caché de reducción de latencia.
Elija patrones sabiamente: seleccione patrones de escritura en caché y de pérdida de caché que se alineen con la forma en que su aplicación usa los datos.
Actualización de los datos: implemente estrategias de invalidación de caché para evitar entregar datos obsoletos.
Administrar la política de reemplazo: elija una política de reemplazo de caché (como LRU) para manejar las eliminaciones cuando el caché alcance su capacidad.