Asp.Net Core Memory Cache Yönetimi

Asp.Net Core'da Memory Cache Yönetimi Nasıl Yapılır?

 

Asp.Net uygulamalarında Memory Cache önemli bir yere sahiptir. Genel olarak istediğimiz türden verilerin bellek üzerine kayıt edilmesi ile her zaman veri tabanına gitmeden verilere ulaşmak için kullanılır. Asp.Net Core üzerinden bulunan IMemoryCache özelliğini kullanarak size cache yönetimini göstereceğiz. 

Başlamadan önce kullandığımız CacheManager sınıfını sizinle paylaşmak isteriz.

public class CacheManager
    {
        private static CancellationTokenSource _resetCacheToken = new CancellationTokenSource();
        private readonly IMemoryCache _memoryCache;
        /// <summary>
        /// Cache Manager
        /// </summary>
        /// <param name="memoryCache"></param>
        public CacheManager(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
        /// <summary>
        /// sets the cache entry T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="expirationInMinutes"></param>
        /// <returns></returns>
        public T Set<T>(object key, T value, int expirationInMinutes = 60)
        {
            MemoryCacheEntryOptions options = new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.Normal).SetAbsoluteExpiration(TimeSpan.FromMinutes(expirationInMinutes));
            options.AddExpirationToken(new CancellationChangeToken(_resetCacheToken.Token));
            _memoryCache.Set(key, value, options);
            return value;
        }
        /// <summary>
        /// checks for cache entry existence
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Contains(object key)
        {
            return _memoryCache.TryGetValue(key, out object result);
        }
        /// <summary>
        /// returns cache entry T
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T Get<T>(object key)
        {
            return _memoryCache.TryGetValue(key, out T result) ? result : default(T);
        }
        /// <summary>
        /// clear cache entry
        /// </summary>
        /// <param name="key"></param>
        public void Clear(object key)
        {
            _memoryCache.Remove(key);
        }
        /// <summary>
        /// expires cache entries T based on CancellationTokenSource cancel 
        /// </summary>
        public void Reset()
        {
            if (_resetCacheToken != null && !_resetCacheToken.IsCancellationRequested &&
                _resetCacheToken.Token.CanBeCanceled)
            {
                _resetCacheToken.Cancel();
                _resetCacheToken.Dispose();
            }
            _resetCacheToken = new CancellationTokenSource();
        }   
}

 

CacheManager sınıfını öncelikle kullandığımız yere eklemeden önce Asp.Net Core projesindeki Startup.cs içerisinde ConfigureServices içerisine "services.AddMemoryCache();" şeklinde Memory Cache servisini eklememiz gerekmektedir. Yani kod bloğuna bakacak olursak şu şekilde görünecektir.

 

public IServiceProvider ConfigureServices(IServiceCollection services)
{
            services.AddMemoryCache();

 }

 

Daha sonra CacheManager sınıfını kullanacağımız yere eklememiz gerekecektir. Biz kullandığımız farklı bir sınıfın içerisine eklemek istiyoruz. Hadi şimdi sınıfın içerisine nasıl eklediğimize bakalım.

 

 public class MemoryHelper
{

  private readonly IMemoryCache memoryCache;
  private readonly CacheManager cacheManager; 

 public MemoryHelper( IMemoryCache _memoryCache)
 {
    memoryCache = _memoryCache;
    cacheManager = new CacheManager(memoryCache);
 }
}

 

Yukarıda gösterildiği şekliyle kullanmak istediğimiz farkı bir sınıfın içerisine CacheManager sınıfını eklemiş oluyoruz. Artık cache yönetimine başlayabiliriz. Bizim Expense türünde bir sınıfımız mevcut ve bu sınıf türündeki listeyi cache içerisinde saklamak istiyoruz. Siz Expense sınıfı yerine kendi sınıfınızı ya da dinamik objenizi saklayabilirsiniz. Şimdi saklama işleminin nasıl yapıldığına birlikte bakalım. 

 

public List<Expense> GetExpenseList()
{
      List<Expense> Expenses = new List<Expense>();
      List<Expense> cachedData = cacheManager.Get<List<Expense>>("ExpenseList");
      if (cachedData != null && cachedData.Any())
      {
            Expenses = cachedData;
      }
     else
     {
                         for (int i = 0; i < 10; i++) // Siz burada veritabanından veri çekerek listeye almanız gerekir. Ya da istediğiniz şekliyle listenizi doldurmanız gerekmektedir. Biz örnek olarak bu şekilde yapıyoruz.
                        {
                           Expenses.Add(new Expense());
                        }
                       // Listemizi doldurduktan sonra Cache Manager ile kayıt işlemimizi yapıyoruz.
                       cacheManager.Set<List<Expense>>("ExpenseList", Expenses);
           
     }

     return Expenses;

}

 

Yukarıda yazmış olduğumuz GetExpenseList metodu öncelikle CacheManager ile kayıt edilmiş cache olup olmadığını kontrol eder. Eğer cache üzerinde bir veri mevcut ise onu listeye aktarır. Cache üzerinde istediğimiz veri mevcut değilse onu daha sonra kullanmak üzere cache üzerinde saklar. Cache Manager üzerinde varsayılan süre 60 dakika olarak ayarlanmıştır. Siz daha fazla sürede veri saklamak istiyorsanız "cacheManager.Set<List<Expense>>("ExpenseList", Expenses, 120);" şekliyle de yazabilirsiniz.

 

Herkesin işine yarayacak bu işlemleri kullanmanız sisteminize performans kazandıracaktır ancak bellek üzerinde çok fazla veri olmasından dolayı sunucunuzda sıkıntı yaşamamak için çok dikkatli olmanız gerekmektedir. Size tavsiyemiz bellek yönetiminizi dikkate alarak bu işlemleri yapmanızdır.

Herkese iyi çalışmalar dileriz.

Görüşme yapmak ister misiniz?

İşletmenizin en kritik sorunları ve fırsatları konusunda yardımcı oluyoruz. Birlikte kalıcı değişim ve sonuçlar almaya ne dersiniz?