Android uygulamalarında verileri doğru şekilde nasıl önbelleğe alırsınız?
Kısaca: Önbellek gecikmeleri ve ağ trafiğini azaltır, ancak bir geçersiz kılma stratejisi gerektirir; veri türüne göre seviyeyi (bellek/disk/HTTP/veritabanı) seçin, TTL veya olay tabanlı güncellemeyi yapılandırın ve parametreleri ayarlamak için isabet/isabetsizlik oranlarını ölçün.
İçindekiler {{TOC_AUTOMATIC}}
Önbellekleme stratejileri ve ne zaman uygulanacağı
- Cache-aside (talep üzerine): Uygulama önbellekten okur, isabetsizlik durumunda kaynaktan alır ve önbelleğe yerleştirir. Nadiren değişen veriler ve karmaşık hesaplamalar için iyidir.
- Write-through: Hem önbelleğe hem de ana kaynağa aynı anda yazma — tutarlılığı sağlar, ancak yazma gecikmesini artırır.
- Write-back (write-behind): Hızlı yerel onay, arka planda sunucuya eşitleme — UX hassas işlemler için uygundur, ancak veri kaybına karşı koruma gerektirir.
- Read-through / Cache-through: Önbellek okumalar için ön yüz görevi görür — istemci mantığını basitleştirir, geçersiz kılmayı zorlaştırır.
Geçersiz kılma:
- TTL (zaman tabanlı) — basittir, öngörülebilir şekilde eskimeyen veriler için uygundur.
- Olay tabanlı — değişikliklere tepki verir (kayıt güncellemesi, çıkış yapma, anlık bildirim).
- Doğrulama (ETag/Last-Modified) — HTTP yanıtları için idealdir.
Önbelleği nerede saklamak: Avantajlar ve pratik ipuçları
- Bellek (bellek içi)
- LruCache veya kütüphaneler (Glide bellek önbelleği). Sıcak nesneler (bitmap, oturumlar) için kullanın.
- İşlem yaşarken hayatta kalır — işlem sonlandırıldığında korunmasını beklemeyin.
- Disk (disk üzerinde)
- Büyük ikili dosyalar ve API yanıtları için DiskLruCache / cacheDir.
- Arka planda okuma/yazma; G/Ç ve bitmap kod çözme işlemlerini göz önünde bulundurun.
- HTTP önbelleği (OkHttp)
- Cache ve doğru HTTP başlıkları aracılığıyla yapılandırılır. Doğrulamayı (ETag) destekler.
- Uygulama başına tek bir paylaşılan OkHttpClient — kritik önemdedir.
- Yerel Veritabanı / Anahtar-Değer
- Sorgularla yapılandırılmış veriler için Room; meta veriler ve zaman damgaları için DataStore/SharedPreferences.
- Özellikle görseller için
- Glide/Coil/Fresco: Çok katmanlı önbellekler (aktif → bellek → disk). Tekerleği yeniden icat etmeyin — kanıtlanmış çözümleri kullanın.
Disk/HTTP önbellek boyutunu deneysel olarak belirleyin (genellikle HTTP için 10–100 MB, görsel önbelleği için özelleştirilebilir limitler). Muhafazakar değerlerle başlayın ve ölçümlere göre ayarlayın.
Pratik örnekler (Kotlin)
OkHttp: disk önbelleğini bağlama
val cacheSize = 50L * 1024L * 1024L // 50 MB
val cacheDir = File(context.cacheDir, "http_cache")
val cache = Cache(cacheDir, cacheSize)
val okHttpClient = OkHttpClient.Builder()
.cache(cache)
.build()
Glide: doğru temizleme
// ana iş parçacığı
Glide.get(context).clearMemory()
// arka plan
Thread { Glide.get(context).clearDiskCache() }.start()
Bitmap için basit LruCache
val cacheSizeKb = (Runtime.getRuntime().maxMemory() / 1024 / 8).toInt()
val memoryCache = object : LruCache<String, Bitmap>(cacheSizeKb) {
override fun sizeOf(key: String, value: Bitmap) = value.byteCount / 1024
}
Uygulamanızı her başlattığınızda önbelleği temizlemeyin — bu, önbelleğin faydasını yok eder ve ağ trafiğini artırır.
Yaşam döngüsü yönetimi ve temizleme
- Tahliye: LRU — standart seçimdir, disk LRU taşma durumunda eski öğeleri siler.
- Zorunlu temizleme: cache.evictAll() (OkHttp), Glide.clearMemory()/clearDiskCache().
- Temizliği ne zaman çağırmalı: Çıkış yapma (kişisel verilerin silinmesi), kullanıcının manuel eylemi, veri bozulması durumunda acil temizlik.
- Düşük alan sistem sinyallerine tepki verin ve LRU mekanizmasının alan boşaltmasına izin verin.
İzleme ve ölçümler
Şunları toplayın: önbellek isabet oranı, isabetsizlik oranı, tahliyeler, mevcut boyut, ortalama TTL sona ermeleri. OkHttp için EventListener/istek günlüğünü, kendi önbellekleriniz için artımlı sayaçları ve APM'deki ölçümleri kullanın.
Sık yapılan hatalar
- Geçersiz kılma yok → eski veriler. Çözüm: TTL + olay tabanlı.
- Birden fazla OkHttp/Glide örneği → çakışmalar ve önbellek kaybı. Çözüm: tek bir yapılandırma.
- Disk işlemleri sırasında kullanıcı arayüzünün kilitlenmesi — her zaman arka planda çalıştırın.
- Neden analizi olmadan "düzeltme" olarak önbellek temizleme — kök nedeni arayın (sızıntılar, kod çözme).
SSS
- Hangi TTL ayarlanmalı? — Verilere bağlıdır: avatarlar ve statik içerikler — uzun TTL; finansal işlemler — kısa veya olay tabanlı geçersiz kılma.
- JSON yanıtları nerede saklanmalı? — Yapılandırılmış veriler için Room daha iyidir; HTTP yanıtlarını önbelleğe almak için — OkHttp disk önbelleği + doğrulama.
- Stratejiler birleştirilebilir mi? — Evet. Genellikle bellek içi + disk + HTTP doğrulama kullanılır.
Üretim öncesi uygulama kontrol listesi
- [ ] Verileri tazeliklerine göre kategorize edin.
- [ ] Her kategori için depolama seviyesi atayın.
- [ ] TTL ve/veya olay tabanlı geçersiz kılmayı uygulayın.
- [ ] İzlemeyi yapılandırın (isabet/isabetsizlik, tahliyeler, boyut).
- [ ] Zorunlu güncelleme için güvenli API'ler sağlayın.
- [ ] Sınırlı bellek ve yeniden başlatma durumlarında davranışı test edin.
Sonuç: Önbelleği mimarinin bir parçası olarak tasarlayın — farklı veri türleri için ayrı politikalar, izleme ve güvenli geçersiz kılma imkanı, maksimum önbellek boyutundan daha önemlidir. Gerekirse, belirli bir kullanım durumu (avatarlar, akış, çevrimdışı mağaza) için yapılandırma ve kod örneği seçmenize yardımcı olabilirim.