.Net Core’da Redis Cache Kullanımı

Selamlar Arkadaşlar,

Bu makalede macOS High Sierra’da öncelikle nasıl Redis kurulucağını inceleyip, daha sonra bir .Net Core Mvc proje üzerinde kullanımını hep beraber inceleyeceğiz. Redis yani distributed cache’de amaç, bir web sayfasına her gelinildiğinde servise ya da DB’ye gitmektense belirlenen bir süre içerisinde In Memory olarak yani rem’den istenen datanın çekilerek performans artışının sağlanmasıdır.

 

Öncelikle eğer makinanızda HomeBrew yok ise kurmanızı tavsiye ederim. Homebrew kısaca Mac OS X işletim sistemi üzerinde yazılım kurulumunu kolaylaştıran bir paket yönetim sistemidir. Bash command satırı açılıp, aşağıdaki komut çalıştırılarak ilgili kurulum kolaylıkla yapılabilir.

 

Artık Redis’in kurulması için yapılması gereken tek şey, aşağıdaki komutun çalıştırılmasıdır.

Bundan sonra bash üzerinde, aşağıdaki komut yazılarak redisin “6379” portundan ayağa kalkması sağlanır.

Ayrıca yeni bir bash command açıldığı taktirde, aşağıdaki komut satırı yazılarak yeni bir redis client oluşturulabilir.

Eğer açılan redis client’dan aşağıdaki gibi “ping” komutu yazıldığında, “PONG” cevabı alınıyor ise herşey yolunda demektir.

Şimdi gelin .Net Core MVC projemizi “dotnet new mvc -o redisCore” şeklinde oluşturalım.

.Net Core Mvc projesinde Redis için ServiceStack, kullanılabilecek apilerden biridir. İlgili kütüphane aşağıdaki komut satırı ile projeye eklenir.

Startup.cs/ConfigureServices() : Redisin .Net core projesinde kullanımı için Startup.cs ‘de AddDistributedRedisCache() methodu ile redis-server’ın IP ve Portu tanımlanıp son olarak root adı belirlenir.

HomeController/HomeController() : Aşağıda görüldüğü gibi Dependency Injection ile Constructer’da “IDistributedCache” nesnesi local bir değişkene atanır.

 

Index.cshtml:  Bu uygulamada örnek amaçlı olarak sayfaya önceden redis console’dan atanmış bir isim ve 5 saniyede bir değişecek anlık zaman bilgisi ekrana basılıcaktır. Sayfa sürekli refresh yapıldığı anda sayfa üzerindeki zaman bilgisi 5er sn aralıklar ile değişecek, geri kalan zaman ve isim bilgisi redis üzerinden çekilecektir. Kısaca redis timeout süresi 5sn’dir. Redis ile alakalı yapılan tüm işler, aşağıda görüldüğü gibi asenkron olarak gerçekleştirilmiştir.

  • Redis’de saklanacak cache ismine “Time” verilmiştir.
  • var existingTime = _distributedCache.GetString(cacheKey)” : Daha önceden ilgili key’e ait bir kayıt var mı diye bakılmıştır.
  • if (string.IsNullOrEmpty(existingTime))” : Eğer herhangi bir kayıt yok ise koşulu tanımlanmıştır.
  • existingTime = DateTime.UtcNow.ToString()” : Anlık zaman bilgisi alınmıştır.
  • var option = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(10))” : Burada SetSlidingExpiration() anlamı, Redis’de ilgili key ile belli bir zaman mesela bu örnekte 5sn içinde hiçbir işlem yapılmaz ise, cache’in düşeceğinin belirlenmesidir.
  • option.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(5)” : Burada AbsoluteExpirationRelativeToNow() anlamı, Redis’de ilgili keye ait cache’in mutlaka yani işlem yapılsın ya da yapılmasın 5sn sonunda düşeceğinin belirlenmesidir.
  • “string name = await _distributedCache.GetStringAsync(“Name”) :” Redis’de bash command satırından daha önceden tanımlanan isim, burada çekilmiştir.

