Almacenamiento en caché: concepto de diseño del sistema para principiantes

Facebook, Instagram, Amazon, Flipkart ….estas aplicaciones son las favoritas de mucha gente y lo más probable es que estos sean los sitios web visitados con más frecuencia en su lista.

¿Alguna vez ha notado que estos sitios web tardan menos en cargarse que un sitio web nuevo? ¿Y ha notado alguna vez que en una conexión a Internet lenta cuando navega por un sitio web, los textos se cargan antes que cualquier imagen de alta calidad?

¿Por qué pasó esto? La respuesta es almacenamiento en caché.

Caching-System-Design-Concept-For-Beginners

Si revisa su página de Instagram en la conexión lenta a Internet, notará que las imágenes siguen cargando pero se muestra el texto. Para cualquier tipo de negocio, estas cosas importan mucho. Una mejor experiencia del cliente/usuario es lo más importante y puede perder muchos clientes debido a la mala experiencia del usuario con su sitio web. Un usuario cambia inmediatamente a otro sitio web si descubre que el sitio web actual tarda más en cargarse o mostrar los resultados. Puedes tomar el ejemplo de ver tu serie favorita en cualquier aplicación de transmisión de video. ¿Cómo te sentirías si el video se guarda en el búfer todo el tiempo? Hay más posibilidades de que no se apegue a ese servicio y descontinúe la suscripción. 

Todos los problemas anteriores se pueden resolver mejorando la retención y el compromiso en su sitio web y brindando la mejor experiencia de usuario. Y una de las mejores soluciones es el Caching .

Almacenamiento en caché: una introducción

Digamos que preparas la cena todos los días y necesitas algunos ingredientes para preparar la comida. Siempre que prepares la comida, ¿irás a tu tienda más cercana a comprar estos ingredientes? Absolutamente no. Ese es un proceso que requiere mucho tiempo y cada vez, en lugar de visitar la tienda más cercana, le gustaría comprar los ingredientes una vez y guardarlos en su refrigerador. Eso ahorrará mucho tiempo. Esto es almacenamiento en caché y su refrigerador funciona como un caché/tienda local/tienda temporal . El tiempo de cocción se reduce si los alimentos ya están disponibles en su refrigerador. 

Las mismas cosas suceden en el sistema. En un sistema, acceder a los datos desde la memoria principal (RAM) es más rápido que acceder a los datos desde la memoria secundaria (disco). El almacenamiento en caché actúa como el almacén local de los datos y recuperar los datos de este almacenamiento local o temporal es más fácil y rápido que recuperarlos de la base de datos. Considéralo como un recuerdo a corto plazo .que tiene espacio limitado pero es más rápido y contiene los elementos a los que se accedió más recientemente . Entonces, si necesita confiar en una determinada pieza de datos a menudo, almacene en caché los datos y recupérelos más rápido de la memoria en lugar del disco.

Nota: Conoces los beneficios del caché, pero eso no significa que almacene toda la información en su memoria caché para un acceso más rápido. No puedes hacer eso por múltiples razones. Una de las razones es el hardware del caché que es mucho más caro que una base de datos normal. Además, el tiempo de búsqueda aumentará si almacena toneladas de datos en su caché. Entonces, en resumen, un caché debe tener la información más relevante de acuerdo con la solicitud que vendrá en el futuro.

¿Dónde se puede agregar caché?

El almacenamiento en caché se utiliza en casi todas las capas de la informática. En hardware, por ejemplo, tiene varias capas de memoria caché. Tiene memoria caché de capa 1, que es la memoria caché de la CPU, luego tiene memoria caché de capa 2 y, finalmente, tendría la RAM normal (memoria de acceso aleatorio). También tiene almacenamiento en caché en los sistemas operativos, como el almacenamiento en caché de varias extensiones del kernel o archivos de aplicaciones. También tiene almacenamiento en caché en un navegador web para disminuir el tiempo de carga del sitio web. Por lo tanto, el almacenamiento en caché se puede usar en casi todas las capas: hardware, sistema operativo, navegadores web, aplicaciones web, pero a menudo se encuentran más cerca del front-end. 

