HTTP-keshlash

All lectures for UZ purposes
Daraja , Dars
Mavjud

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:

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:

Java
// 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();
Kotlin
// 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 qiymati Cache-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 yordamida n 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:

Java
@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);
}
Kotlin
@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:

Java
@RequestMapping
public String myHandleMethod(WebRequest request, Model model) {
    long eTag = ... 
    if (request.checkNotModified(eTag)) {
        return null; 
    }
    model.addAttribute(...); 
    return "myViewName";
}
  1. Konkret ilova uchun hisoblash.
  2. Javob 304 (NOT_MODIFIED) ga o'rnatildi – qo'shimcha ishlov berish taqiqlangan.
  3. So'rovni qayta ishlashni davom ettiramiz.
Kotlin
@RequestMapping
fun myHandleMethod(request: WebRequest, model: Model): String? {
    val eTag: Long = ... 
    if (request.checkNotModified(eTag)) {
        return null 
    }
    model[...] = ... 
    return "myViewName"
}
  1. Konkret ilova uchun hisoblash.
  2. Javob 304 (NOT_MODIFIED) ga o'rnatildi – qo'shimcha ishlov berish taqiqlangan.
  3. 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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION