İletişim

Önbellek (Cache) Nedir?

Kısa tanım

Önbellek (cache), sık erişilen ya da üretilmesi maliyetli verilerin bir kopyasının daha hızlı ulaşılabilecek bir yerde geçici olarak saklanmasıdır. Aynı veri yeniden istendiğinde asıl kaynağa, örneğin veritabanına veya uzak sunucuya gidilmeden önbellekten sunulur. Web'de önbellek tarayıcıda, CDN'de, sunucuda ve uygulama katmanında bulunabilir. Doğru kullanıldığında yanıt sürelerini ve sunucu yükünü azaltır; yanlış kullanıldığında güncelliğini yitirmiş verinin gösterilmesine yol açar.

Diğer adları: cache, caching, ön bellek, önbellekleme

İsteğin önbellekte bulunduğunda hızlıca yanıtlandığını, bulunmadığında kaynak sunucudan alınıp saklandığını gösteren akış

Önbellek katmanları

Bir web sayfası yüklenirken aynı veri, sunucudan kullanıcıya uzanan yol üzerinde birkaç farklı noktada önbelleğe alınabilir:

KatmanNerede?Ne saklar?
Tarayıcı önbelleğiKullanıcının cihazıCSS, JavaScript, görseller, fontlar, bazen HTML
CDN önbelleğiKullanıcıya coğrafi olarak yakın sunucularStatik dosyalar ve önbelleklenebilir sayfalar
Sunucu / ters proxy önbelleğiUygulamanın önündeki Nginx veya Varnish gibi katmanlarHazır üretilmiş HTTP yanıtları
Uygulama önbelleğiUygulama ile veritabanı arasındaSorgu sonuçları, hesaplanmış değerler, oturum verisi

İlk üç katman HTTP kurallarıyla, yani yanıt başlıklarıyla yönetilir. Uygulama önbelleğini ise geliştirici kod içinde açıkça yönetir: önce önbelleğe bakılır, veri orada yoksa veritabanından okunur ve belirli bir süreyle önbelleğe yazılır. Bu desene cache-aside denir. Veriyi RAM'de tutan Redis gibi bellek içi (in-memory) veri depoları bu iş için sıkça tercih edilir.

HTTP önbelleğini Cache-Control yönetir

# Dosya adında içerik özeti (hash) bulunan statik dosya, ör. app.3f9a1c.js
Cache-Control: public, max-age=31536000, immutable

# Sık değişebilen HTML sayfası
Cache-Control: no-cache
ETag: "a7c3-5f1"

# Kişisel veri içeren yanıt
Cache-Control: private, no-store
  • max-age: Yanıtın sunucuya sorulmadan kaç saniye kullanılabileceği.
  • no-cache: Yanıt saklanabilir, ama her kullanımdan önce sunucuyla doğrulanmalıdır. Adının çağrıştırdığının aksine “önbelleğe alma” anlamına gelmez.
  • no-store: Yanıt hiçbir önbellekte saklanmamalıdır.
  • private: Yalnızca kullanıcının tarayıcısı saklayabilir; CDN gibi paylaşılan önbellekler saklayamaz.

Doğrulama sırasında tarayıcı elindeki ETag değerini If-None-Match başlığıyla gönderir. İçerik değişmemişse sunucu gövdesiz bir 304 Not Modified durum koduyla yanıt verir ve dosya yeniden indirilmez. Tüm yönergelerin ayrıntısı MDN'nin Cache-Control sayfasında bulunabilir.

Asıl zor kısım: geçersiz kılma

Önbelleğe veri koymak kolaydır; zor olan, kaynak değiştiğinde eski kopyayı zamanında devreden çıkarmaktır. Yaygın yaklaşımlar şunlardır:

  • Süreye dayalı (TTL): Her kayıt belirli bir süre sonra kendiliğinden geçersiz olur. Basittir, ama bu süre boyunca eski verinin gösterilebileceğini kabul etmek gerekir.
  • Dosya adını sürümlemek: İçerik değişince dosya adı da değişir (app.3f9a1c.js yerine app.8b20de.js). Eski dosya önbellekte kalsa bile HTML artık yeni adı gösterdiği için sorun çıkmaz. Modern derleme araçları bunu otomatik yapar.
  • Olay tabanlı temizleme: Veri güncellendiğinde ilgili önbellek anahtarı silinir veya CDN'e bir temizleme (purge) isteği gönderilir.

Performansa etkisi ve sık yapılan hatalar

İyi kurgulanmış bir önbellek sunucu yükünü azaltır ve tekrar eden ziyaretlerde sayfaların çok daha hızlı açılmasını sağlar. CDN ve sunucu önbelleği, sunucunun ilk yanıt süresini kısalttığı için LCP gibi yükleme metriklerine de olumlu yansıyabilir. En sık görülen hatalar:

  • HTML'e uzun bir max-age vermek: Yayına alınan bir düzeltme kullanıcılara günlerce ulaşmaz.
  • Oturum açmış kullanıcıya özel bir sayfayı paylaşılan önbellekte bırakmak: Bir kullanıcının verisi başka birine gösterilebilir.
  • Önbelleği veritabanı yerine koymak: Önbellekteki veri her an silinebilir; uygulama önbellek boşken de doğru çalışmalıdır.
  • Her şeyi önbelleğe almak: Bir daha okunmayacak veriyi saklamak yalnızca bellek harcar.

Bir yanıtın hangi önbellek başlıklarıyla geldiğini görmek için tarayıcı geliştirici araçlarının Network sekmesine bakabilir ya da komut satırında curl -I https://example.com/ çalıştırabilirsiniz.

İlgili terimler

← Sözlüğe dön