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:
// 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();
// 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:
@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)
}
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:
@RequestMapping
public String myHandleMethod(ServerWebExchange exchange, Model model) {
long eTag = ...
if (exchange.checkNotModified(eTag)) {
return null;
}
model.addAttribute(...);
return "myViewName";
}
- Maxsus ilova uchun hisoblash.
- Javob 304 (NOT_MODIFIED) deb belgilangan. Keyingi qayta ishlov berish amalga oshirilmaydi.
- So‘rovni qayta ishlashni davom ettiramiz.
@RequestMapping
fun myHandleMethod(exchange: ServerWebExchange, model: Model): String? {
val eTag: Long = ...
if (exchange.checkNotModified(eTag)) {
return null
}
model.addAttribute(...)
return "myViewName"
}
- Maxsus ilova uchun hisoblash.
- Javob 304 (NOT_MODIFIED) deb belgilangan. Keyingi qayta ishlov berish amalga oshirilmaydi.
- 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.
GO TO FULL VERSION