Ö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

Önbellek katmanları
Bir web sayfası yüklenirken aynı veri, sunucudan kullanıcıya uzanan yol üzerinde birkaç farklı noktada önbelleğe alınabilir:
| Katman | Nerede? | Ne saklar? |
|---|---|---|
| Tarayıcı önbelleği | Kullanıcının cihazı | CSS, JavaScript, görseller, fontlar, bazen HTML |
| CDN önbelleği | Kullanıcıya coğrafi olarak yakın sunucular | Statik dosyalar ve önbelleklenebilir sayfalar |
| Sunucu / ters proxy önbelleği | Uygulamanın önündeki Nginx veya Varnish gibi katmanlar | Hazır üretilmiş HTTP yanıtları |
| Uygulama önbelleği | Uygulama ile veritabanı arasında | Sorgu 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-storemax-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.jsyerineapp.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-agevermek: 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.

