Pertama, apa itu cache?
Secara umum, cache (diucapkan "tunai") adalah sejenis repositori. Anda boleh menganggap repositori sebagai simpanan simpanan. Dalam ketenteraan, ini adalah untuk menyimpan senjata, makanan, dan bekalan lain yang diperlukan untuk menjalankan misi.

Dalam sains komputer, "persediaan" ini disebut sumber, di mana sumbernya adalah skrip, kod, dan kandungan dokumen. Yang terakhir ini kadang-kadang lebih khusus disebut sebagai "aset" seperti teks, data statik, media, dan hiperpautan, tetapi di sini saya hanya akan menggunakan sumber satu istilah .
Perbezaan antara cache dan jenis repositori lain
Tujuan utama cache adalah untuk mempercepat pengambilan sumber halaman web, mengurangkan masa muat halaman. Aspek penting lain dari cache adalah memastikannya mengandungi data yang agak segar.
Artikel ini akan merangkumi dua kaedah caching yang lazim: cache penyemak imbas dan Rangkaian Penghantaran Kandungan (CDN).
Selain cache, repositori lain turut bermain dalam seni bina web; selalunya ini dirancang untuk menyimpan banyak data. Namun, mereka tidak fokus pada prestasi pengambilan.
Sebagai contoh, Amazon Glacier adalah repositori data yang direka untuk menyimpan data dengan murah, tetapi tidak mengambilnya dengan cepat. Sebaliknya, pangkalan data SQL dirancang agar fleksibel, terkini, dan cepat, tetapi jarang sekali murah dan tidak sepantas cache.
Cache Penyemak Imbas: cache memori
Cache memori menyimpan sumber secara tempatan di komputer tempat penyemak imbas berjalan. Semasa penyemak imbas aktif, sumber yang diambil akan disimpan pada memori fizikal komputer (RAM), dan mungkin juga pada cakera keras.
Kemudian, apabila tepat sumber yang sama diperlukan apabila kembali melawat laman web, pelayar akan menarik mereka dari cache dan bukannya pelayan jauh. Oleh kerana cache disimpan secara tempatan, dalam memori cepat, sumber daya tersebut diambil lebih cepat, dan halaman dimuat lebih cepat.

Kepantasan pengambilan sumber adalah mustahak, tetapi begitu juga keperluan sumber itu segar. Sumber basi adalah sumber yang sudah usang dan mungkin tidak lagi sah.
Sebahagian daripada tugas penyemak imbas adalah untuk mengenal pasti sumber daya yang disimpan dalam cache yang basi, dan mendapatkan kembali sumber yang ada. Oleh kerana halaman web biasanya mempunyai sumber daya, biasanya akan terdapat campuran versi basi dan segar di cache.
Bagaimana penyemak imbas mengetahui apa yang basi dalam cache?
Jawapannya tidak mudah, tetapi ada dua pendekatan utama: medan tajuk cache-busting dan HTTP.
cache-busting

Cache-busting adalah teknik sisi pelayan yang memastikan bahawa penyemak imbas hanya memperoleh sumber baru. Ia melakukan ini secara tidak langsung.
Walaupun cache-busting mungkin terdengar dramatik, ia benar-benar tidak mematahkan apa-apa, dan bahkan tidak menyentuh apa yang sudah disimpan dalam penyemak imbas. Semua cache-busting lakukan adalah mengubah URI sumber asli dengan cara yang menjadikannya kelihatan pada penyemak imbas bahawa sumbernya benar-benar baru. Oleh kerana ia kelihatan baru, ia tidak akan berada dalam cache penyemak imbas. Versi lama sumber cache masih akan disimpan dalam cache, tetapi akhirnya akan layu dan mati, tidak akan dapat diakses lagi.
Katakanlah saya mempunyai laman web di www.foobar.com/about.html
mana terdapat semua maklumat mengenai foobar.com yang anda ingin tahu. Sebaik sahaja anda melayari halaman itu, halaman dan sumber yang berkaitan dengannya disimpan dalam cache oleh penyemak imbas.
Kemudian, foobar.com dibeli oleh syarikat Quxbaz, dan kandungan halaman berkenaan mengalami perubahan yang ketara. Cache penyemak imbas tidak akan mempunyai kandungan baru itu, namun mungkin masih mempercayai kandungan yang ada sekarang dan tidak akan pernah mencuba mendapatkannya semula.
Apa yang anda lakukan, pentadbir web Quxbaz untuk memastikan semua kandungan baru dikeluarkan?
Oleh kerana penyemak imbas bergantung pada URI untuk mencari item dalam cache, jika URI sumber berubah, seperti penyemak imbas tidak pernah melihatnya sebelum pergi untuk mengambil sumber itu dari pelayan.
Oleh itu, dengan menukar URI sumber dari www.foobar.com/about.html
ke www.foobar.com/about2.html
(atau ke www.quxbaz.com/about.html
), penyemak imbas tidak akan menemui sumber cache yang berkaitan dengan URI itu, dan melakukan pengambilan penuh dari pelayan. Sumbernya mungkin hampir sama dengan yang asli di bawah URI lama, tetapi penyemak imbas tidak mengetahuinya.
Anda tidak perlu menukar nama halaman. Sejak URI juga termasuk rentetan pertanyaan mengikut definisi, anda boleh menambah parameter versi kepada URI: www.foobar.com/about.html?v=2hef9eb1
.
Dalam hal ini, parameter versi v ditetapkan baru nilai hash yang dihasilkan setiap kali kandungan berubah, atau dipicu oleh beberapa proses lain, seperti restart pelayan. Penyemak imbas melihat bahawa rentetan pertanyaan telah berubah, dan kerana rentetan pertanyaan dapat mempengaruhi apa yang akan dikembalikan, ia akan mengambil sumber terkini dari pelayan.
Kedua-dua teknik ini tidak akan berfungsi sekiranya URI lama diakses secara langsung dari penanda buku. Kecuali penyemak imbas diperintahkan untuk mengesahkan semula URI pada permintaan terakhir yang disimpan dalam cache (atau sumber yang di-cache telah habis masa berlakunya), ia tidak akan mengambil sepenuhnya untuk menyegarkan cache. Ini membawa kita ke topik seterusnya.
Medan tajuk HTTP
Setiap permintaan sumber dilengkapi dengan beberapa maklumat meta yang dikenali sebagai tajuk. Sebaliknya, setiap respons juga mempunyai maklumat tajuk yang berkaitan dengannya.
Dalam beberapa kes, penyemak imbas melihat nilai tajuk respons, dan mengubah nilai yang sesuai dalam tajuk permintaan berikutnya. Antara nilai header ini adalah nilai yang mempengaruhi bagaimana cache sumber dilakukan pada penyemak imbas.
Permintaan KEPALA dan permintaan bersyarat
Permintaan KEPALA seperti permintaan GET yang terpotong atau permintaan POST. Daripada meminta sumber yang lengkap, permintaan HEAD hanya meminta bidang header yang sebaliknya akan dikembalikan atas permintaan penuh.
Tajuk sumber biasanya akan jauh lebih kecil (dalam jumlah keseluruhan bait) daripada data sumber yang berkaitan dengannya ("badan" respons). Maklumat tajuk cukup informatif untuk membolehkan penyemak imbas menentukan kesegaran sumber dalam cache-nya.
Permintaan HEAD sering digunakan untuk mengesahkan kesahihan sumber pelayan (iaitu, adakah sumber masih ada, dan jika ya, adakah ia telah dikemas kini sejak penyemak imbas terakhir mengaksesnya?). Penyemak imbas akan menggunakan apa yang ada di cache jika permintaan HEAD menunjukkan sumbernya sah, jika tidak, ia akan melakukan permintaan GET atau POST penuh dan menyegarkan cache dengan apa yang dikembalikan.
Dengan permintaan bersyarat, penyemak imbas menghantar medan di tajuk menerangkan kesegaran sumber cache. Kali ini, pelayan menentukan apakah cache penyemak imbas masih segar.
Sekiranya ada, pelayan mengembalikan respons 304 dengan hanya maklumat tajuk sumber, dan tanpa badan sumber (data). Sekiranya cache penyemak imbas ditentukan ketinggalan zaman, maka pelayan akan mengembalikan respons 200 OK sepenuhnya.
Mekanisme ini lebih cepat daripada menggunakan permintaan HEAD, kerana menghilangkan kemungkinan harus mengeluarkan dua permintaan dan bukan satu.
Perkara di atas memudahkan proses yang agak rumit. Terdapat banyak penyesuaian yang terlibat dalam penyimpanan cache, tetapi semuanya dikendalikan melalui bidang tajuk, yang paling penting adalah kawalan cache.
Kawalan Cache
Semasa menjawab permintaan, pelayan akan menghantar medan tajuk ke penyemak imbas yang menunjukkan tingkah laku apa yang harus disesuaikan ketika melakukan cache. Sekiranya saya memuatkan halaman di //en.wikipedia.org/wiki/Uniform_Resource_Identifier
, respons mengandungi ini dalam rekod tajuknya:
cache-control: private, s-maxage=0, max-age=0, must-revalidate
peribadi bermaksud bahawa hanya penyemak imbas yang menyimpan kandungan dokumen dalam cache.
s-maxage dan max-age ditetapkan ke 0 . Nilai s-maxage adalah untuk pelayan proksi dengan cache, sedangkan usia maksimum ditujukan untuk penyemak imbas. Kesan menetapkan usia maksimum sahaja ialah sumber daya yang di-cache akan habis serta merta, namun ia masih boleh digunakan (walaupun basi) semasa memuatkan semula halaman semasa dalam sesi penyemak imbas yang sama.
Sumber basi mungkin validasi melalui permintaan HEAD, yang mungkin diikuti oleh permintaan GET atau POST, bergantung pada respons. Arahan must-revalidate memerintahkan penyemak imbas untuk mengesahkan semula sumber cache jika sudah basi.
Oleh kerana usia maksimum ditetapkan ke 0 dalam kes ini, sumber daya yang disimpan dalam cache akan menjadi basi setelah diterima. Gabungan kedua arahan itu setara dengan arahan tunggal tanpa cache .
Kedua-dua tetapan memastikan bahawa penyemak imbas sentiasa mengesahkan semula sumber cache, sama ada masih dalam sesi yang sama atau tidak.
Arahan kawalan cache sangat luas, dan kadang-kadang membingungkan - mereka adalah topik tersendiri. Senarai arahan yang didokumentasikan lengkap boleh didapati di sini.
E-tag
Ini adalah token yang dihantar oleh pelayan dan penyemak imbas mengekalkan sehingga permintaan seterusnya. Ini hanya digunakan apabila penyemak imbas mengetahui bahawa jangka hayat cache sumber telah tamat.
E-tag adalah nilai hash yang dihasilkan oleh pelayan, yang sering menggunakan nama fail fizikal sumber dan tarikh terakhir diubah pada pelayan sebagai pilihan. Apabila fail sumber dikemas kini, tarikh yang diubah akan berubah, dan nilai hash baru dihasilkan dan dihantar dalam tajuk respons untuk permintaan tersebut.
Tag tajuk lain yang mempengaruhi caching
Tag header tamat dan diubah terakhir semuanya sudah usang, namun masih dihantar oleh kebanyakan pelayan untuk keserasian mundur dengan penyemak imbas yang lebih lama. Satu contoh:
expires: Thu, 01 Jan 1970 00:00:00 GMT last-modified: Sun, 01 Mar 2020 17:59:02 GMT
Di sini, tempoh tamat ditetapkan pada tarikh nol (secara historis, dari sistem operasi UNIX). Itu menunjukkan bahawa sumber daya akan segera habis, sama seperti usia maksimum = 0 . Pengubahsuaian terakhir memberitahu penyemak imbas kapan kemas kini terbaru dibuat ke sumber, yang kemudian dapat digunakannya untuk memutuskan apakah perlu mendapatkannya semula daripada menggunakan nilai cache.
Memaksa penyegaran cache dari penyemak imbas
Apa itu tambah nilai yang sukar?
Muat semula yang kuat memaksa pengambilan semula semua sumber pada halaman, sama ada kandungan, skrip, helaian gaya atau media. Hampir semuanya, bukan?
Sebilangan sumber mungkin tidak disertakan secara eksplisit di halaman. Sebagai gantinya, mereka dapat diambil secara dinamik, biasanya setelah semuanya dimuat secara eksplisit.
Penyemak imbas tidak tahu terlebih dahulu bahawa ini akan berlaku, dan apabila benar, permintaan kemudian (yang dimulakan oleh skrip, biasanya) masih akan menggunakan salinan cache sumber tersebut jika ada.
Apakah cache yang jelas dan muat semula yang sukar?
Operasi ini membersihkan keseluruhan cache penyemak imbas, yang mempunyai kesan yang sama dengan muat semula keras, tetapi juga menyebabkan sumber yang dimuat secara dinamik diambil juga - bagaimanapun, tidak ada apa-apa di dalam cache, jadi tidak ada pilihan!
Rangkaian Penghantaran Kandungan: cache yang terletak di geo