¿Cómo funciona el caché?

Por lo general, la aplicación web almacena datos en una base de datos. Cuando un cliente solicita algunos datos, se obtienen de la base de datos y luego se devuelven al usuario. La lectura de datos de la base de datos necesita llamadas de red y operación de E/S, lo cual es un proceso que requiere mucho tiempo. Cache reduce la llamada de red a la base de datos y acelera el rendimiento del sistema. Tomemos el ejemplo de Twitter: cuando un tweet se vuelve viral, una gran cantidad de clientes solicitan el mismo tweet. Twitter es un sitio web gigantesco que tiene millones de usuarios. Es ineficiente leer datos de los discos para este gran volumen de requests de usuarios. Para reducir el número de llamadas a la base de datos, podemos usar caché y los tweets se pueden proporcionar mucho más rápido.

En una aplicación web típica, podemos agregar un caché de servidor de aplicaciones, un almacén en memoria como Redis junto con nuestro servidor de aplicaciones. Cuando se realiza una solicitud por primera vez, se deberá realizar una llamada a la base de datos para procesar la consulta. Esto se conoce como error de caché . Antes de devolver el resultado al usuario, el resultado se guardará en el caché. Cuando la segunda vez que un usuario realiza la misma solicitud, la aplicación verificará primero su caché para ver si el resultado de esa solicitud está almacenado en caché o no. Si es así, el resultado se devolverá desde el almacenamiento en memoria. Esto se conoce como un golpe de caché . El tiempo de respuesta para la segunda solicitud será mucho menor que la primera vez. 

Process-of-Reading-Through-Cache

Tipos de caché

En común hay cuatro tipos de Caché…

1. Caché del servidor de aplicaciones

En “ ¿Cómo funciona el caché? En la sección discutimos cómo se puede agregar el caché del servidor de aplicaciones en una aplicación web. En una aplicación web, digamos que un servidor web tiene un solo Node. Se puede agregar un caché en la memoria junto con el servidor de aplicaciones. La solicitud del usuario se almacenará en este caché y cada vez que vuelva a aparecer la misma solicitud, se devolverá desde el caché. Para una nueva solicitud , los datos se obtendrán del disco y luego se devolverán. Una vez que la nueva solicitud sea devuelta desde el disco, se almacenará en el mismo caché para la próxima solicitud del usuario. La colocación de caché en el Node de la capa de solicitud habilita el almacenamiento local.

Nota: Cuando coloca su caché en la memoria, la memoria caché utilizará la cantidad de memoria en el servidor. Si la cantidad de resultados con los que está trabajando es realmente pequeña, puede mantener el caché en la memoria. 

El problema surge cuando necesitas escalar tu sistema . Agrega varios servidores en su aplicación web (porque un Node no puede manejar un gran volumen de requests) y tiene un equilibrador de carga que envía requests a cualquier Node. En este escenario, terminará con muchos errores de caché porque cada Node desconocerá la solicitud ya almacenada en caché. Esto no es muy bueno y para superar este problema tenemos dos opciones: Distribuir Caché y Caché Global. Hablemos de eso…

2. Caché distribuida

En la memoria caché distribuida, cada Node tendrá una parte de todo el espacio de la memoria caché y, luego, mediante la función hash consistente, cada solicitud se puede enrutar a donde se pueda encontrar la solicitud de la memoria caché. Supongamos que tenemos 10 Nodes en un sistema distribuido, y estamos usando un balanceador de carga para enrutar la solicitud entonces…

  • Cada uno de sus Nodes tendrá su pequeña parte de los datos almacenados en caché.
  • Para identificar qué Node tiene qué solicitud, la caché se divide mediante una función hash consistente, cada solicitud se puede enrutar a donde se puede encontrar la solicitud almacenada en caché. Si un Node solicitante está buscando cierta información, puede saber rápidamente dónde buscar dentro del caché distribuido para verificar si los datos están disponibles.
  • Podemos aumentar fácilmente la memoria caché simplemente agregando el nuevo Node al grupo de requests.

Distributed-Cache

3. Caché global

