Što su predmemorirani podaci? Što znači Clear Cache i što to čini?

Prvo, što je predmemorija?

Općenito govoreći, predmemorija (izgovara se "gotovina") vrsta je spremišta. O spremištu možete razmišljati kao o skladištu. U vojsci bi to bilo držanje oružja, hrane i drugih potrepština potrebnih za nastavak misije.

U računalnoj znanosti ove se "zalihe" nazivaju resursima, a resursi su skripte, kod i sadržaj dokumenta. Potonje se ponekad preciznije naziva "sredstvima" kao što su tekst, statički podaci, mediji i hiperveze, ali ovdje ću koristiti samo jedan izraz resursi .

Razlika između predmemorije i ostalih vrsta spremišta

Primarna svrha predmemorije je ubrzati pronalaženje resursa web stranica, smanjujući vrijeme učitavanja stranice. Sljedeći kritični aspekt predmemorije je osigurati da sadrži relativno svježe podatke.

Ovaj će članak obuhvatiti dvije prevladavajuće metode predmemoriranja: predmemoriranje preglednika i mreže za isporuku sadržaja (CDN).

Osim predmemorija, u web arhitekturama u igru ​​ulaze i druga spremišta; oni su često dizajnirani da sadrže ogromne količine podataka. Nisu toliko usredotočeni na izvedbu pretraživanja.

Na primjer, Amazon Glacier je spremište podataka koje je dizajnirano za jeftino pohranjivanje podataka, ali ne i njihovo brzo preuzimanje. SQL baza podataka je, s druge strane, dizajnirana da bude fleksibilna, ažurna i brza, ali je rijetko jeftina i obično nije brza poput predmemorije.

Predmemorija preglednika: predmemorija

Predmemorijska memorija pohranjuje resurse lokalno na računalu na kojem je pokrenut preglednik. Dok je preglednik aktivan, preuzeti resursi pohranit će se u fizičkoj memoriji računala (RAM), a možda i na tvrdom disku.

Kasnije, kad budu potrebni potpuno isti resursi prilikom ponovnog posjeta web stranici, preglednik će ih povući iz predmemorije umjesto s udaljenog poslužitelja. Budući da se predmemorija pohranjuje lokalno, u brzoj memoriji, ti se resursi dohvaćaju brže i stranica se brže učitava.

Brzina pronalaženja resursa je najvažnija, ali isto tako i potreba da resursi budu svježi. Zastareli je resurs koji je zastario i možda više neće biti valjan.

Dio posla preglednika je utvrditi koji su predmemorirani resursi ustajali i ponovno dohvatiti one koji jesu. Budući da web stranica obično ima moždane resurse, u predmemoriji će obično biti kombinacija zastarjelih i svježih verzija.

Kako preglednik zna što je ustajalo u predmemoriji?

Odgovor nije jednostavan, ali postoje dva glavna pristupa: uništavanje predmemorije i polja HTTP zaglavlja.

uništavanje predmemorije

Talijani

Razbijanje predmemorije je tehnika na poslužitelju koja osigurava da preglednik dohvaća samo svježe resurse. To čini neizravno.

Iako uništavanje predmemorije može zvučati dramatično, uistinu se ništa ne uništava i čak ne dodiruje ono što je već spremljeno u preglednik. Sve što uništava predmemorija mijenja je URI izvornog resursa na način da pregledniku izgleda da je resurs potpuno nov. Budući da izgleda novo, neće biti u predmemoriji preglednika. Stara verzija predmemoriranog resursa i dalje će biti predmemorirana, ali s vremenom će uvenuti i umrijeti, a nikada joj se više neće pristupiti.

Recimo da imam web stranicu na www.foobar.com/about.htmlkojoj se govori sve o foobar.com što biste ikada željeli znati. Jednom kada posjetite tu stranicu, preglednik je predmemorira nju i resurse povezane s njom.

Kasnije foobar.com otkupljuje korporacija Quxbaz, a sadržaj stranice o web stranici podvrgava se značajnim promjenama. Predmemorija preglednika neće imati taj novi sadržaj, ali možda još uvijek vjeruje da je sadržaj koji ima trenutno i nikada ga neće pokušati dohvatiti.

Što vi, web administrator Quxbaz, radite kako biste osigurali da se sav novi sadržaj istisne?

Budući da se preglednik oslanja na URI za pronalaženje stavki u predmemoriji, ako se URI resursa promijeni, čini se da ga preglednik nikada nije vidio prije nego što krene po taj resurs s poslužitelja.