Önemli Not: ServiceStackCore’da string data Redisde nedense string olarak değil de hash olarak tutulmaktadır. Bunun nedenini henüz ben de anlamış değilim. Ama geliştiricilerin mutlaka bir bildiği vardır diyerek, bu konuyu onlara sordum. Cevabı hep beraber göreceğiz. Yukarıdaki resimde görüldüğü gibi “Time” keyinin başına instance adı da eklenip key oluşturulduğunu gördüm. Yani ==>”master” + “Time” şeklindeki key’,in “type masterTime” şeklinde bir komut ile tipi araştırıldığında “hash” ile karşılaşılmaktadır.

  • HSET masterName data BoraKASMER” : Console tarafında “Name” değişkenine hash formatında data, solda görüldüğü gibi atanmıştır.
  • await _distributedCache.SetStringAsync(cacheKey, $”{name}: {existingTime}”, option)” : SetStringAsync() methodu ile ilgili “masterTime” key’ine “BoraKASMER”+ existingTime’dan oluşan string 5 sn süre ile asenkron olarak atanmıştır.
  • ViewBag.Time = await _distributedCache.GetStringAsync(cacheKey)“: Redis cache’den çekilen data “Index.cshtml“‘de sayfaya basılmak amacı ile “ViewBag.Time“‘a atanır.

Önemli Not 2: SetStringAsync() ve GetStringAsync() methodları aslında işimizi büyük ölçüde kısaltmaktadır. Aşağıda bunun yerine, “SetAsync() ve GetAsync()” methodları kullanılması durumunda yapılması gereken Encoding() işlemleri gösterilmiştir. İşte tüm bu işlemleri “SetStringAsync() ve GetStringAsync()” methodları bizim için yapmaktadır.

Index.cshtml: İlgili ViewBag’in ekrana basılması.

Şimdi gelin bir de herhangi bir class(sınıf)’ı redis de nasıl tutabiliriz onu incleyelim.

Person.cs: Aşağıdaki gibi bir sınıfımız olsun

HomeController/HomeController(): Aşağıdaki constructerda görüldüğü gibi person sınıfı tipinde yeni bir kayıt oluşturulmuştur. Redis cache’e 2 farklı yol ile oluşturulan bu person kaydı atılmıştır.

  1. “var data = JsonConvert.SerializeObject(person);” : Newtonsoft ile Person sınıfı Json string bir sınıfa  dönüştürülmüştür.
    • “var dataByte = Encoding.UTF8.GetBytes(data);”: String değişken byte[] Array’e dönüştürülmüştür.
    • “_distributedCache.Set(“Person”,dataByte);” : Redis’de “Person” key’ine karşılık value değeri olarak oluşturulan bu dataByte [] dizisi Set() methodu ile atılmıştır.
  2. “_distributedCache.SetString(“Person2″,data);” : Newtonsoft ile en başta Json string’e dönüştürülen data Redis’e, SetString() methodu ile byte[] dizisine çevrilmeden doğrudan atılması sağlanmıştır. Bu da başta bahsedilen Set() Vs SetString() methodları farkına güzel bir örnek olmuştur.

HomeController/Index: Aşağıda görüldüğü gibi  Redis’e 2 farklı Method “Set()” ve “SetString()” ile atılan person sınıfı “Get()” ve “GetString()” methodları ile çekilerek Index sayfasına view’a model olarak atanmıştır.

Index Page

Index.cshtm: Aşağıda görüldüğü gibi view model olarak gönderilen “Person“, ekrana yukarıda görüldüğü gibi basılmaktadır.

Geldik bir makalenin daha sonuna. Bu makalede Redis’in MacOS X bir işletim sistemine nasıl kurulduğunu ve .Net Core Mvc bir projede nasıl implemente edildiğini hep beraber inceledik. Redis’e öncelikle bir değişkeni süre bazlı hangi parametrelere göre atılabileceğini inceledikten sonra, aynı şekilde bir sınıfı NewtonSoft kullanarak Set() ve SetString() methodlarını kullanarak 2 farklı yol ile cache’e atadık. Daha sonra gönderilen bu view model’i Redis Cache’den NewtonSoft ile alıp  ekrana Razor ile bastık.

Yeni bir makalede görüşmek üzere hoşçakalın.

 

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

Bir Cevap Yazın

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