ASP.NET Core'da Önbellekleme (Caching) Stratejileri

A

Yanıt süresini azaltmak, bir uygulamanın kullanıcı deneyimini iyileştirmek için atılacak en önemli adımlardan biridir. Önbellekleme teknikleri ve diğer uygulamalar, .NET uygulamanızın düşük bir çabayla iyi performans göstermesine yardımcı olabilir. Önbellekleme ile sık erişilen, gecikmeye neden olabilecek verileri hızlı ve erişilebilir bir konumda tutabilirsiniz. Bu, büyük bir çaba harcamadan uygulamanızın performansını dikkate değer şekilde iyileştirebilir. Bu yazıda, ASP.NET Core'da önbellekleme uygulamanın birkaç farklı yolunu tanıtacağım.

Önbellekleme Nedir?

Önbellekleme, sık erişilen verilerin bir kopyasını daha hızlı erişilebilen bir konumda, yani önbellek belleğinde saklayan bir tekniktir. Önbellek kullanarak, uygulama veriyi geçici önbellek belleğinden alarak arka uç çağrı döngülerini azaltır ve yanıt süresini kısaltır. Önbellekleme, uygulamaların sürekli olarak pahalı API çağrılarından ve veritabanı sorgularından kaçınmasını sağlar ve bu da kullanıcı deneyimini önemli ölçüde iyileştirir.

Bir e-ticaret uygulamasında gereksiz arka uç çağrılarını ortadan kaldırmayı düşünelim. ASP.NET Core API'si zaten veri sağlayan uç noktalar sunacak şekilde geliştirilmiştir. Ancak, her seferinde sunucuya istek göndermek önemli maliyetler yaratır ve kullanıcı deneyimini olumsuz etkiler. ASP.NET Core, birer birer uygulayacağımız en yaygın iki stratejiye sahiptir.

Bellek İçi (In-Memory) Önbellekleme

Bellek içi önbellekleme, sık erişilen verileri uygulamanın belleğinde önbellekler. Bu yöntem daha az kalıcıdır ve sonraki isteklerde verilerin önbellek sunucu belleğinden alınması sayesinde en hızlı erişimi sağlar. Küçük veri kümelerine sahip küçük ölçekli uygulamalar için idealdir.

ASP.NET Core, bellek içi önbellekleme uygulamak için Microsoft.Extensions.Caching.Memory paketini sağlar. Şimdi bunu nasıl yapacağımıza bir göz atalım.

Adım 1: NuGet Paketini Yükleyin

.NET CLI'da şu komutu çalıştırın:

dotnet add package Microsoft.Extensions.Caching.Memory

Ya da NuGet paket yöneticisinden yükleyin.

Adım 2: Bağımlılık Enjeksiyonuna Servis Ekleme

.NET 6.0 veya sonraki sürümlerinde Program.cs dosyasında, denetleyicileri kaydetmeden önce servisi kaydedin:

builder.Services.AddMemoryCache();
builder.Services.AddControllers();

Adım 3: IMemoryCache'i Sınıfa Enjekte Etme

Veritabanı ile etkileşimde bulunmak için bir CustomerRepository sınıfım var.

public class CustomerRepository : ICustomerRepository
{
    //...
    private readonly IMemoryCache _memoryCache;

    public CustomerRepository(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
        //...
    }
}

Adım 4: Veritabanından Koşullu Veri Getirme

public async Task<Customer> GetCustomerById(Guid customerId)
{
    if (!_memoryCache.TryGetValue("customer", out Customer customer))
    {
        customer = await GetCustomerDataById(customerId);

        var cacheEntryOptions = new MemoryCacheEntryOptions()
            .SetAbsoluteExpiration(TimeSpan.FromMinutes(10))
            .SetSlidingExpiration(TimeSpan.FromMinutes(2));

        _memoryCache.Set("customer", customer, cacheEntryOptions);
    }

    return customer;
}

if bloğunda, bazı önbellek seçenekleri belirliyoruz:

  • AbsoluteExpiration (Kesin Son Kullanma Süresi): Öğenin önbellekten silineceği süreyi belirtir.
  • SlidingExpiration (Kayma Süresi): Öğenin etkin olmadığı süredir. Eğer bir öğe belirtilen kayma süresi boyunca kullanılmazsa, geçici depolamadan silinir.

Bu, istekte bulunan verilerin hafıza önbelleğinde olup olmadığını kontrol ettiğimiz ana koddur. Eğer veri bulunursa, veritabanı sorgusu yapmadan hafızadan döndürülür. Aksi takdirde, veriler veritabanından getirilip, gelecekte kullanmak üzere önbelleğe kaydedilir.

Bellek İçi (In-Memory) Önbelleklemenin Artıları ve Eksileri

Artıları

  • Tek bir bellek konumundan veri çekildiği için son derece hızlıdır.
  • Uygulaması basittir.
  • Tek bir depolama konumu kullanıldığından daha az güvenlik riski taşır.
  • Oturum depolama gibi küçük görevlerde performansı artırır.
  • Basit depolama gerektirdiğinden maliyet açısından etkilidir.

Eksileri

  • Sunucu yeniden başlatılana kadar veriler kaydedildiği için kalıcı değildir.
  • Sunucunun belleğine (RAM) bağlı olarak sınırlı veri depolayabilir.
  • Dağıtılmış depolama olmadığı için hata toleransı daha azdır.
  • Sınırlı depolama nedeniyle ölçeklenebilirlik daha düşüktür.

 

