Cómo funciona una caché
Imagina que, cada vez que quieres leer un libro que usas a menudo, tienes que ir a buscarlo a un almacén lejano. Cada viaje lleva un buen rato. Pero si dejas una copia de ese libro sobre tu escritorio, a partir de entonces basta con estirar la mano. Guardar una copia de los datos que se usan a menudo cerca, para sacarlos rápido, es lo que hace una caché.
Un almacén lejano es lento de alcanzar
En la lección anterior vimos cómo cambiar datos con seguridad. Esta vez toca el lado de la lectura. Una base de datos suele guardar sus datos en disco o funcionar en otra computadora, así que para sacar datos hay que enviar una petición y esperar la respuesta.
Ese ida y vuelta es más largo de lo que parece. Incluso cuando quieres los mismos datos otra vez, tienes que hacer el mismo viaje largo que la primera vez. Hagamos abajo unos cuantos viajes al almacén lejano.
Toca el dato para traerlo del almacén lejano. El camino es largo, así que cada ida y vuelta tarda un rato, y si vuelves a tocar, es igual de lento.
Una o dos veces se aguanta. Pero si los mismos datos, como la información de un producto popular, se consultan cientos de miles de veces al día, cada consulta significa otro viaje largo. La espera se acumula, y el almacén se mantiene ocupado respondiendo la misma pregunta una y otra vez.
Además, la mayoría de los datos se usa muy de vez en cuando, mientras que una pequeña parte se usa muchísimo. También es común volver a usar enseguida algo que se acaba de usar. Entonces, ¿por qué no tener cerca solo esa parte que se usa a menudo?
Guarda una copia cerca
El método es sencillo. Se traen una vez del almacén lejano los datos que se usan a menudo y luego se guarda una copia en un lugar cercano. Ese depósito cercano se llama caché.
Una caché suele ser mucho más rápida que el almacén, pero también mucho más pequeña. La memoria es más rápida que el disco, y lo que está en la misma computadora queda más cerca que lo que está en otra. Por eso, en el lugar rápido y pequeño se guarda solo lo que más se usa.
Toca un ítem para guardar una copia en la caché cercana. Las casillas vacías de la caché se van llenando una a una.
Ya hay una copia en la caché cercana. La próxima vez que busques los mismos datos, no hará falta ir hasta el almacén lejano: los sacas de la caché que tienes al lado.
Pero nada garantiza que lo que buscas vaya a estar siempre en la caché. Lo que ocurre cambia según esté o no, así que veamos los dos casos por separado.
Un acierto y un fallo
Si lo que buscas ya está en la caché, lo sacas directamente por el camino corto. Esto se llama acierto. Si no está, no queda más remedio que hacer el viaje al almacén lejano; esto se llama fallo.
En un fallo, ya que trajiste los datos, dejas una copia en la caché, y la próxima vez que busques lo mismo será un acierto. La proporción de peticiones que son aciertos se llama tasa de aciertos, y es el número que hay que mirar para saber qué tan bien funciona una caché.
Toca una petición. Si está en la caché, es un acierto por el camino corto; si no, es un fallo por el camino largo y después se deja una copia en la caché. Toca la misma petición dos veces para ver la diferencia.
Al principio falló y fue lento, pero una vez dejada la copia, la misma petición acertó y se volvió rápida. Cuanto más a menudo se busca algo, más aciertos se acumulan y más corto es el tiempo promedio.
Cuando la caché se llena, hay que sacar algo para hacer lugar a una copia nueva. A menudo se saca lo que lleva más tiempo sin usarse; esta regla se llama LRU, por sus siglas en inglés. Nace de la idea de que algo que se acaba de usar probablemente se vuelva a usar pronto. Pero queda un problema molesto. Si el original del almacén lejano cambia, ¿qué pasa con la copia de la caché?
Cuando la caché se queda vieja
Una caché no es más que una copia. Aunque el original del almacén lejano cambie, la caché no se entera y sigue guardando la copia que recibió antes.
Así, un acierto puede seguir siendo rápido mientras el valor que entrega está desactualizado. De una caché en ese estado se dice que está obsoleta. Velocidad a cambio del riesgo de entregar un valor equivocado: ese es el lado oscuro de la caché.
Toca el original para cambiar su valor. La caché sigue guardando el valor viejo; si la rellenas o la descartas, vuelve a coincidir con el original.
Al cambiar el original, la caché quedó desajustada. Hay dos formas principales de evitarlo. Una es actualizar o borrar la copia de la caché cada vez que cambia el original; la otra es ponerle a cada copia una fecha de vencimiento y tirarla cuando pasa ese tiempo.
Una casilla vaciada se vuelve a llenar con una copia nueva en el siguiente fallo. Un vencimiento corto significa menos valores viejos pero más fallos; uno largo, lo contrario. En cualquier caso, se trata de encontrar un equilibrio que reduzca los valores viejos sin perder los aciertos rápidos.
Resumen
En resumen: un almacén lejano es lento porque el camino de ida y vuelta es largo, así que se guarda cerca una copia de los datos que se usan a menudo. Eso es una caché. Si lo que buscas está en la caché, es un acierto y es rápido; si no, es un fallo, y tras el viaje al almacén lejano se deja una copia.
Cuando la caché se llena, sale primero lo que lleva más tiempo sin usarse, y cuando el original cambia, la copia se actualiza o se tira para evitar valores viejos. Tener los datos cerca y usarlos rápido, cuidando que no se aparten del original: eso es una caché.
Toca los puntos clave en orden para repasar. (lo lejano es lento → una copia cerca → acierto y fallo → vieja cuando cambia el original)
Las cachés no están solo delante de las bases de datos. La misma idea está en la CPU, en tu navegador web y en las redes de distribución que copian el contenido de servidores lejanos a lugares cercanos a los usuarios.
Para la velocidad, guardar los datos en poco espacio importa tanto como tenerlos cerca. La próxima lección, sobre la compresión, explica cómo guardar y mover el mismo contenido en menos bytes.