Cosa sono i dati memorizzati nella cache? Che cosa significa Clear Cache e cosa fa?

Innanzitutto, cos'è una cache?

In termini generali, una cache (pronunciata "cash") è un tipo di repository. Puoi pensare a un repository come a un deposito di archiviazione. In campo militare, questo significherebbe contenere armi, cibo e altri rifornimenti necessari per portare avanti una missione.

In informatica, queste "forniture" sono chiamate risorse, dove le risorse sono script, codice e contenuto di documenti. Quest'ultimo a volte è più specificamente indicato come "risorse" come testo, dati statici, media e collegamenti ipertestuali, ma qui userò solo un termine risorse .

La distinzione tra una cache e altri tipi di repository

Lo scopo principale di una cache è accelerare il recupero delle risorse della pagina web, riducendo i tempi di caricamento della pagina. Un altro aspetto critico di una cache è garantire che contenga dati relativamente aggiornati.

Questo articolo tratterà due metodi prevalenti di memorizzazione nella cache: la memorizzazione nella cache del browser e le reti di distribuzione dei contenuti (CDN).

Oltre alle cache, altri repository entrano in gioco nelle architetture web; spesso questi sono progettati per contenere enormi quantità di dati. Tuttavia, non sono così concentrati sulle prestazioni di recupero.

Ad esempio, Amazon Glacier è un repository di dati progettato per archiviare i dati in modo economico, ma non per recuperarli rapidamente. Un database SQL, d'altra parte, è progettato per essere flessibile, aggiornato e veloce, ma raramente è economico e di solito non è veloce come una cache.

La cache del browser: una cache di memoria

Una cache di memoria archivia le risorse localmente sul computer in cui è in esecuzione il browser. Mentre il browser è attivo, le risorse recuperate verranno archiviate nella memoria fisica del computer (RAM) e possibilmente anche sul disco rigido.

Più tardi, quando gli esatti sono necessarie stesse risorse quando rivisitare una pagina web, il browser tirerà quelli dalla cache al posto del server remoto. Poiché la cache è archiviata localmente, nella memoria veloce, tali risorse vengono recuperate più rapidamente e la pagina viene caricata più velocemente.

La velocità del recupero delle risorse è essenziale, ma lo è anche la necessità che le risorse siano fresche. Una risorsa obsoleta è una risorsa non aggiornata e potrebbe non essere più valida.

Parte del lavoro del browser è identificare quali risorse memorizzate nella cache sono obsolete e recuperare quelle che lo sono. Poiché una pagina Web in genere ha molte risorse, di solito ci sarà un mix di versioni obsolete e nuove nella cache.

Come fa il browser a sapere cosa è obsoleto nella cache?

La risposta non è semplice, ma ci sono due approcci principali: busting della cache e campi di intestazione HTTP.

busting della cache

Italiani

Il busting della cache è una tecnica lato server che garantisce che il browser recuperi solo nuove risorse. Lo fa indirettamente.

Sebbene il busting della cache possa sembrare drammatico, in realtà non distrugge nulla e non tocca nemmeno ciò che è già memorizzato nella cache su un browser. Tutto ciò che fa il busting della cache è modificare l'URI della risorsa originale in modo tale da far sembrare al browser che la risorsa è completamente nuova. Poiché sembra nuovo, non sarà nella cache di un browser. La vecchia versione della risorsa memorizzata nella cache verrà ancora memorizzata nella cache, ma alla fine appassirà e morirà, per non essere più accessibile.

Supponiamo che io abbia una pagina web situata in www.foobar.com/about.htmlcui dice tutto su foobar.com che vorresti sapere. Una volta visitata quella pagina, essa e le risorse ad essa associate vengono memorizzate nella cache dal browser.

Successivamente, foobar.com viene acquisito dalla società Quxbaz e il contenuto della pagina delle informazioni subisce modifiche significative. La cache del browser non avrà quel nuovo contenuto, ma potrebbe ancora credere che il contenuto che ha è attuale e non proverà mai a recuperarlo.

Cosa fai tu, l'amministratore web di Quxbaz, per assicurarti che tutti i nuovi contenuti vengano eliminati?

Poiché il browser si basa sull'URI per trovare gli elementi nella cache, se l'URI di una risorsa cambia, è come se il browser non l'avesse mai visto prima di andare a recuperare quella risorsa dal server.