Dağıtılmış (Distributed) Önbellekleme

Dağıtılmış önbellekleme stratejisi, verileri birden fazla paylaşımlı sunucuya yayarak depolar. Bu teknik, yüksek dayanıklılık ve ölçeklenebilirlik gereksinimleri için uygundur. Dağıtılmış önbellek, büyük miktarda verinin daha hızlı erişimle kullanılabilir olmasını sağlar.

Redis, önbellekleme için yaygın olarak kullanılan popüler bir bellek içi veritabanıdır. Yüksek performanslı önbellekleme sağlamak için API'mizde Redis'i kullanacağız.

İşte ASP.NET Core'da Redis dağıtılmış önbelleklemenin nasıl uygulanacağı:

Adım 1: Paketi Yükleyin

.NET CLI'da şu komutu çalıştırın:

dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

Ya da NuGet paket yöneticisinden yükleyin.

Adım 2: Program.cs Dosyasında Servisi Kaydedin

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379"; // Redis sunucu yapılandırma ana bilgisayarınız
    options.InstanceName = "InstanceName";  // İsteğe bağlı
});

Adım 3: Microsoft.Extensions.Caching.Distributed'dan Dağıtılmış Önbelleği Enjekte Etme

using Microsoft.Extensions.Caching.Distributed;

public class CustomerRepository : ICustomerRepository
{
    // ...
    private readonly IDistributedCache _distributedCache;

    public CustomerRepository(IDistributedCache distributedCache)
    {
        _distributedCache = distributedCache;
        //...
    }
}

GetCustomerById yöntemi şu şekilde güncellenebilir:

public async Task<Customer> GetCustomerById(Guid customerId)
{
    var cacheData = await _distributedCache.GetStringAsync(customerId.ToString());

    if (cacheData != null)
    {
        return JsonSerializer.Deserialize<Customer>(cacheData);
    }

    var customer = await GetCustomerDataById(customerId);

    var serializedData = JsonSerializer.Serialize(customer);

    var cacheEntryOptions = new DistributedCacheEntryOptions
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(5)
    };

    await _distributedCache.SetStringAsync(customerId.ToString(), serializedData, cacheEntryOptions);

    return customer;
}

Adım 4: CMD'den Docker'ı Çalıştırın

Aşağıdaki komutu kullanarak Docker'ı çalıştırın:

docker run -p 6379:6379 --name redis -d redis

Koddaki ilk istekte cacheData değişkeni null alır.

Sonraki çağrılarda, veriler dağıtılmış Redis önbelleğinden alınır. 

Dağıtılmış Önbelleklemenin Artıları ve Eksileri

Artıları

  • Ölçeklenebilirliği destekler.
  • Dağıtılmış düğümler aracılığıyla yük dengelemesi sağlar.
  • Birden fazla önbellek sunucusuyla daha fazla hata toleransı sunar.
  • Önemli veritabanı maliyetlerini ortadan kaldırır.
  • Dağıtılmış düğümler, farklı coğrafi konumlar için hızlı hizmet verir.

Eksileri

  • Birden fazla sunucunun yönetimi karmaşıklık ekler.
  • Dağıtık yapısı bazen gecikmeyi artırabilir.
  • Önbellekleme için ek donanım ve kaynaklar talep eder.
  • Düğümler senkronize olmadığında, bayat veriler sunulabilir.
  • Veri sızıntıları veya yetkisiz erişime karşı güvenliği sağlamak için güvenlik yapılandırması gerektirir.

Özet

Bu makalede, nadiren değişen tekrarlayıcı verilerin daha hızlı bir konuma kopyalanmasını sağlayan önbellekleme tekniğini öğrendik. Bu, uygulamanın performansında ve kullanıcı deneyiminde bazı iyileşmeler sağlar. En yaygın iki önbellekleme stratejisi olan Bellek İçi (In-Memory) ve Dağıtılmış önbellekleme üzerinde durduk. Her birini ASP.NET Core API'mizde uyguladık ve sonuçlarını ve kullanımını analiz ettik.

By Aydın Yağız

Aydın Yağız

Teknolojiye olan tutkumla inovasyonu destekler, kullanıcı deneyimini önceliklerim arasına alırım. Kendi yeteneklerimi ve bilgilerimi paylaşarak, daha geniş bir topluluğun faydalanmasını sağlarım. İş birliği içinde hareket ederek, geleceğin teknoloji dünyasına katkıda bulunmayı hedeflerim. Sizi de bu heyecan verici yolculuğa davet ediyor, fikirlerinizi paylaşmaya ve teknolojiye dair sınırları zorlamaya teşvik ediyorum. Birlikte büyüyelim ve yeni ufuklara açılalım!

İletişime Geçin

Kodlama dünyasına adım atın ve deneyimlerinizi paylaşın. Siz de bu aktif topluluğa katılarak yeni bağlantılar kurun, fikir alışverişinde bulunun ve bilgi birikiminizi artırın.

Özelleştir

Farklı yazı tipleri ve renk seçenekleriyle stilinizi kişiselleştirin. Aşağıdaki örneklerden birini deneyerek sizin için en uygun olanı seçin.

Yazı Tipi Örnekleri

Renk Örnekleri