Como sugiere el nombre, tendrá un solo espacio de caché y todos los Nodes usan este espacio único. Cada solicitud irá a este único espacio de caché. Hay dos tipos de caché global

  • En primer lugar, cuando no se encuentra una solicitud de caché en la caché global, es responsabilidad de la caché encontrar los datos que faltan en cualquier parte del almacén (base de datos, disco, etc.).
  • En segundo lugar, si llega la solicitud y la memoria caché no encuentra los datos, el Node solicitante se comunicará directamente con la base de datos o el servidor para obtener los datos solicitados.

Global-Cache

4. CDN (Red de distribución de contenido)

CDN se utiliza cuando el sitio web sirve una gran cantidad de contenido estático. Esto puede ser un archivo HTML, un archivo CSS, un archivo JavaScript, imágenes, videos, etc. Primero, solicite los datos a la CDN; si existen, se devolverán los datos. De lo contrario, la CDN consultará los servidores back-end y luego lo almacenará en caché localmente.

Invalidación de caché

El almacenamiento en caché es excelente, pero ¿qué pasa con los datos que se actualizan constantemente en la base de datos? Si los datos se modifican en la base de datos, deben invalidarse para evitar un comportamiento inconsistente de la aplicación. Entonces, ¿cómo mantendría los datos en su caché coherentes con los datos de su fuente de la verdad en la base de datos? Para eso, necesitamos usar algún enfoque de invalidación de caché. Hay tres esquemas de invalidación de caché diferentes. Vamos a discutir eso uno por uno…

1. Escribir a través de caché 

Como sugiere el nombre, los datos se escriben primero en el caché y luego se escriben en la base de datos. De esta manera, puede mantener la coherencia de sus datos entre su base de datos y su caché. Cada lectura realizada en el caché sigue a la escritura más reciente. 

Write-Through-Cache

La ventaja de este enfoque es que minimiza el riesgo de pérdida de datos porque está escrito tanto en el caché como en la base de datos. Pero la desventaja de este enfoque es la mayor latencia para la operación de escritura porque necesita escribir los datos en dos lugares para una sola solicitud de actualización. Si no tiene una gran cantidad de datos, está bien, pero si tiene una operación de escritura pesada, este enfoque no es adecuado en esos casos.

Podemos usar este enfoque para las aplicaciones que tienen datos de relectura frecuentes una vez que se conservan en la base de datos. En esas aplicaciones, la latencia de escritura se puede compensar con una menor latencia de lectura y consistencia. 

2. Caché de escritura

Similar a la escritura simultánea, escribe en la base de datos, pero en este caso no actualiza el caché. Entonces, los datos se escriben directamente en el almacenamiento, sin pasar por el caché. No necesita cargar el caché con datos que no se volverían a leer. Este enfoque reduce la operación de escritura inundada en comparación con la memoria caché de escritura simultánea. La desventaja de este enfoque es que una solicitud de lectura de datos escritos recientemente da como resultado una pérdida de caché y debe leerse desde un backend más lento. Por lo tanto, este enfoque es adecuado para aplicaciones que no vuelven a leer con frecuencia los datos más recientes. 

Write-Around-Cache

3. Caché de reescritura

Hemos discutido que la memoria caché de escritura no es adecuada para el sistema de escritura intensiva debido a la mayor latencia. Para este tipo de sistemas, podemos usar el enfoque de caché de reescritura. En primer lugar, vacíe los datos del caché y luego escriba los datos solo en el caché. Una vez que los datos se actualicen en el caché, márquelos como modificados, lo que significa que los datos deben actualizarse en la base de datos más adelante. Posteriormente se realizará un trabajo asíncrono ya intervalos regulares se leerán los datos modificados de la caché para actualizar la base de datos con los valores correspondientes.  

El problema con este enfoque es que hasta que programe la actualización de su base de datos, el sistema corre el riesgo de perder datos. Digamos que actualizó los datos en el caché pero hay una falla en el disco y los datos modificados no se han actualizado en la base de datos. Dado que la base de datos es la fuente de la verdad, si lee los datos de la base de datos no obtendrá el resultado exacto. 

Política de desalojo