Pertanto, modificando l'URI della risorsa da www.foobar.com/about.htmla www.foobar.com/about2.html(o a www.quxbaz.com/about.html), il browser non troverà alcuna risorsa cache associata a tale URI ed eseguirà un recupero completo dal server. La risorsa potrebbe essere sostanzialmente la stessa dell'originale con il vecchio URI, ma il browser non lo sa.

Tuttavia, non è necessario modificare il nome della pagina. Dal momento che l'URI include anche una stringa di query, per definizione, è possibile aggiungere un parametro di versione per l'URI: www.foobar.com/about.html?v=2hef9eb1.

In questo caso, il parametro di versione v viene impostato su un nuovo valore hash generato ogni volta che il contenuto cambia o viene attivato da un altro processo, come un riavvio del server. Il browser vede che la stringa di query è cambiata e poiché le stringhe di query possono influenzare ciò che verrà restituito, recupererà una risorsa aggiornata dal server.

Nessuna di queste tecniche funzionerà se si accede direttamente al vecchio URI da un segnalibro. A meno che al browser non sia stato chiesto di riconvalidare l'URI nell'ultima richiesta memorizzata nella cache (o la risorsa memorizzata nella cache è scaduta), non eseguirà un recupero completo per aggiornare la cache. Questo ci porta al prossimo argomento.

Campi di intestazione HTTP

Ogni richiesta di risorsa viene fornita con alcune meta informazioni note come intestazione. Al contrario, a ogni risposta sono associate anche informazioni di intestazione.

In alcuni casi, il browser vede i valori dell'intestazione della risposta e modifica i valori corrispondenti nelle intestazioni della richiesta successiva. Tra questi valori di intestazione ci sono quelli che influenzano il modo in cui viene eseguita la memorizzazione nella cache delle risorse nel browser.

Richieste HEAD e richieste condizionali

Una richiesta HEAD è come una richiesta GET o POST troncata. Invece di richiedere la risorsa completa, una richiesta HEAD richiede solo i campi di intestazione che altrimenti verrebbero restituiti su una richiesta completa.

L'intestazione di una risorsa sarà generalmente molto più piccola (in numero di byte totali) rispetto ai dati della risorsa ad essa associati (il "corpo" della risposta). Le informazioni di intestazione sono sufficientemente informative per consentire al browser di determinare l'aggiornamento della risorsa nella sua cache.

