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: Exploraremos el almacenamiento en caché y explicaremos cómo almacena datos temporalmente para un acceso más rápido. ¿Qué es el 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. Beneficios del 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! Patrón 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? Mejores prácticas de almacenamiento 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. Cuándo no almacenar en caché ¿Qué es el almacenamiento en caché? 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! Beneficios del almacenamiento en caché 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. Patrones de caché 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: y . 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é. patrones de escritura en caché patrones de falta de caché Patrones de escritura 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: , y . Cada uno ofrece ventajas y compensaciones únicas: reescritura escritura directa escritura recíproca Respóndeme Cómo funciona: Su aplicación interactúa sólo con el caché. El caché confirma la escritura al instante. Luego, un proceso en segundo plano copia los datos recién escritos en la base de datos. 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. Ideal para: Ventajas: los datos siempre están en la memoria caché para un acceso rápido, evitando por completo la base de datos. Lecturas más rápidas: su aplicación no espera escrituras en la base de datos, lo que genera tiempos de respuesta más rápidos. Escrituras más rápidas: las escrituras por lotes reducen la carga de la base de datos y pueden extender potencialmente la vida útil del hardware de su base de datos. Menos tensión en la base de datos: Desventajas: si la caché falla antes de guardar los datos en la base de datos, se puede perder información. Redis mitiga este riesgo con almacenamiento persistente, pero esto agrega complejidad. Riesgo de pérdida de datos: necesitará un middleware para garantizar que la caché y la base de datos finalmente permanezcan sincronizadas. Mayor complejidad: todas las escrituras van primero a la caché, incluso si los datos no se leen con frecuencia. Esto puede provocar un alto consumo de almacenamiento. Potencial de uso elevado de la caché: Escriba por medio de Cómo funciona: Su aplicación escribe tanto en el caché como en la base de datos simultáneamente. Para reducir el tiempo de espera, puede escribir en la caché de forma asincrónica. Esto permite que su aplicación indique escrituras exitosas antes de que la operación de caché finalice por completo. Ventajas: al igual que la escritura posterior, los datos siempre están en la memoria caché, lo que elimina la necesidad de lecturas de la base de datos. Lecturas más rápidas: su aplicación solo confirma una escritura después de guardarla en la base de datos, lo que garantiza la persistencia de los datos incluso si ocurre una falla inmediatamente después. Confiabilidad: Desventajas: en comparación con la reescritura, esta política tiene cierta sobrecarga porque la aplicación espera a que se escriban tanto la base de datos como el caché. Las escrituras asincrónicas mejoran esto, pero recuerde que siempre existe el tiempo de espera de la base de datos. Escrituras más lentas: todas las escrituras van a la caché, lo que potencialmente consume almacenamiento incluso si no se accede a los datos con frecuencia. Uso elevado de la caché: escribir alrededor 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 la aplicación comprueba el caché. Llega la solicitud de lectura: 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. Error de caché: Ventajas: los datos se escriben directamente en la base de datos, lo que garantiza la coherencia. Escrituras confiables: solo se almacenan en caché los datos a los que se accede con frecuencia, lo que reduce el consumo de memoria. Uso eficiente de la caché: Desventajas: si los datos no están en el caché, la aplicación debe recuperarlos de la base de datos, agregando un viaje de ida y vuelta en comparación con las políticas donde el caché siempre se completa previamente. Mayor latencia de lectura (en algunos casos): Patrón de pérdida de caché 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: Caché aparte La aplicación comprueba el caché. Si falla, recupera datos de la base de datos y luego actualiza el caché. la aplicación es responsable de administrar el caché. Punto clave: 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. Leer de parte a parte 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. Mejores prácticas de almacenamiento en caché 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. Invalidación de caché 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: 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. Invalidación de caché al actualizar: 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. Tiempo de vida (TTL): Políticas de reemplazo de caché 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: 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. Menos utilizados recientemente (LRU): 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. Uso menos frecuente (LFU): Existen otras políticas de reemplazo como FIFO (primero en entrar, primero en salir), reemplazo aleatorio, etc., pero son menos comunes. Cuándo no almacenar en caché Antes de profundizar en la implementación de la caché, es importante saber cuándo podría 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: no 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. Tráfico bajo: 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. Su sistema tiene mucha escritura: Comidas para llevar 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: asegúrese de que su sistema tenga muchas lecturas y requiera las ofertas de almacenamiento en caché de reducción de latencia. Confirme la necesidad: 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. Elija patrones sabiamente: implemente estrategias de invalidación de caché para evitar entregar datos obsoletos. Actualización de los datos: elija una política de reemplazo de caché (como LRU) para manejar las eliminaciones cuando el caché alcance su capacidad. Administrar la política de reemplazo: Referencias https://gist.github.com/jboner/2841832 https://www.bytesizedpieces.com/posts/cache-types https://www.techtarget.com/searchstorage/definition/cache https://www.youtube.com/watch?v=dGAgxozNWFE