31 Ağustos 2023 Perşembe

Asp .Net Core’da In-Memory Cache Kullanımı

 

Asp .Net Core’da In-Memory Cache Kullanımı
 

Bu yazımızda Asp.Net Core’un default built-in yapısında In-Memory Cache özelliğinden bahsedeceğiz. Asp.Net Core, uygulama performansını artırmak için çeşitli önbellekleme mekanizmaları sağlar. Bunlardan biri de In-Memory Cache kullanımıdır. In-Memory Cache, uygulamanın hafızasında tutulan önbellek verileridir.

In-Memory Cache Özelliğini Aktif Etmek

In-Memory Cache kullanmak için, öncelikle uygulamanızda Microsoft.Extensions.Caching.Memory paketinin yüklü olduğundan emin olunuz. Daha sonra, ConfigureServices() metodunda IMemoryCache arayüzüne ait bir instance oluşturmanız gerekmektedir. In-memory cache özelliği Asp.Net Core içerisinde bir service olarak bulunmaktadır. Bu servis default kapalı gelir yapmamız gereken Startup.cs içerisinde bulunan ConfigureServices metodunda aşağıdaki gibi cache servisini açmak. 

 

1
2
3
4
5
 public void ConfigureServices(IServiceCollection services)
 {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddMemoryCache();
 }

 

Bu kod parçası, ConfigureServices() metodunda services koleksiyonuna IMemoryCache instance’ı ekler.

IMemoryCache interface, Asp.Net Core projelerinde in-memory cache kullanmamızı sağlayan bir arayüzdür. Bu arayüze ait metotları kullanarak cache set, get, remove gibi işlemleri yapabiliriz. 


1
2
3
4
5
6
 public interface IMemoryCache : IDisposable
 {
         bool TryGetValue(object key, out object value);
         ICacheEntry CreateEntry(object key);
         void Remove(object key);
 }

 

In-Memory Cache Kullanımı

In-Memory Cache servisi aktifleştirdikten sonra IMemoryCache arayüzünü kullanmak istediğimiz katmana ait constructor’da inject ediyoruz. Bizde geriye Student listesi return ettiğimiz bir controller tanımlayarak IMemoryCache arayüzünü aşağıdaki gibi constructor injection parameter olarak verelim.

StudentController içerisindeki Get metodunda sırasıyla işlemlerimizi uygulayalım. _memoryCathe.Set(key, value, cacheOptions) metodu 3 tane parametre alıyor. cacheOptions parametresi de 2 tane değer alıyor. 

Bunlar;

AbsoluteExpiration: Cache expire süresi

Priority: Memory şiştiğinde cache objelerini hangi öncelikte silinecek.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 using InMemoryCatchKullanimi.Domain;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Caching.Memory;
 using System;
 using System.Collections.Generic;
 namespace InMemoryCatchKullanimi.Controllers
 {
     [Route("api/[controller]")]
     [ApiController]
     public class StudentController : ControllerBase
     {
         private readonly IMemoryCache _memoryCache;
         public StudentController(IMemoryCache memoryCache)
         {
             this._memoryCache = memoryCache;
         }
         [HttpGet]
         public IEnumerable Get()
         {
             const string cacheKey = "studentListKey";
             if (!_memoryCache.TryGetValue(cacheKey, out List response))
             {
                 response = new List { new Student { Id = Guid.NewGuid(), Name = "ismail kaşan" }, new Student { Id = Guid.NewGuid(), Name = "serkan ulukoca" } };
                 var cacheExpirationOptions = new MemoryCacheEntryOptions
                 {
                     AbsoluteExpiration = DateTime.Now.AddMinutes(5),
                     Priority = CacheItemPriority.Normal
                 };
                 _memoryCache.Set(cacheKey, response, cacheExpirationOptions);
             }
             return response;
         }
     }
 }

 

Gelen ilk request için cache’de o key’e ait bir nesne olmadığından ilk request source’a gidip(bir repository yada service layer olabilir) bir veri alınır. Sonra bu veriye 5 dakikalık bir expire süresi set edilerek cache’e atılır. Artık ondan sonraki bütün request’ler 5 dakika boyunca source’a gitmeden response’u cache’den eturn edecektir. Expire süresi dolduğunda ise ilgili key ve obje cache’den silinecektir.

Set, Get yapabildiğimiz gibi Remove işlemide yapabiliriz. Bunun için cacheKey değerini parametre olarak Remove metoduna verip call yapmak yeterli.

 

1
_memoryCache.Remove(cacheKey);

 

CacheItemPriority enum’ı içerisinde Low, Normal, High, NeverRemove değerleri vardır. CachedObject Priority değerine göre memory de yer açmak için sırayla silinir. Memory’den otomatik silme işlemi yapıldığında bunun bilgisini bize iletmesini sağlayan bir callback handler metodunu aşağıdaki gibi options’a register edebiliriz ve silme işlemi yapılırken bu metot tetiklenerek bize haber verir. 


1
2
3
4
5
6
 cacheExpirationOptions.RegisterPostEvictionCallback(callback: EvictionCallback, state: this);

 private static void EvictionCallback(object key, object value,EvictionReason reason, object state)
 {
             var message = $"Entry was evicted. Reason: {reason}.";          
 }

 

Server-side bir uygulama için cache olmazsa özelliklerden biri haline gelmiştir. Asp.Net core’da da In-Memory Cache ve Distributed Cache işlemleri yapmamızı sağlayan servisler bulunmaktadır. Bu yazımızda basitçe In-Memory Cache özelliğini projemize nasıl entegre edeceğimize baktık. Umarım faydalı olmuştur.

Yararlanılan kaynaklar:

 Kaynak Kodu

http://www.canertosuner.com/post/asp-net-core-in-memory-cache 

 

 

Hiç yorum yok:

Yorum Gönder

.Net Core'da Swagger UI Kullanımı

  Web API geliştirirken API de yazılan metodların ne iş yaptığı? Hangi parametreleri aldığı? Ne cevap döndüğü? Gibi bilgilerin yer aldığı ...