Asp.Net Core In-Memory Cache

Sedat Bozdoğan
4 min readSep 10, 2023

--

Cache Nedir?

Veritabanında bulunan verinin bir kopyasını ön belleğe alarak veri getirme maliyetinizi azalttığınız, yani performansı iyileştirme işlemidir diyebiliriz.

Neden Cache Kullanmalıyım?

Sık kullanılan verileri önbelleğe aldığınızda uygulama performansınızı önemli ölçüde artıran önemli bir tekniktir. Uygulamanızın kullanıcı sayısında önemli ölçüde artış olduğundan hızında düşme olmasını istemezsiniz.

  • Sık sık değişmeyen bazı verilere erişmemiz gerekiyor
  • Uygulamalarımızı performans daha iyi hale getrmek
  • Yüksek trafikli uygulamalar için ideal

Uygulamanıza gelen kullanıcılar sayfayı görmeyi talep ettiklerinde cache yöntemi uygulamadıysanız doğrudan veriler veritabanı üzerinden getirilmeye çalışılacaktır. Cache yöntemini kullandığınız da ise uygulamanız veritabanı sunucusuna gitmek yerine doğrudan sunucunuzun önbelleğinde hazır bulunan veriyi alıp kullanıcıya iletecektir. Özellikle sık sık değişmeyen ve veritabanından doldurulması zaman alan verileri önbelleğe aldığınızda uygulamanızda en iyi sonucu alacaksınız. Önbelleğe alınan verilerilerin periyodik yenilenmesi gerekir eskimemesi için bunu da göz önünde bulundurmalısınız.

Cacheleme işlemi yaparken kesinlikle verinin database üzerinden gelmesi gerekmez.Bir web servis uygulamasından aldığınız bir veride olabilir.Tekrar tekrar o web servisine istek atmak yerine önbellek üzerinde veriyi saklayabiliriz.Farklı veri kaynaklarıdan verilerde elde edebilirsiniz.

Asp.Net Core’da Caching İşlemini Nasıl Yaparız?

AspNet Core 2 tip cache’lemeyi desteklemektedir.

  • In-Memory Caching : Bu yöntem ile verileri uygulama sunucusu belleğinde saklayacaktır.
  • Distributed Caching :Bu yöntem ile verileri birden fazla uygulama sunucusunda paylaşabiliceği harici bir hizmette depolar.

Örnek Senaryo

Github profil bilgisindeki https://api.github.com/users/sedatbozdogan api adresindeki verileri alarak kendi web servis uygulamamızdan dışarı sunacağız.Profil bilgisini sunarken cache’leme işlemi yürüteceğiz.

Örneğimizi DotNet Core 7.0 üzerinde oluşturmaktayız.

Program.cs Configurasyonu

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMemoryCache();//in-memory cache kullan?ca??m?z? bildiriyoruz.
builder.Services.AddControllers();
builder.Services.AddHttpClient();
builder.Services.AddScoped<IUserService, UserService>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

InMemory Cache Servisinin Uygulamaya Inject Edilmesi

[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
private const string userCacheKey = "user";
private readonly IMemoryCache _cache;
private readonly IUserService _userService;
private ILogger<UserController> _logger;
public UserController(IMemoryCache cache, ILogger<UserController> logger, IUserService userService)
{
_cache = cache ?? throw new ArgumentNullException(nameof(cache));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_userService = userService;
}

[HttpGet]
public async Task<IActionResult> GetAsync()
{
if (_cache.TryGetValue(userCacheKey, out User user))
{
_logger.Log(LogLevel.Information, "User found in cache.");
}
else
{
_logger.Log(LogLevel.Information, "User not found in cache. Fetching from database.");
user = await _userService.GetUser();
var cacheEntryOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromSeconds(60))
.SetAbsoluteExpiration(TimeSpan.FromMinutes(5))
.SetPriority(CacheItemPriority.Normal);
_cache.Set(userCacheKey, user, cacheEntryOptions);
}
return Ok(user);
}
}

Bir sonraki adımda önbelleğe alıcağımızın verinin davranışını belirlemektir.

MemoryCache Configurasyonu

Sliding Expiration Time : Bu özellik ön bellekte tutulan veri kaldırılmadan önce ne kadar süreyle etkin olacağını belirtir.60 saniye olarak belirttik örneğinimizde.60 sn içersinden ikinci bir istek gelirse 60 sn daha önbellekte veri saklanır. Fonksiyon:SetSlidingExpiration()

Absolute Expiration Time : Slider expiration ile ilgili sorun önbelleğe erişmeye sürekli devam edildikçe hiçbir zaman veri bellekten atılmaz ve güncel veri veri kaynağından alınamaz ama absolute expiration belirtilen sürede mutlaka bellekten veriyi siler ve yeni veri veri kaynağından tekrardan talep edilir.Bu süreyi 5 dk olarak belirledik.Fonksiyon:SetAbsoluteExpiration()

Priority : Ön belleğe alınan verinin önceliğini belirtir.Vasayılan olarak öncelik normal ayarlıdır ama istersek Low, High, Never Remove gibi isimlerinde de anlaşıldığı gibi bellekten silinme öncelliğini belirtebiliriz.Bellek çok dolduğundan en düşük öncelikli veriden başlanarak veriler kaldırılır.Fonksiyon:SetPriority()

Cache üzerindeki verileri temizlemek istersek aşağıdaki kod bloğunu çalıştırabiliriz.

[HttpPost]
public IActionResult ClearCache()
{
_cache.Remove(userCacheKey);
return Ok();
}

Yazılımda kullandığımız her güzel bir yöntemin avantaj ve dezavantajları olduğunuda düşünmeliyiz ve bunları göz önünde bulundurmalıyız.

Avantaj

  • Veriye Hızlı Erişimi:Önbellekten verilere erişirken, uygulama dışından herhangi bir ek ağ iletişimi söz konusu olmadığından çok daha hızlı olacaktır.
  • Database yükü azalması :Eğer veritabanı üzerinden verileri getiriyorsanız ilk sefer bu maliyete katlanıldıktan sonra tekrardan erişime bir süre gerek kalmacaktır.Böylece veritabanı sunucu yüküde azalmış olacaktır.
  • User Experience daha iyi hale gelecektir

Dezavantaj

  • Volatilite : Uygulama sona erdiğinde veya sunucu yeniden başlatıldığında bellekte saklanan veriler kaybolur
  • Maliyet : RAM tüketiminiz artar
  • Karmaşıklı : Önbelleğe alma mekanizmalarının uygulanması karmaşık olabilir ve dikkatli bir planlama gerektirir
  • Ölçekleme:Uygulamanızı ölçeklemek istediğinizde senkronizasyon sorunları

Örnek uygulamamızı çalıştırdığımızda github servisinden verileri web servis üzerinden sunduğumuzu görebilirsiniz.

ikinci defa veriyi talep ettiğinizde cache üzerinden geldiğini görebilirsiniz.

Uygulama performansınızı önemli ölçüde artıracak tekniklerin başında cache işlemi olduğunu aklınızda bulundurmakta fayda olacağını düşünüyor

Örnek uygulamaya https://github.com/sedatbozdogan/inmemorycache link üzerinden erişebilirsiniz.

Bir başka yazıda görüşmek dileğiyle. Sağlıklı günler dilerim.

--

--

No responses yet