HTTP-keshlash veb-ilovaning ishlashini sezilarli darajada oshirishi mumkin. HTTP-keshlash javob sarlavhasi Cache-Control
va shu bilan bog'liq shartli so'rov sarlavhalari (masalan, Last-Modified
va ETag
) atrofida qurilgan. Cache-Control
shaxsiy (masalan, brauzer) va ommaviy (masalan, proksi) keshlarga qanday qilib keshlash va javoblarni qayta ishlatishni ko'rsatadi. ETag
shartli so'rov uchun ishlatiladi, bu kontent o'zgarmagan bo'lsa, 304 (NOT_MODIFIED) javobiga olib kelishi mumkin. ETag
yanada rivojlangan Last-Modified
ning vorisi deb hisoblanishi mumkin.
Bu bo'limda Spring Web MVC da mavjud bo'lgan HTTP-keshlash bilan bog'liq variantlar tavsiflangan.
CacheControl
CacheControl
Cache-Control
sarlavhasi bilan bog'liq parametrlarni sozlash uchun qulay vositalarni taqdim etadi va ko'plab joylarda argument sifatida qabul qilinadi:
-
Kontrollerlar
-
Statik resurslar
RFC 7234 Cache-Control
javob sarlavhasi uchun barcha mumkin bo'lgan direktivlarni tavsiflaydi, CacheControl
turi esa aniq foydalanish holatlariga yo'naltirilgan yondashuvdan foydalanadi, bu umumiy ssenariylarga qaratilgan:
// Bir soat davomida keshlash - "Cache-Control: max-age=3600"
CacheControl ccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS);
// Keshlashni oldini olish - "Cache-Control: no-store".
CacheControl ccNoStore = CacheControl.noStore();
// O'n kun davomida ommaviy va shaxsiy keshlarda keshlash,
// ommaviy kesh javobni o'zgartirmasligi kerak
// "Cache-Control: max-age=864000, public, no-transform"
CacheControl ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic();
// Bir soat davomida keshlash - "Cache-Control: max-age=3600"
val ccCacheOneHour = CacheControl.maxAge(1, TimeUnit.HOURS)
// Keshlashni oldini olish - "Cache-Control: no-store".
val ccNoStore = CacheControl.noStore()
// O'n kun davomida ommaviy va shaxsiy keshlarda keshlash,
// ommaviy kesh javobni o'zgartirmasligi kerak
// "Cache-Control: max-age=864000, public, no-transform"
val ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic()
WebContentGenerator
ham cachePeriod
deb nomlangan oddiyroq xususiyatni qabul qiladi (sekundlarda belgilangan) va u quyidagicha ishlaydi:
-
-1
qiymatiCache-Control
javob sarlavhasini yaratmaydi. -
0
qiymati"Cache-Control: no-store"
direktivasi yordamida keshlashni oldini oladi. -
n > 0
qiymati berilgan javobni"Cache-Control: max-age=n"
direktivasi yordamidan
sekund davomida keshlaydi.
Kontrollerlar
Kontrollerlar HTTP-keshlashni aniq qo'llab-quvvatlashni qo'shishi mumkin. Biz buni tavsiya qilamiz, chunki lastModified
yoki ETag
qiymatini izlash kerak, undan so'ngroq shartli so'rov sarlavhalari bilan solishtirish mumkin. Kontroller ETag
sarlavhasini va Cache-Control
parametrlarini ResponseEntity
ga qo'shishi mumkin, quyidagi misolda ko'rsatilganidek:
@GetMapping("/book/{id}")
public ResponseEntity<Book> showBook(@PathVariable Long id) {
Book book = findBook(id);
String version = book.getVersion();
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag(version) // lastModified ham mavjud
.body(book);
}
@GetMapping("/book/{id}")
fun showBook(@PathVariable id: Long): ResponseEntity<Book> {
val book = findBook(id);
val version = book.getVersion()
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag(version) // lastModified ham mavjud
.body(book)
}
Oldingi misolda 304 (NOT_MODIFIED) javobi bo'sh tanasi bilan yuboriladi, agar shartli so'rovlar sarlavhalari bilan solishtirish natijasida kontent o'zgarmagan bo'lsa. Aks holda, ETag
va Cache-Control
sarlavhalari javobga qo'shiladi.
Siz ham shartli so'rov sarlavhalarini tekshirishni kontrollerda amalga oshirishingiz mumkin, quyidagi misolda ko'rsatilganidek:
@RequestMapping
public String myHandleMethod(WebRequest request, Model model) {
long eTag = ...
if (request.checkNotModified(eTag)) {
return null;
}
model.addAttribute(...);
return "myViewName";
}
- Konkret ilova uchun hisoblash.
- Javob 304 (NOT_MODIFIED) ga o'rnatildi – qo'shimcha ishlov berish taqiqlangan.
- So'rovni qayta ishlashni davom ettiramiz.
@RequestMapping
fun myHandleMethod(request: WebRequest, model: Model): String? {
val eTag: Long = ...
if (request.checkNotModified(eTag)) {
return null
}
model[...] = ...
return "myViewName"
}
- Konkret ilova uchun hisoblash.
- Javob 304 (NOT_MODIFIED) ga o'rnatildi – qo'shimcha ishlov berish taqiqlangan.
- So'rovni qayta ishlashni davom ettiramiz.
Shartli so'rovlarning eTag
qiymatiga, lastModified
qiymatiga yoki ikkalasiga mos kelishini tekshirishning uchta varianti mavjud. GET
va HEAD
shartli so'rovlari uchun javobni 304 (NOT_MODIFIED) ga o'rnatish mumkin. Shartli POST
, PUT
va DELETE
so'rovlari uchun siz o'rniga 412 (PRECONDITION_FAILED) javobini o'rnatib, bir vaqtda modifikatsiyani oldini olishingiz mumkin.
Statik resurslar
Optimum ishlash uchun statik resurslar Cache-Control
va shartli javob sarlavhalari yordamida ishlov berilishi kerak.
ETag
Filtri
ShallowEtagHeaderFilter
javobning kontentidan hisoblangan "yuza" eTag
qiymatlarini qo'shish uchun ishlatilishi mumkin va shuning uchun o'tkazuvchanlikni tejaydi, ammo protsessor vaqtini emas.
GO TO FULL VERSION