Stoga, promjenom URI-ja resursa iz www.foobar.com/about.htmlu www.foobar.com/about2.html(ili u www.quxbaz.com/about.html), preglednik neće pronaći nijedan resurs predmemorije povezan s tim URI-jem i izvršit će potpuno dohvaćanje s poslužitelja. Resurs bi mogao biti u osnovi isti kao izvornik pod starim URI-jem, ali preglednik to ne zna.

Ipak, ne morate mijenjati naziv stranice. Budući da je URI također uključuje niz upita po definiciji, možete dodati parametar verzije na URI: www.foobar.com/about.html?v=2hef9eb1.

U ovom slučaju, parametar verzije v postavlja novu, novu generiranu raspršenu vrijednost kad god se sadržaj promijeni ili ga pokrene neki drugi postupak, poput ponovnog pokretanja poslužitelja. Preglednik vidi da se niz upita promijenio i budući da nizovi upita mogu utjecati na ono što će se vratiti, donijet će ažurirani resurs s poslužitelja.

Nijedna od ovih tehnika neće funkcionirati ako se starom URI-ju izravno pristupi iz oznake. Ako pregledniku nije naloženo da ponovno provjeri URI na zadnjem predmemoriranom zahtjevu (ili je predmemorirani resurs istekao), neće izvršiti potpuno dohvaćanje za osvježavanje svoje predmemorije. To nas dovodi do sljedeće teme.

HTTP polja zaglavlja

Svaki zahtjev za resursom sadrži neke meta informacije poznate kao zaglavlje. Suprotno tome, svaki odgovor također ima povezane informacije o zaglavlju.

U nekim slučajevima preglednik vidi vrijednosti zaglavlja odgovora i mijenja odgovarajuće vrijednosti u sljedećim zaglavljima zahtjeva. Među tim vrijednostima zaglavlja su one koje utječu na to kako se predmemoriranje resursa izvodi u pregledniku.

HEAD zahtjevi i uvjetni zahtjevi

Zahtjev HEAD je poput skraćenog zahtjeva GET ili POST. Umjesto zahtjeva za cjelovitim resursom, zahtjev HEAD zahtijeva samo polja zaglavlja koja bi se inače vratila na puni zahtjev.

Zaglavlje resursa obično će biti puno manje (u broju ukupnih bajtova) od podataka resursa povezanih s njim ("tijelo" odgovora). Informacije o zaglavlju dovoljno su informativne da pregledniku omoguće određivanje svježine resursa u njegovoj predmemoriji.

Zahtjevi HEAD često se koriste za provjeru valjanosti resursa poslužitelja (to jest, postoji li resurs i ako postoji, je li ažuriran od posljednjeg pristupa pregledniku?). Preglednik će upotrijebiti ono u svojoj predmemoriji ako zahtjev HEAD ukaže da je resurs valjan, u suprotnom će izvršiti puni GET ili POST zahtjev i osvježiti svoju predmemoriju s onim što se vrati.

Uz uvjetni zahtjev, preglednik u zaglavlju šalje polja koja opisuju svježinu svog predmemoriranog resursa. Ovaj put poslužitelj utvrđuje je li predmemorija preglednika još uvijek svježa.

Ako jest, poslužitelj vraća odgovor 304 samo s informacijama o zaglavlju resursa, a bez tijela resursa (podataka). Ako se utvrdi da je predmemorija preglednika zastarjela, tada će poslužitelj vratiti punih 200 u redu odgovora.

Ovaj je mehanizam brži od korištenja HEAD zahtjeva, jer eliminira mogućnost izdavanja dva zahtjeva umjesto jednog.

Gore navedeno pojednostavljuje postupak koji može biti prilično kompliciran. Puno je finog podešavanja uključeno u predmemoriranje, ali sve se kontrolira kroz polja zaglavlja, od kojih je najvažnije upravljanje predmemorijom.

Kontrola predmemorije

Kada odgovara na zahtjev, poslužitelj će poslati polja zaglavlja pregledniku ukazujući na to koje ponašanje treba prilagoditi prilikom predmemoriranja. Ako stranicu učitam na //en.wikipedia.org/wiki/Uniform_Resource_Identifier, odgovor sadrži ovo u svom zapisu zaglavlja:

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

private znači da samo preglednik treba predmemorirati sadržaj dokumenta.

s-maxage i max-age postavljeni su na 0 . Vrijednost s-maxage odnosi se na proxy poslužitelje s predmemorijama, dok je max-age namijenjen pregledniku. Učinak postavljanja same max-age je da predmemorirani resurs istječe odmah, ali ipak se može koristiti (iako zastario) tijekom ponovnog učitavanja stranice u istoj sesiji preglednika.

