
Önbellek kurdunuz, site uçuyor. Sonra bir ürünün fiyatını güncellediniz ve müşteriler eski fiyatı görmeye devam etti. Önbellek çalışıyor — fazlasıyla çalışıyor.
Bu yazı, önbellekteki veriyi ne zaman ve nasıl atmanız gerektiğini ele alıyor.
Neden Zor Bir Problem?
Önbellek eklemek kolaydır, doğru zamanda temizlemek zordur:
- Veri birden fazla yerde önbelleklenir.
- Bir değişiklik çok kaydı etkiler.
- Bağımlılıklar görünmez.
- Erken temizlik performansı düşürür.
İkinci madde asıl karmaşıklığı üretir: bir ürünün fiyatını değiştirmek yalnızca o ürün sayfasını değil, kategori listelerini, arama sonuçlarını, sepet özetlerini ve ana sayfadaki vitrini de etkiler.
Yalnızca ürün kaydını temizlemek yeterli olmaz ve tutarsız bir durum ortaya çıkar.
Üçüncü madde ise zamanla büyür. Hangi önbellek kaydının hangi veriye bağlı olduğu, kod büyüdükçe takip edilemez hâle gelir.
Üç Temel Strateji
| Strateji | Nasıl çalışır |
|---|---|
| Süre tabanlı | Belirli süre sonra kendiliğinden düşer |
| Olay tabanlı | Veri değişince silinir |
| Sürüm tabanlı | Anahtar değişir, eski kendiliğinden ölür |
Üçüncü satır en zarif çözümdür ve az bilinir: önbellek anahtarına verinin son güncelleme zamanını eklemek, veri değiştiğinde anahtarın da değişmesini sağlar — eski kayıt silinmez, sadece artık kimse onu istemez.
Bu yaklaşım silme işleminin karmaşıklığını tamamen ortadan kaldırır.
Birinci satır ise en basit olanıdır ve çoğu durumda yeterlidir. Kısa süreli bir tutarsızlığı kabul edebiliyorsanız, karmaşık bir mekanizmaya gerek yoktur.
Doğru Süreyi Seçmek
Süre tabanlı yaklaşımda kritik karar budur:
- Verinin değişme sıklığı.
- Eski veri göstermenin bedeli.
- Yeniden üretme maliyeti.
İkinci madde belirleyici olmalıdır: bir blog yazısının beş dakika eski görünmesi sorun değildir, ama bir ürünün stok durumunun beş dakika eski olması satılmış ürünü satmanıza yol açar.
Bu nedenle tek bir genel süre değeri kullanmak yanlıştır; veri türüne göre farklı süreler tanımlanmalıdır.
Üçüncü madde ise kısa sürenin maliyetini gösterir. Üretilmesi saniyeler süren bir rapor, sık sık yeniden hesaplanmamalıdır.
Etiketleme Yaklaşımı
İlişkili kayıtları birlikte yönetmenin yolu:
- Her önbellek kaydına etiket verilir.
- Bir kayıt birden fazla etiket taşıyabilir.
- Etiket bazında toplu temizlik yapılır.
Bu yöntem başta anlatılan sorunu çözer: bir ürüne ait tüm önbellek kayıtları aynı etiketi taşırsa, ürün güncellendiğinde tek bir komutla hepsi birden temizlenir — hangi sayfalarda göründüğünü bilmenize gerek kalmaz.
Kategori listesi hem kendi etiketini hem içindeki ürünlerin etiketlerini taşıyabilir.
Bu esneklik bir bedelle gelir; etiket eşlemesi de bellekte tutulur ve yönetilmesi gerekir.
Damga Sorunu
Popüler bir kaydın önbellekten düşmesi tehlikelidir:
| Aşama | Ne olur |
|---|---|
| Kayıt önbellekten düşer | Bir sonraki istek üretir |
| Aynı anda yüz istek gelir | Yüzü birden üretmeye çalışır |
| Veritabanı doyar | Site yavaşlar veya durur |
Bu senaryo çok gerçektir ve önbelleğin faydasını tersine çevirir: yoğun trafikli bir sayfanın önbelleği düştüğünde, aynı ağır sorgu aynı anda yüzlerce kez çalıştırılır ve veritabanı çöker.
Çözüm, üretimi tek bir isteğe kilitlemektir. İlk istek üretirken diğerleri bekler veya eski değeri alır.
Bir başka yaklaşım, süre dolmadan önce arka planda yenilemektir; kullanıcı hiç beklemez.
Çok Katmanlı Önbellek
Veri genellikle birden fazla yerde saklanır:
- Tarayıcı önbelleği.
- Dağıtım ağı önbelleği.
- Ters vekil önbelleği.
- Uygulama önbelleği.
- Veritabanı önbelleği.
Temizlik sırası önemlidir ve genellikle ters yönde yapılır: önce uygulama önbelleğini temizleyip sonra dağıtım ağını temizlemezseniz, ağ katmanı eski veriyi tekrar çekip yeniden önbelleğe alabilir.
Birinci maddeyi ise doğrudan temizleyemezsiniz. Tarayıcı önbelleği yalnızca doğru başlıklarla ve dosya adı değiştirilerek yönetilir.
Bu nedenle sık değişen içerikte tarayıcı önbelleği kısa tutulmalı, hiç değişmeyen varlıklarda ise uzun tutulup adı sürümlenmelidir.
Sık Yapılan Hatalar
- Tüm önbelleği toptan temizlemek.
- Hiç temizlememek.
- Yazma işleminde silmeyi unutmak.
- Boş sonucu önbelleklememek.
Dördüncü madde gizli bir performans sorunudur: bulunamayan bir kayıt için sonuç önbelleklenmezse, aynı olmayan kayıt sürekli veritabanından sorgulanır — ve bu, saldırganların kolayca kötüye kullanabileceği bir açıktır.
Boş sonuçlar da kısa bir süreyle önbelleklenmelidir.
Birinci madde ise acil durumlarda cazip gelir ama ağır bedel öder. Tüm önbelleği silmek, damga sorununu tüm sistemde aynı anda tetikler.
Önbelleği İzlemek
| Metrik | Ne söyler |
|---|---|
| İsabet oranı | Önbellek işe yarıyor mu |
| Bellek kullanımı | Sınıra yakın mı |
| Çıkarma sayısı | Yer yetmiyor mu |
| Ortalama kayıt boyutu | Verimlilik |
Üçüncü satır sessiz bir sorunu ortaya çıkarır: yüksek çıkarma sayısı, önbelleğin dolduğu ve kayıtların süresi dolmadan atıldığı anlamına gelir — bu durumda önbellek beklediğinizden çok daha az işe yarar.
Çözüm ya bellek artırmak ya da neyin önbelleklendiğini gözden geçirmektir.
Birinci satır ise temel göstergedir. Düşük isabet oranı, önbellek stratejinizin yanlış olduğunu söyler.
Önbellek sunucusu için yeterli bellek ayırmanız gerekir; sanal sunucu barındırma hizmeti paketlerinde bellek kapasitesi bu ihtiyaca göre seçilmelidir.
Sonuç
Önbellek geçersizleştirmenin zorluğu tek bir gerçekten doğar: bir ürünün fiyatını değiştirmek yalnızca ürün sayfasını değil, kategori listelerini, arama sonuçlarını ve vitrini de etkiler. En zarif çözüm sürüm tabanlı anahtarlardır — veri değiştiğinde anahtar da değişir, eski kayıt silinmez sadece istenmez. Ve damga sorununu unutmayın: yoğun bir sayfanın önbelleği düştüğünde aynı ağır sorgu yüzlerce kez çalıştırılır ve veritabanı çöker.
Sıkça Sorulan Sorular (SSS)
Önbellek temizlemek neden bu kadar zor?
Çünkü bir değişiklik çok sayıda kaydı etkiler. Bir ürünün fiyatını güncellemek ürün sayfasını, kategori listelerini, arama sonuçlarını, sepet özetlerini ve ana sayfa vitrinini birden etkiler. Yalnızca ürün kaydını temizlemek tutarsız bir duruma yol açar.
Hangi stratejiyi seçmeliyim?
Kısa süreli tutarsızlığı kabul edebiliyorsanız süre tabanlı yaklaşım çoğu durumda yeterlidir. Daha zarif çözüm sürüm tabanlı anahtarlardır: anahtara verinin son güncelleme zamanını eklerseniz veri değiştiğinde anahtar da değişir ve silme karmaşıklığı tamamen ortadan kalkar.
Önbellek düşünce site neden çöküyor?
Damga sorunu yaşıyorsunuz. Yoğun trafikli bir sayfanın önbelleği düştüğünde aynı ağır sorgu aynı anda yüzlerce kez çalıştırılır ve veritabanı doyar. Çözüm üretimi tek bir isteğe kilitlemek veya süre dolmadan önce arka planda yenilemektir.
Katmanları hangi sırayla temizlemeliyim?
İçten dışa: önce uygulama önbelleğini, sonra ters vekili, en son dağıtım ağını. Ters sırayla yaparsanız dış katman eski veriyi tekrar çekip yeniden önbelleğe alabilir. Tarayıcı önbelleğini ise doğrudan temizleyemezsiniz; doğru başlıklar ve sürümlenmiş dosya adlarıyla yönetilir.