Redis Yazı Serisi 5 – Asp.NET Core’da In-Memory Cache Kullanımı

Merhaba,

Redis yazı serisinin bu beşinci makalesinde Redis mimarisinin temellerini daha iyi atabilmek için öncelikle Asp.NET Core mimarisinde In-Memory Cache kullanımını inceleyeceğiz. Böylece uygun temellendirmeyi yaptığımız sürece makale serimizin sonraki makalelerinde Distributed Caching sistemi olan Redis sistemine tam teferruatlı giriş yapabilecek zemini oluşturmuş olacağız.

Başlarken

İçeriğin seyrine eş zamanlı eşlik edebilmek için elinizin altında bir Asp.NET Core uygulaması olmasına özen göstermenizi tavsiye ederim.

Service ve Arayüz Tanıtımı

Asp.NET Core uygulamalarında In-Memory Cache yapabilmek için ‘AddMemoryCache‘ servisini kullanmaktayız. Bu servisi uygulamaya dahil ettikten sonra ‘IMemoryCache‘ interface’i ile dependency injection taleplerinde bulunarak cacheleme operasyonlarını gerçekleştirebiliriz.

AddMemoryCache;

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            services.AddMemoryCache();
            .
            .
        }

        .
        .
        .
    }

IMemoryCache;

    public class EmployeeController : Controller
    {
        IMemoryCache _memoryCache;
        public EmployeeController(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
    }

Şimdi dependency injection ile talep ettiğimiz ‘IMemoryCache’ nesnesi üzerinden caching işlemlerinde kullanacağımız metot ve propertyleri inceleyelim.

Get – Set Fonksiyonları
İsimlerinden de anlaşılacağı üzere memory’e data cachelemek ve cachelenen datayı okumak için Get ve Set metotları kullanılmaktadır. key – value diziliminde olan bu metotlardan Set metodu datayı cachelemek, Get metodu ise cache’de ki datayı okumak/elde etmek için kullanılır.

        public IActionResult SetCache()
        {
            _memoryCache.Set("employeeName", "Muiddin Impatrino");
            return View();
        }

        public IActionResult GetCache()
        {
            string name = _memoryCache.Get<string>("employeeName");
            return View();
        }

Remove Fonksiyonu
Cachelenmiş datayı silmek için kullanılır.

        public void RemoveCache()
        {
            _memoryCache.Remove("employeeName");
        }

TryGetValue Fonksiyonu
Cache’de belirtilen key değerine uygun veriyi sorgular. Veri yoksa ‘false’ eğer varsa ‘true’ döndürerek ‘out’ olan ikinci parametresinde de cacheden datayı döndürür.

        public IActionResult GetCache()
        {
            if (_memoryCache.TryGetValue<string>("employeeName", out string data))
            {
                //data burada elde edilmiştir
            }
            return View();
        }

GetOrCreate Fonksiyonu
Belirtilen key değerinde data var mı kontrol eder, yoksa oluşturur.

        public IActionResult GetCache()
        {
            string name = _memoryCache.GetOrCreate<string>("employeeName", entry =>
             {
                 entry.SetValue("Muiddin Impatrino");
                 Console.WriteLine(DateTime.Now);
                 return entry.Value.ToString();
             });

            return View();
        }

Absolute&Sliding Expiration
Cache’de tutulacak datanın yaşam süresini belirlememizi sağlayan özelliklerdir. Absolute, datanın cache’de tutulma süresini belirlerken; Sliding, belirtilen süre zarfında cache’den data talep edilirse eğer bir o kadar daha tutulma süresini uzatacak aksi taktirde datayı silecektir. Her ikiside aynı anda kullanıldığı zaman sliding, absolute’te belirtilen süre dolana kadar periyodik işlevine devam edecektir.

‘GetOrCreate’ metoduyla kullanımı aşağıdaki gibidir;

        public void GetCache()
        {
            DateTime date = _memoryCache.GetOrCreate<DateTime>("date", entry =>
             {
                 entry.AbsoluteExpiration = DateTime.Now.AddSeconds(30);//Cache'de ki datanın ömrü 10 saniye olarak belirlenmiştir.
                 entry.SlidingExpiration = TimeSpan.FromSeconds(5);//Cache'de ki datanın ömrü 2 saniye olarak belirlenmiştir.
                 //2 saniye içerisinde bir istek yapılırsa kalış süresi 2 saniye daha uzayacaktır.
                 //Absolute değeri belirtildiğinden dolayı bu süreç totalde 2 saniye boyunca sürecektir.
                 DateTime value = DateTime.Now;
                 Console.WriteLine($"*** Set Cache : {value}");
                 return value;
             });

            Console.WriteLine($"Get Cache : {date}");
        }

Redis Yazı Serisi 5 - Asp.NET Core'da In-Memory Cache Kullanımı

‘Set’ metoduyla ise aşağıdaki gibi ‘MemoryCacheEntryOptions’ nesnesiyle kullanabilirsiniz;

        public IActionResult SetCache()
        {
            MemoryCacheEntryOptions options = new MemoryCacheEntryOptions();
            options.AbsoluteExpiration = DateTime.Now.AddSeconds(30);
            options.SlidingExpiration = TimeSpan.FromSeconds(5);
            _memoryCache.Set("date", DateTime.Now, options);

            return RedirectToAction(nameof(GetCache));
        }
        public IActionResult GetCache()
        {
            if (_memoryCache.TryGetValue<DateTime>("date", out DateTime date))
            {
                Console.WriteLine($"Get Cache : {date}");
            }
            return View();
        }

Cache Priority
Yayın süreci boyunca cache’e depolanan veriler memory’i haddinden fazla şişirebilir ve yeni veriler için sistem tarafından var olan veriler silinmek istenebilir. İşte böyle bir durumda cache’den silinecek olan verilerin önceliklerini ve hangilerinin kalıcı olacağını Priority değeri aracılığıyla belirlemekteyiz.

Priority değeri; Low, Normal, High ve NeverRemove olmak üzere dört değer almaktadır. Bu değerleri sırasıyla açıklarsak eğer;
Low : Önem derecesi en düşük olan datadır. İhtiyaç doğrultusunda ilk silinecek datadır.
Normal : Önem derecesi Low’dan sonra gelen datadır.
High : Önemli veridir. Çok zaruri olduğu taktirde cache’den silinecektir.
NeverRemove : Kesinlikle silinmemesi gereken datadır. Sınıra gelinen bir memory’de Priority değeri NeverRemove olan datalarla sınır aşılırsa exception fırlatılır.

        public void SetCache()
        {
            MemoryCacheEntryOptions options = new MemoryCacheEntryOptions();
            options.Priority = CacheItemPriority.High;
            _memoryCache.Set("date", DateTime.Now, options);
        }

RegisterPostEvictionCallback Olayı
Cachelenmiş bir datanın hangi sebepten dolayı memory’den silindiğine dair bilgi edinmemizi sağlayan olayı fırlatan bir fonksiyondur.
Parametre olarak
public delegate void PostEvictionDelegate(object key, object value, EvictionReason reason, object state)
imzasına sahip bir delegate almaktadır. Bu delegate aracılığıyla temsil edilen fonksiyonun ‘key’ parametresine cachelenmiş datanın keyini, ‘value’ parametresine değerini, ‘reason’ parametresine ise silinme sebebini döndürmektedir.

        public void GetCache()
        {
            DateTime date = _memoryCache.GetOrCreate<DateTime>("date", entry =>
            {
                entry.RegisterPostEvictionCallback((key, value, reason, state) =>
                {
                    Console.WriteLine($"Key : {key}\nValue : {value}\nReason : {reason}\nState : {state}");
                });
                DateTime value = DateTime.Now;
                Console.WriteLine($"*** Set Cache : {value}");
                return value;
            });

            Console.WriteLine($"Get Cache : {date}");
        }

Redis Yazı Serisi 5 - Asp.NET Core'da In-Memory Cache Kullanımı

Evet… Böylece Asp.NET Core uygulamalarında In-Memory Caching’in nasıl yapıldığını sanırım yeterince görmüş, incelemiş olduk. Bu içeriğimizden sonra artık yazı serimizde Redis ile ilgili birebir içerikler oluşturarak esas konumuza temas edebiliriz.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 15 Nisan 2020

    […] Redis Yazı Serisi 5 – Asp.NET Core’da In-Memory Cache Kullanımı […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*