Zastareli resurs može se revalidirati putem zahtjeva HEAD, a nakon toga može doći zahtjev GET ili POST, ovisno o odgovoru. Mora ponovne potvrde direktiva naredbe preglednik na revalidate resurs iz predmemorije ako je bez ukusa.

Budući da je u ovom slučaju max-age postavljeno na 0 , jednom se primi predmemorirani resurs. Kombinacija dviju direktiva jednaka je jedinstvenoj direktivi no-cache .

Dvije postavke osiguravaju da preglednik uvijek ponovno potvrdi predmemorirani resurs, bez obzira da li je i dalje u istoj sesiji ili ne.

Direktive o kontroli predmemorije vrlo su opsežne, a ponekad i zbunjujuće - tema su za sebe. Cjelovit dokumentirani popis smjernica možete pronaći ovdje.

E-oznaka

Ovo je znak koji poslužitelj šalje, a preglednik zadržava do sljedećeg zahtjeva. Koristi se samo kada preglednik zna da je životni vijek predmemorije istekao.

E-oznake su hash vrijednosti koje generira poslužitelj i koje često koriste fizičko ime datoteke resursa i datum zadnje izmjene na poslužitelju kao sjeme. Kada se datoteka resursa ažurira, promijenjeni datum se mijenja, a nova hash vrijednost se generira i šalje u zaglavlje odgovora na zahtjev.

Ostale oznake zaglavlja koje utječu na predmemoriranje

Oznake zaglavlja istječu i posljednje su izmjene sve samo zastarjele, no većina ih poslužitelja i dalje šalje radi kompatibilnosti sa starijim preglednicima. Primjer:

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

Ovdje se datum isteka postavlja na nulti datum (u prošlosti iz operativnog sustava UNIX). To znači da resurs istječe odmah, baš kao što to čini max-age = 0 . Posljednja izmjena govori pregledniku kada je izvršeno najnovije ažuriranje resursa, koje potom može upotrijebiti za odlučivanje treba li ga dohvatiti umjesto da koristi vrijednost predmemorije.

Prisiljavanje osvježavanja predmemorije iz preglednika

Što je teško ponovno napuniti?

Teško ponovno učitavanje prisiljava na ponovno dohvaćanje svih resursa na stranici, bilo da se radi o sadržaju, skriptama, tablicama stilova ili medijima. Skoro sve, zar ne?

Pa, neki resursi možda nisu izričito navedeni na stranici. Umjesto toga, mogu se dohvaćati dinamički, obično nakon što se sve eksplicitno učita.

Preglednik ne zna unaprijed da će se to dogoditi, a kad se dogodi, kasniji zahtjevi (obično pokrenuti skriptama) i dalje će koristiti predmemorirane kopije tih resursa ako su dostupni.

Što je jasna predmemorija i teško ponovno učitavanje?

Ova operacija briše cijelu predmemoriju preglednika, što ima isti učinak kao i teško ponovno učitavanje, ali dodatno uzrokuje i dohvaćanje dinamički učitanih resursa - uostalom, u predmemoriji nema ništa, pa nema izbora!

Mreže za isporuku sadržaja: predmemorija s geografskim smještajem

CDN je više nego samo predmemorija, ali predmemoriranje je jedan od njegovih poslova. CDN pohranjuje podatke na zemljopisno distribuiranim mjestima, tako da se smanjuje vrijeme povratnog putovanja do i iz zemljopisno lokalnog preglednika.

Zahtjevi preglednika usmjeravaju se na obližnji CDN, čime se skraćuju podaci o fizičkoj udaljenosti koji moraju prijeći. CDN-ovi također mogu obraditi velike količine prometa i pružaju sigurnost protiv nekih vrsta napada.

CDN svoje resurse dobiva putem Internet Exchange Point-a (IXP), čvorova koji su dio okosnice Interneta (s velikim slovima). Treba poduzeti korake za postavljanje usmjeravanja zahtjeva za odlazak na CDN umjesto poslužitelja domaćina. Sljedeći je korak osigurati da CDN ima trenutni sadržaj vašeg web mjesta.

U stara vremena većina CDN-ova podržavala je push metodu: web stranica bi gurala novi sadržaj u CDN čvorište, koji bi se zatim distribuirao na geografski raspodijeljene čvorove.

Danas većina CDN-ova koristi gore opisane protokole predmemoriranja (ili slične) za 1) preuzimanje novih resursa i 2) osvježavanje postojećih. Preglednik i dalje ima svoju predmemoriju, a ništa se od toga ne mijenja. Sve što CDN radi jest brži prijenos novih resursa.