Cachés

La memoria caché es un tipo de almacenamiento, menor que la unidad de almacenamiento principal, pero con un acceso más rápido, que se utiliza en ingeniería de la computación para aportar un mayor rendimiento al sistema. La caché no es un concepto nuevo dentro de la informática, es una memoria que se lleva utilizando años y desde el punto de más bajo nivel de una computadora (procesador), hasta el más alto (software).

Físicamente podemos encontrar 3 tipos de memorias caché diferenciadas por su cercanía o lejanía del procesador:

Caché L1

Esta la podemos encontrar dentro del procesador, muy rápida, pero pequeña. Es la memoria donde el procesador almacena los registros con los que hace operaciones.

 image

Caché L2

Algo más separada encontramos la L2, al lado de procesador, más grande que la L1 pero más lenta. Aunque no obstante es muy rápida. Es la típica caché que anuncian en los procesadores: i7 con 4kb de cache. Esta se usa como memoria intermedia, para almacenar más datos y luego volcarlos a la L1 para operar.

image

Caché L3

Es la equivalente a la memoria RAM o de la del disco duro (la RAM es más rápida que el disco). Este es el nivel donde los vamos a mover a lo largo del resto de este artículo. Es la caché que como programadores de lenguajes manejados, estamos capacitados para gestionar.image

También cabe mencionar que la memoria RAM a su vez, tiene también una caché de acceso más rápido que la propia RAM, la SRAM, donde se almacenan los datos que más se usan. Y además puede usar la memoria de disco de la máquina si es que se ha llenado. Y los discos usan como caché el típico buffer que se usa al leer un archivo. Pero quizá nos estamos desviando de la temática principal.

El concepto que es importante que trascienda de aquí es que todo en los ordenadores usa siempre algún tipo de memoria caché :).

 

Cache no-memory vs. in-memory

En nivel de L3 se suelen diferenciar dos tipos de caché según donde se almacenarán los datos físicamente.Y este almacén otorgará unas características y escenarios aplicables diferentes.

image

No-memory

Una caché persistida (no-memory) es aquella caché que queda guardada en una unidad de almacenamiento. Físicamente quedará almacenada hasta que caduque. Un ejemplo es el output-cache de una página web. Al usar estos parámetros, los navegadores entienden que esos datos no se van a modificar. Así que los guarda y no los vuelve a pedir al servidor, usa la copia almacenada en su caché. Aunque apaguemos el ordenador, estos datos no se borran, la próxima vez que iniciemos, estarán allí.

Existen varias formas diferentes de usar la caché output dentro de una página web:

Si nos basáramos en el estándar HTML5 deberíamos crear un archivo de manifiesto donde indicaríamos que archivos van a ser almacenados en la caché del navegador y cuales no. Un ejemplo de este archivo sería este:

CACHE MANIFEST
# v1.0.0
/bootstrap.min.css
/site.css
/logo.gif
/main.js

NETWORK:
/Auth/Login
# *

FALLBACK:
/Auth/Login /Home/offline.html

Cuando iniciamos el archivo siempre hay que declarar la directiva “CACHE MANIFEST”, acto seguido irán los recursos que se almacenarán en la caché. Dentro de la directiva “NETWORK” irán aquellos recursos que siempre deben ser solicitados al servidor. Y en el caso de “FALLBACK”, indicaremos el recurso alternativo a mostrar si es que no se encuentra una solicitud.

Y por último necesitaremos referenciar ese archivo en nuestra página web:

<!DOCTYPE html>
<html manifest="demo.appcache">
    <head>
        <title>Demo</title>
        <link rel="../Content/CACHE_MANIFEST" type="text/cache-manifest" />
    </head>
    <body>

    </body>
</html>

Aquí podemos observar dos apuntes. El primero es la declaración de un atributo “manifest” en el tag “html”. Esto es necesario para que el navegador sepa que la página web actual va a usar un manifiesto. Y por convenio se suele nombrar como “[nombre de aplicación].appcache”. Y el segundo es la etiqueta “link” que apunta a nuestro archivo de manifiesto.

Cualquier recurso referenciado para ser almacenado en caché de esta forma, será actualizado solo si: