HTTP-keshlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

HTTP-keshlash veb-ilovaning samaradorligini sezilarli darajada oshirishi mumkin. HTTP-keshlash Cache-Control javob sarlavhasi va so‘rovlardagi shartli sarlavhalar, masalan Last-Modified va ETag atrofida quriladi. Cache-Control xususiy (masalan, brauzerga) va umumiy (masalan, proksi) keshlar qanday keshlashni va javoblarni qayta ishlatishni buyuradi. ETag sarlavhasi shartli so'rov uchun ishlatiladi, natijada, agar tarkib o'zgarmagan bo'lsa, tanasiz 304 (NOT_MODIFIED) javob keladi. ETagni Last-Modified sarlavhasining rivojlangan davomchisi deb hisoblash mumkin.

Ushbu bobda Spring WebFlux da mavjud bo‘lgan HTTP-keshlashga oid opsiyalar ta’rifi keltirilgan.

CacheControl

CacheControl Cache-Control sarlavhasi bilan bog‘liq parametrlarni sozlash vositalarini taqdim etadi va bir qator joylarda argument sifatida qabul qilinadi:

  • Kontrollerlar

  • Statik resurslar

Birga RFC 7234 javob sarlavhasi Cache-Control uchun barcha mumkin bo‘lgan direktivlarni tavsiflaydi, CacheControl turi umumiy holatlar bilan bog‘liq ssenariylar ustida ishlaydigan yondashuvni ishlatadi:

Java
// Bir soatlik kesh - "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 kunlik kesh xususiy va umumiy keshlar uchun,
// umumiy keshi javobni o'zgartirmasligi kerak
// "Cache-Control: max-age=864000, public, no-transform"
CacheControl ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic();
Kotlin
// Bir soatlik kesh - "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 kunlik kesh xususiy va umumiy keshlar uchun,
// umumiy keshi javobni o'zgartirmasligi kerak
// "Cache-Control: max-age=864000, public, no-transform"
val ccCustom = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform().cachePublic()

Kontrollerlar

Kontrollerlar HTTP-keshlash uchun aniq qo‘llab-quvvatlashni qo‘shishi mumkin. Biz buni tavsiya qilamiz, chunki resurs uchun lastModified yoki ETag qiymatini hisoblash kerak, shundan so‘ng uni shartli sarlavhalar bilan solishtirish mumkin bo‘ladi. Kontroller ETag va Cache-Control parametrlarini ResponseEntityga qo‘shishi mumkin, bu quyidagi misolda ko‘rsatilgan:

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)
}

Yuqoridagi misolda shartli sarlavhalar bilan solishtirish tarkib o‘zgarmaganligini ko‘rsatsa, 304 (NOT_MODIFIED) javob bo‘sh tanasi bilan yuboriladi. Aks holda, ETag va Cache-Control sarlavhalari javobga qo‘shiladi.

Shuningdek, siz kontrollerda shartli so‘rov sarlavhalariga tekshiruvni amalga oshirishingiz mumkin, quyidagi misolda ko‘rsatilganidek:

Java
@RequestMapping
public String myHandleMethod(ServerWebExchange exchange, Model model) {
long eTag = ... 
if (exchange.checkNotModified(eTag)) {
return null; 
}
model.addAttribute(...); 
return "myViewName";
}
  1. Maxsus ilova uchun hisoblash.
  2. Javob 304 (NOT_MODIFIED) deb belgilangan. Keyingi qayta ishlov berish amalga oshirilmaydi.
  3. So‘rovni qayta ishlashni davom ettiramiz.
Kotlin
@RequestMapping
fun myHandleMethod(exchange: ServerWebExchange, model: Model): String? {
val eTag: Long = ... 
if (exchange.checkNotModified(eTag)) {
return null
}
model.addAttribute(...) 
return "myViewName"
}
  1. Maxsus ilova uchun hisoblash.
  2. Javob 304 (NOT_MODIFIED) deb belgilangan. Keyingi qayta ishlov berish amalga oshirilmaydi.
  3. So‘rovni qayta ishlashni davom ettiramiz.

Shartli so‘rovlarni eTag, lastModified qiymatlariga yoki ikkalasiga tekshirish imkoniyati mavjud. GET va HEAD shartli so‘rovlari uchun javobni 304 (NOT_MODIFIED) qilib sozlash mumkin. POST, PUT va DELETE shartlilari uchun esa, o‘rniga javobni 412 (PRECONDITION_FAILED) qilib sozlash orqali bir vaqtda tahrir qilishni oldini olishingiz mumkin.

Statik resurslar

Optimal ishlash uchun statik resurslarni Cache-Control va shartli javob sarlavhalaridan foydalangan holda qayta ishlash kerak. Statik resurslar sozlamalari bo'yicha bo‘limga qarang.

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