CDN lebih daripada sekadar cache, tetapi cache adalah salah satu tugasnya. CDN menyimpan data di lokasi yang diedarkan secara geografi sehingga masa perjalanan pergi balik ke dan dari penyemak imbas tempatan secara geografi dikurangkan.
Permintaan penyemak imbas disalurkan ke CDN yang berdekatan, sehingga memendekkan data tindak balas jarak fizikal yang harus dilalui. CDN juga dapat menangani sejumlah besar lalu lintas, dan memberikan keamanan terhadap beberapa jenis serangan.
CDN memperoleh sumbernya melalui Titik Pertukaran Internet (IXP), node yang merupakan sebahagian daripada tulang belakang Internet (dalam huruf besar). Ada langkah-langkah yang harus diambil untuk mengatur permintaan routing untuk pergi ke CDN dan bukannya pelayan host. Langkah seterusnya adalah memastikan CDN mempunyai kandungan semasa laman web anda.
Pada masa lalu, kebanyakan CDN menyokong kaedah tolak: laman web akan memasukkan kandungan baru ke hab CDN, yang kemudian akan diedarkan ke nod yang tersebar secara geografi.
Pada masa kini, kebanyakan CDN menggunakan protokol caching yang dijelaskan di atas (atau serupa) untuk 1) memuat turun sumber baru, dan 2) memuat semula yang ada. Penyemak imbas masih mempunyai cache, dan tidak ada yang berubah. Semua yang dilakukan oleh CDN adalah mempercepat pemindahan sumber baru tersebut.