Hemos discutido tantos conceptos de almacenamiento en caché… ahora puede que tenga una pregunta en mente. ¿Cuándo necesitamos realizar/cargar una entrada en el caché y qué datos debemos eliminar del caché

La memoria caché de su sistema puede estar llena en cualquier momento. Por lo tanto, necesitamos usar algún algoritmo o estrategia para eliminar los datos del caché, y necesitamos cargar otros datos que tengan más probabilidades de acceder en el futuro. Para tomar esta decisión podemos usar alguna política de desalojo de caché. Analicemos algunas políticas de desalojo de caché una por una…

1. LRU (Usado Menos Recientemente)

LRU es la póliza más popular debido a varias razones. Es simple, tiene un buen rendimiento en tiempo de ejecución y una tasa de aciertos decente en cargas de trabajo comunes. Como sugiere el nombre, esta política expulsa primero de la memoria caché el elemento utilizado menos recientemente. Cuando la memoria caché se llena, elimina los datos utilizados menos recientemente y se agrega la última entrada a la memoria caché. 

Siempre que necesite agregar la entrada al caché, manténgala en la parte superior y elimine las entradas más bajas del caché que se usó menos recientemente. Las entradas principales van a ser quizás hace unos segundos y luego sigues bajando en la lista hace minutos, hace horas, hace años y luego eliminas la última entrada (que se usó menos recientemente). 

Considere el ejemplo de cualquier sitio de redes sociales, hay una celebridad que hizo una publicación o hizo un comentario y todos quieren sacar ese comentario. Así que mantienes esa publicación en la parte superior del caché y permanece en la parte superior del caché dependiendo de qué tan reciente sea la publicación. Cuando la publicación se vuelve más fría o las personas dejan de mirar o ver esa publicación, se sigue empujando al final del caché y luego se elimina por completo del caché. 

Podemos implementar la LRU usando una lista doblemente enlazada y una función hash que contenga la referencia del Node en la lista. 

2. LFU (Usado con menor frecuencia)

Esta política cuenta la frecuencia de cada elemento solicitado y descarta el menos frecuente del caché. Así que aquí contamos la cantidad de veces que se accede a un elemento de datos y hacemos un seguimiento de la frecuencia de cada elemento. Cuando el tamaño de la memoria caché alcanza un umbral determinado, eliminamos la entrada con la frecuencia más baja. 

En la vida real, podemos tomar el ejemplo de escribir algunos textos en su teléfono. Su teléfono sugiere varias palabras cuando escribe algo en el cuadro de texto. En lugar de escribir la palabra completa, tiene la opción de seleccionar una palabra de estas múltiples palabras. En este caso, su teléfono realiza un seguimiento de la frecuencia de cada palabra que escribe y mantiene el caché para ello. Más tarde, la palabra con la frecuencia más baja se descarta del caché cuando se necesita. Si encontramos un empate entre varias palabras, se elimina la palabra utilizada menos recientemente. 

3. MRU (utilizado más recientemente)

Este enfoque elimina el elemento utilizado más recientemente de la memoria caché. Damos preferencia al elemento más antiguo para que permanezca en el caché. Este enfoque es adecuado en los casos en que un usuario está menos interesado en consultar los datos o elementos más recientes. Ahora podría estar pensando que la mayoría de las veces los usuarios están interesados ​​en los datos o entradas más recientes, entonces, ¿dónde se pueden usar? Bueno, puedes tomar el ejemplo de la aplicación de citas Tinder donde se puede usar MRU.

Tinder mantiene el caché de todas las posibles coincidencias de un usuario. No recomienda el mismo perfil al usuario cuando desliza el perfil hacia la izquierda o hacia la derecha en la aplicación. La experiencia del usuario será deficiente si se recomienda el mismo perfil una y otra vez. Entonces, Tinder elimina el perfil del caché que se observa más recientemente, es decir, los perfiles deslizados hacia la izquierda o hacia la derecha.

4. Reemplazo aleatorio

Como sugiere el nombre, seleccionamos aleatoriamente un elemento y lo descartamos del caché para hacer espacio cuando sea necesario. 

Publicación traducida automáticamente

Artículo escrito por anuupadhyay y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *