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.
