Al solicitar datos de cualquier fuente, siempre hay algún retraso. El ping a los servidores web se mide en milisegundos, el tiempo de acceso al almacenamiento puede tener latencias en microsegundos, mientras que la latencia de RAM se mide en ciclos de reloj de la CPU. Por supuesto, este tipo de velocidades habrían sido impensables hace solo unas décadas, pero en el presente, nunca son lo suficientemente rápidas. La velocidad de acceso suele ser una forma de cuello de botella en el rendimiento. Una de las formas en que esto se puede abordar es con el almacenamiento en caché.
El almacenamiento en caché es un proceso de almacenamiento de una copia temporal de un recurso de manera que se pueda acceder a él más rápido de lo normal. Hay una gran variedad de implementaciones tanto en software como en hardware. Los cachés pueden actuar como cachés de lectura, cachés de escritura o ambos.
Leer cachés
En un caché de lectura, los datos que se han solicitado previamente se almacenan en un caché para un acceso más rápido. En algunos escenarios, la memoria caché puede incluso cargarse de forma preventiva con datos, lo que permite que la primera solicitud se atienda desde la memoria caché en lugar de solo las solicitudes posteriores.
El caché de lectura con el que probablemente esté familiarizado es el caché del navegador. Aquí el navegador almacena una copia local de los recursos solicitados. Esto significa que si se vuelve a cargar la página web o se carga una página similar que usa gran parte del mismo contenido, ese contenido se puede servir desde la memoria caché en lugar del servidor web. Esto no solo significa que la página web puede cargarse más rápido, sino que también reduce la carga en la web. servidor y reduce la cantidad de datos que el usuario necesita descargar, lo que puede ser importante en conexiones
La propia RAM también actúa como caché de lectura de datos en el disco duro. En este caso, los datos de un programa en ejecución se cargan de forma preventiva en la RAM para que la CPU pueda acceder a ellos más rápido. Luego, los datos de la RAM se almacenan en la memoria caché de la CPU, aunque el proceso para esto es mucho más complejo ya que la memoria caché de la CPU se mide en megabytes, no en gigabytes.
Escribir cachés
Un caché de escritura es un caché que puede absorber datos que se escriben en un dispositivo más lento. Un ejemplo común de esto sería el caché SLC en los SSD modernos. Este caché no permite que los datos se lean más rápido, sin embargo, es mucho más rápido escribir en él que escribir en el flash TLC o QLC que conforma el resto del SSD. El caché SLC puede absorber operaciones de escritura de alta velocidad y luego descarga esos datos tan pronto como sea posible en el flash TLC, que ofrece una densidad de almacenamiento mucho mejor, pero también es mucho más lento para escribir. El uso de la memoria flash de esta manera la optimiza tanto para velocidades de escritura rápidas como para alta densidad de almacenamiento.
Cachés híbridos
Hay muchas maneras de manejar los cachés que pueden permitirles actuar como un caché de lectura y escritura. Cada uno de estos métodos maneja las operaciones de escritura de manera diferente y tiene ventajas e inconvenientes. Las tres opciones son escritura alternativa, escritura simultánea y escritura no simultánea. Un caché de escritura alternativa omite por completo el caché al escribir, el caché de escritura directa escribe en el caché pero solo considera que la operación está completa cuando se ha escrito en el almacenamiento. El caché de reescritura escribe en el caché y luego considera que la operación está completa, confiando en el caché para transferirlo al almacenamiento si es necesario.
La escritura indirecta puede ser útil si espera un gran volumen de escrituras, ya que minimiza la rotación de caché. Sin embargo, significa que una operación que luego lee cualquiera de esos datos escritos enfrentará al menos una falla de caché la primera vez. Las cachés de escritura simultánea almacenan inmediatamente las operaciones de escritura en caché, lo que significa que el resultado se puede servir desde la caché la primera vez que se solicita. Sin embargo, para que se considere completa, una operación de escritura también debe escribir los datos en el disco, lo que agrega latencia. Una caché de reescritura tiene el mismo beneficio que una escritura directa, ya que permite que los datos escritos se sirvan inmediatamente desde la caché. Sin embargo, no requiere operaciones de escritura para escribir en el disco para que se considere completo. Esto reduce la latencia de escritura, pero conlleva el riesgo de pérdida de datos si la memoria caché es volátil y no termina de escribir los datos en el almacenamiento antes de que se pierda la energía.
¿Cómo eliminar datos del caché?
Uno de los factores limitantes de cualquier caché es la capacidad. Un caché grande toma mucho tiempo para buscar, anulando una buena parte de la ventaja de usar un caché en primer lugar. Las tecnologías de memoria utilizadas para el almacenamiento en caché también tienden a ser más costosas que la memoria desde la que se almacenan en caché. Si este no fuera el caso, es probable que ese nivel de memoria hubiera cambiado las tecnologías de memoria para mejorar el rendimiento. Ambos factores significan que los cachés tienden a ser relativamente pequeños, especialmente cuando se comparan con el medio de almacenamiento desde el que se almacenan. La RAM tiene menos capacidad que el almacenamiento y la memoria caché de la CPU tiene menos capacidad que la RAM. La caché SLC tiene menos capacidad que la memoria TLC.
Todo esto significa que a menudo es necesario sacar los datos de la memoria caché para liberar espacio para los nuevos datos que deben almacenarse en la memoria caché. Hay una variedad de enfoques diferentes para esto. "Usado con menos frecuencia", prefiere desalojar las entradas de caché que tienen el recuento de acceso más bajo. Esto puede ser útil para predecir qué entradas tendrán el menor efecto en futuras fallas de caché, pero también contaría las entradas agregadas muy recientemente como que tienen un número bajo de accesos, lo que puede conducir a la caché batir.
"Usado menos recientemente" prefiere desalojar las entradas de caché que no se han utilizado durante un tiempo. Esto supone que no se están utilizando actualmente, pero no tiene en cuenta si se usaron mucho hace un tiempo. "Utilizado más recientemente" prefiere desalojar las entradas de caché utilizadas más recientemente, asumiendo que se han utilizado y no será necesario volver a utilizarlas. El mejor enfoque es generalmente una combinación de los tres, informado por las estadísticas de uso.
Información obsoleta y riesgos de seguridad
El principal riesgo de los cachés es que la información que contienen puede volverse obsoleta. Una entrada de caché se considera obsoleta cuando los datos originales se han actualizado dejando la entrada de caché desactualizada. Es importante verificar regularmente que la copia en vivo que se publica aún coincida con la copia almacenada en caché.
Específicamente en los sitios web, también es extremadamente importante identificar qué datos pueden y no pueden almacenarse en caché. Por ejemplo, está perfectamente bien que se almacene en caché un gran archivo JavaScript que no cambia. Esto evita que el usuario lo descargue cada vez, e incluso puede beneficiar a otros usuarios atendidos por el mismo caché. Sin embargo, no puede almacenar en caché datos específicos de la sesión. Imagínese lo que sucedería si navegara a una aplicación de mensajería mientras iniciaba sesión como usted mismo, solo para descubrir que recibió una versión en caché de los mensajes de otro usuario. Afortunadamente, los servidores web pueden especificar qué recursos pueden y no pueden almacenarse en caché y estos problemas generalmente son bien conocidos, por lo que hay pocos problemas como este.
Conclusión
Un caché es una parte de la memoria que puede almacenar algunos datos usados recientemente en un método de almacenamiento que es más rápido de acceder de lo que sería completar el proceso normal de acceso a los datos nuevamente. Una memoria caché suele tener una capacidad limitada, lo que significa que necesita desalojar las entradas una vez que está llena. Los cachés son generalmente transparentes para el usuario, lo que significa que la latencia es la única indicación de que el resultado se entregó a través de un caché.