Ada lebih dari satu cara untuk melakukan cache.
GET bersyarat
Jika Anda menyimpan gambar-gambar ini di sistem file dan menyajikannya langsung melalui server web, Anda mungkin sudah menggunakan get kondisional . Server web akan secara otomatis menggunakan metadata sistem file untuk mengatur header ETAG, dan secara otomatis akan menjawab dengan "304 Tidak Dimodifikasi" jika browser menyertakan If-Modified-Since
atau If-Matches
header dalam permintaannya. (Semua browser akan.)
Dalam hal ini seluruh gambar tidak disajikan kembali, sehingga Anda memiliki penghematan bandwidth. Namun, permintaan GET masih akan dikeluarkan, sehingga Anda masih memiliki overhead dan latensi permintaan.
Anda dapat mengurangi jumlah permintaan dengan mengorbankan kesegaran cache dengan membuat server web Anda menetapkan Cache-Control
header dengan public,max-age=N
nilai untuk gambar Anda. Ini mengatakan bahwa cache dapat menyimpan sumber daya paling banyak max-age
detik sebelum mereka harus memeriksa apakah itu diperbarui.
Namun, HTTP hanya menetapkan satu cara untuk membatalkan entri cache, yang mungkin tidak sesuai dengan semantik aplikasi Anda: jika Anda POST atau PUT ke url yang memperbarui foto profil, balas dengan Location: [url of photo]
header dan entri cache untuk url itu akan dibatalkan.
(Ini adalah mekanisme yang memungkinkan Anda untuk me-cache halaman web dengan komentar, dan kemudian memiliki halaman reload secara paksa oleh browser setelah pengguna memposting komentar baru. Browser akan membalas POST /comment
dengan 303 See Other
dan a Location: /page/with/comment
. Perhatikan bahwa ini tidak digunakan untuk bekerja di Firefox karena bug yang sudah berlangsung lama .)
Kecuali Anda memiliki banyak lalu lintas, pendekatan caching ini baik-baik saja.
Mengubah url
Sebuah url adalah representasi dari sumber daya, jadi cara lain untuk mengelola caching adalah tidak mengubah parameter cache untuk sumber daya, tetapi untuk membuat sumber daya baru dengan arahan "cache forever". Ini adalah pendekatan yang disukai "anak besar", karena memungkinkan mereka untuk tidak menghasilkan permintaan tambahan, menghemat banyak bandwidth. Kelemahannya adalah itu membutuhkan lebih banyak pembukuan tambahan.
Ada dua teknik umum untuk ini.
String pertanyaan
Server web mengabaikan string kueri saat menyajikan file dari sistem file. Namun, cache tidak: /1.jpg?t=12345
dan /1.jpg?t=67890
dua sumber daya yang sama sekali berbeda dan tidak terkait, meskipun server berpikir mereka sama.
Jadi satu hal mudah yang dapat Anda lakukan adalah menambahkan timestamp sistem file sebagai string kueri setiap kali Anda membuat referensi ke sumber daya di html Anda, dan mengatur Expires
header panjang . Browser kemudian akan menembolok sumber daya ini selamanya dan tidak melakukan GET apapun selama string kueri tidak berubah.
Kelemahannya adalah sulit atau tidak mungkin untuk menginstruksikan server web dari url baru untuk suatu item jika Anda ingin secara paksa membatalkan cache. Misalnya, jika browser memiliki halaman HTML dalam cache dengan /1.jpg?v=1
referensi, tetapi kebetulan menghapus entri untuk /1.jpg?v=1
(mungkin kehabisan file atau ruang memori), itu akan membuat permintaan baru untuk /1.jpg?v=1
. Jika sementara itu gambar berubah /1.jpg?v=2
, respons yang tepat adalah:
- Sajikan versi file yang lama. Anda akan melakukan ini jika Anda ingin semua sumber daya konsisten satu sama lain karena mereka berada pada titik waktu tertentu. Ini yang harus Anda lakukan dengan file CSS, misalnya, karena file css baru dengan file html lama mungkin tidak berfungsi dengan baik!
- Arahkan ke versi baru file menggunakan
301 Moved Permanently
. Anda akan melakukan ini jika Anda ingin semua sumber daya menjadi baru mungkin.
Kedua hal ini sulit dilakukan dengan server web saja, yang berarti Anda harus menjalankan aplikasi web bahkan untuk permintaan gambar, yang dapat menjadi lebih rumit dan lebih intensif sumber daya. Webservers sangat cepat dalam melayani file, sehingga overhead aplikasi web mungkin akhirnya menelan bandwidth dan keuntungan latensi Anda.
Nama file
Alih-alih menambahkan string kueri, Anda mengubah nama file. Ini berarti mudah untuk menyimpan beberapa versi file pada sistem file, tetapi Anda mungkin perlu menyimpan metadata file dan melakukan pembukuan basis data lainnya untuk melacak sumber daya dan nama mereka.