Le richieste HEAD vengono spesso utilizzate per verificare la validità di una risorsa del server (ovvero, la risorsa esiste ancora e, in tal caso, è stata aggiornata dall'ultimo accesso del browser?). Il browser utilizzerà ciò che è nella sua cache se la richiesta HEAD indica che la risorsa è valida, altrimenti eseguirà una richiesta GET o POST completa e aggiornerà la cache con ciò che viene restituito.

Con una richiesta condizionale, il browser invia campi nell'intestazione che descrivono l'aggiornamento della sua risorsa memorizzata nella cache. Questa volta, il server determina se la cache del browser è ancora aggiornata.

In tal caso, il server restituisce una risposta 304 con solo le informazioni di intestazione della risorsa e nessun corpo della risorsa (i dati). Se si determina che la cache del browser non è aggiornata, il server restituirà una risposta 200 OK completa.

Questo meccanismo è più veloce rispetto all'utilizzo delle richieste HEAD, poiché elimina la possibilità di dover emettere due richieste invece di una.

Quanto sopra semplifica quello che può essere un processo piuttosto complicato. C'è un sacco di messa a punto coinvolta nella memorizzazione nella cache, ma tutto è controllato tramite i campi di intestazione, il più importante dei quali è il controllo della cache.

Cache-Control

Quando risponde a una richiesta, il server invia i campi di intestazione al browser indicando quale comportamento deve adattarsi durante la memorizzazione nella cache. Se carico la pagina su //en.wikipedia.org/wiki/Uniform_Resource_Identifier, la risposta lo contiene nel suo record di intestazione:

cache-control: private, s-maxage=0, max-age=0, must-revalidate 

privato significa che solo il browser deve memorizzare nella cache il contenuto del documento.

s-maxage e max-age sono impostati su 0 . Il valore s-maxage è per i server proxy con cache, mentre max-age è inteso per il browser. L'effetto della sola impostazione di max-age è che la risorsa memorizzata nella cache scade immediatamente, ma può ancora essere utilizzata (anche se obsoleta) durante i ricaricamenti della pagina nella stessa sessione del browser.

Una risorsa obsoleta può essere riconvalidata tramite una richiesta HEAD, che potrebbe essere seguita da una richiesta GET o POST, a seconda della risposta. La direttiva must-revalidate ordina al browser di riconvalidare la risorsa memorizzata nella cache se non è aggiornata.

Poiché in questo caso max-age è impostato su 0 , la risorsa memorizzata nella cache è immediatamente obsoleta una volta ricevuta. La combinazione delle due direttive è equivalente alla singola direttiva no-cache .

Le due impostazioni assicurano che il browser riconvalidi sempre la risorsa memorizzata nella cache, che sia ancora nella stessa sessione o meno.

Le direttive per il controllo della cache sono molto estese e talvolta confuse: sono un argomento a sé stante. Un elenco documentato completo di direttive può essere trovato qui.

E-tag

Questo è un token che il server invia e il browser conserva fino alla richiesta successiva. Viene utilizzato solo quando il browser sa che la durata della cache della risorsa è scaduta.

Gli e-tag sono valori hash generati dal server, che spesso utilizzano il nome del file fisico della risorsa e la data dell'ultima modifica sul server come seme. Quando un file di risorse viene aggiornato, la data modificata cambia e un nuovo valore hash viene generato e inviato nell'intestazione della risposta alla richiesta.

Altri tag di intestazione che influiscono sulla memorizzazione nella cache

I tag di intestazione scadono e le ultime modifiche sono del tutto obsolete, ma vengono ancora inviati dalla maggior parte dei server per compatibilità con i browser meno recenti. Un esempio:

expires: Thu, 01 Jan 1970 00:00:00 GMT last-modified: Sun, 01 Mar 2020 17:59:02 GMT 

Qui, la scadenza è impostata sulla data zero (storicamente, dal sistema operativo UNIX). Ciò indica che la risorsa scade immediatamente, proprio come max-age = 0 . Last-modified indica al browser quando è stato effettuato l'ultimo aggiornamento alla risorsa, che può quindi utilizzare per decidere se deve recuperarlo piuttosto che utilizzare il valore della cache.

Forzare un aggiornamento della cache dal browser

Cos'è una ricarica difficile?

Un hard ricaricamento forza il recupero di tutte le risorse su una pagina, siano esse contenuto, script, fogli di stile o media. Praticamente tutto, giusto?

Ebbene, alcune risorse potrebbero non essere esplicitamente incluse in una pagina. Invece, possono essere recuperati dinamicamente, di solito dopo che tutto ciò che è esplicito è stato caricato.

Il browser non sa in anticipo che ciò accadrà e, quando lo farà, le richieste successive (avviate da script, di solito) useranno comunque le copie cache di quelle risorse, se disponibili.

Che cos'è svuotare la cache e ricaricare duro?

Questa operazione cancella l'intera cache del browser, il che ha lo stesso effetto di un ricaricamento forzato, ma inoltre fa sì che vengano recuperate anche le risorse caricate dinamicamente - dopotutto, non c'è niente nella cache, quindi non c'è scelta!

Reti di distribuzione dei contenuti: una cache geolocalizzata

Un CDN è più di una semplice cache, ma il caching è uno dei suoi compiti. Una CDN memorizza i dati in posizioni geograficamente distribuite in modo da ridurre i tempi di andata e ritorno da e verso un browser geograficamente locale.

Le richieste del browser vengono instradate a una CDN vicina, riducendo così la distanza fisica che i dati di risposta devono percorrere. I CDN sono anche in grado di gestire grandi quantità di traffico e fornire sicurezza contro alcuni tipi di attacchi.

Un CDN ottiene le proprie risorse tramite un Internet Exchange Point (IXP), nodi che fanno parte della spina dorsale di Internet (in maiuscolo). Ci sono passaggi da eseguire per impostare il routing delle richieste per andare a una CDN invece che al server host. Il prossimo passo è assicurarti che il CDN abbia il contenuto corrente del tuo sito web.

Ai vecchi tempi, la maggior parte delle CDN supportava il metodo push: un sito Web inviava nuovi contenuti a un hub CDN, che veniva quindi distribuito a nodi geograficamente dispersi.

Oggigiorno, la maggior parte dei CDN utilizza i protocolli di memorizzazione nella cache descritti sopra (o simili) per 1) scaricare nuove risorse e 2) aggiornare quelle esistenti. Il browser ha ancora la sua cache e nulla di tutto ciò cambia. Tutto ciò che fa un CDN è rendere più veloci i trasferimenti di nuove risorse.