Azure Üzerinde Redis ile .Net Core Mvc Cache

Selamlar,

Bu makalede Azure üzerinde Redis oluşturup, .Net Core WebApi için Cache olarak kullanacağız.

1-) Öncelikle https://portal.azure.comdan, yeni bir Redis Cache’in oluşturulması için, aşağıda görüldüğü gibi arama kutucuğuna redis yazılır ve Redis Cache seçilir.

2-) Karşımıza aşağıdaki gibi bir ekran gelir. “Create” butonuna basılır.

3-) Karşımıza aşağıdaki gibi bir ekran gelir:

  • DNS name: Redis sunucuya erişilecek isim belirlenir.
  • Subscription: Hangi hesap ile alınmak isteniyorsa belirlenir.
  • Location: Türkiye’ye en yakın lokasyon, North Europe seçilir.
  • Pricing tier: İstenen makina özellikleri, projenin ihtiyacına göre buradan seçilir. Her konfigürasyonun, ödeme planı farklıdır.

Azure üzerinde yaratılan Redis Cache detayına gidildiğinde, aşağıdaki gibi bir ekran ile karşılaşılır.

Buradan “_Console” butonuna tıklandığında, aşağıdaki gibi bir ekran ile karşılaşılır. Eğer Redis Cache ayağa kalkmış ise, “Ping” komutuna karşılık “PONG” cevabının alınması gerekmektedir.

Bu örnek Macbook üzerinden yapılacaktır. Bu link’den https://sourceforge.net/projects/redis-desktop-manager.mirror/ Redis Desktop Manager indirilir.

Add New Connection buttonuna basılarak aşağıdaki gibi bir ekran ile karşılaşılır. İlgili alanlar Azure üzerinde connection string’e bakılarak doldurulur.

Azure üzerinde “Host name” ve “Şifre – Auth (Keys)” alanından istenen bilgiler, aşağıda görüldüğü gibi öğrenilebilir.

Not: Macbook’dan Azure üzerindeki Redis’e erişilemeyince Non-SSL port (6379)’a, aşağıdaki gibi izin verilmiştir. Böylece uzaktan Azure Redis’e, Redis Desktop Manager ile bağlanılmıştır.

Local Redis Desktop Manager’dan Azure Redis’e bağlanıldığında, System console ekranına aşağıdaki gibi gelinir:

Şimdi sıra geldi .Net Core Mvc Projenin Oluşturulmasına: Aşağıdaki komut ile azureNews projesi oluşturulur. Bu projede Redis üzerinden çekilen haber başlıkları, Mvc bir sayfada listelenecektir. Daha sonra tıklanan bir haberin detayının çekmesi için, tekrardan Redis’e gidilip, ilgili ID’ye göre Haber detay çekilecektir.

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

appsettings.json: Proje içinde redis ile ilgili tanımların yapıldığı config dosyası, aşağıda görüldüğü gibi düzenlenir. (RedisConfig)

  • Host: Azure üzerindeki Host name.
  • Port: Ssl kapalı olduğu için 6379
  • Password : Azure üzerindeki Primary keydir.

Projeyede kullanılanacak News modeli aşağıdaki gibidir.

NewsModel.cs:

HomeController.cs / HomeController():

  1. “IConfiguration _configuration”: “appsettings.json”‘dan tanımlı RedisConfig, propertylerinin çekilmesi için kullanılan Interfacedir.
  2. “RedisEndpoint conf” : Azure üzerindeki Redis’e bağlanmak için kullanılan ServiceStack sınıfıdır. “appsettings.json”‘dan çekilen konfigürasyon parametreleri ile Azure Redis’e bağlanılır.
  3. “List<NewsModel> newsModel” : İlgili Contructer’da, öncelikle static bir list yaratılır ve eğer boş ise dummy List<Newsmodel> datası ile doldurulur.
  4. “newsModel.Count == 0” : Sayfa ilk yüklendiğinde, ilgili static liste boş olucağı için dummy Haber datası ile doldurulur.
  5. “using (IRedisClient client = new RedisClient(conf))” : Azure Redis’e, connection açılır.
  6. “if (client.SearchKeys(“flag*”).Count == 0)” : Eğer proje ilk kez çalıştırılmış ve Redis’de Dummy haber datası yok ise, Redis üzerine tüm haber datası “flagId” şeklinde atılır. Yani flag* ile başlıyan tüm data sayısı Azure üzerindeki Redis’de aranır. “O” ise ilgili dummy data redis’e tek tek key-value olarak atanır.
  7. “var news = client.As<NewsModel>()” : NewsModel’in ServiceStack karşılığı, boş şablon oluşturulur. Kısaca Redis’e atılacak data tipi ile tanımlanır.
  8. “news.SetValue(“flag” + data.Id, data)” : Belirlenen Key : “flagId” ve value : “NewsModel” şeklinde Redis’e ilgili haber atılır. “flag” kelimesi ve gelen haber bilgisine ait “ID” değeri ile bir key oluşturulur ve NewsModel bilgisi, bu key’e value olarak atanır. Başında “flag” kelimisinin bulunma amacı ilgili keyleri, Redis’de guruplamaktır. Yani istendiğinde, “flag” kelimesi içeren tüm keyler toplu olarak çekilebilecektir.

 

NOT: Redis’de “Key – Value” haricinde yukarıda görüldüğü gibi, saklanabilecek farklı bir çok data tip vardır.  Burada Redise List<NesModel> dummy data, toplu olarak tek HSET olarak da atılabilirdi. Ama o zaman, tek bir haber detaya gitmek için, önce ilgili HSET çekilecek ve daha sonra istenen ID’li haber içinde filitreleme yapılması gerekecekti. Bu da büyük bir zaman ve performance kaybına neden olacaktı.

Tüm keyler Redis’e atıldıktan sonra, Azure üzerinde “keys *” ile yapılan sorgu sonucu, aşağıdaki gibidir.

HomeController.cs /Index(): Ana sayfada gösterilecek, tüm haber datası Azure üzerindeki Redis’den çekilir.

  1. “using (IRedisClient client = new RedisClient(conf))” : Azure Redis’e bağlanılır.
  2. “List<string> allKeys = client.SearchKeys(“flag*”)” : Redis üzerindeki tüm haber datasının key’i, “flag*” keyword’ü ile çekilir.
  3. “foreach (string key in allKeys)” : Tüm keyler, tek tek gezilir.
  4. “dataList.Add(client.Get<NewsModel>(key))” : Redisden herbir key’e ait haber datası çekilip, “List<NewsModel>” dataList’e atanır ve Index view’ına data model olarak dönülür.

index.cshtml:

Index.cshtml: Tüm haber listesi List<NewsModel> ekrana, yukarıda görüldüğü gibi 2şerli olarak listelenir.

  • @Url.FriendlyUrl : Sayfa içinde ilgili haber detaya gidilmesi için gerekli, url temizleme işinin yapıldığı( Url’de istenmeyen karakterlerin temizlendiği method) makalenin devamında ilgili method anlatılacaktır.
  • “class=”table”” : İlgili tablonun sayfanın ortasında gözükmesi için custom css yazılmıştır. Makalenin devamında anlatılacaktır.
  • @:<tr> : Razor View Enginde kullanılan, C# kodları arasına Html yazabilmesini sağlar.
  • if (count % 2 == 0) { @:</tr><tr> } :  Eğer tablo için 2 kolon yazılmış ise ilgili satırın kapanıp yeni bir satıra geçilmesi sağlanır.

Share/UrlExtension: Haber Detay’a gidilecek Url içinde geçen title, yani haber başlığındaki istenmeyen karakterlerin(Türkçe karakterlerin) temizlendiği methoddur.

wwwroot/css/table.css: Sayfa içinde kullanılan Table’ın, sayfayı ortalaması sağlanır.

Haberlere ait resimler, yukarıda da görüldüğü gibi “wwwroot/images” altına önceden atılmıştır.

Startup.cs/Configure : HaberDetay sayfasına gidilmesi için Mvc’de tanımlanması gereken Routingdir. “title / id” şablonu ile gelindiğinde “Home” Controller’ın “Detail()” Action’ına gidilir.

HomeController.cs/Detail(): Detay sayfasına  Title ve ID parametreleri ile gelinir. Not: Dikkat ederseniz “Title” parametresi hiç kullanılmamıştır. Ama SEO amaçlı ilgili haber, detayına başlığı ile gidilmekte ve bu da Google tarafından indexlenirken, aranan kelimelere göre daha üst sırada çıkmasını sağlamaktadır.

  1. using (IRedisClient client = new RedisClient(conf)): Azure Redis’e bağlanılır.
  2. var data = client.Get<NewsModel>($”flag{ID}”) : Haber Detay “NewsModel”, “flagId” keyword’üne göre Redis’den çekilir.
  3. “data = data == null ? new NewsModel() : data” : İlgili datanın, Redis’de olmama ihtimaline göre şablon boş kayıt yaratılır.
  4. return View(data) : Çekilen Data, “Detay” sayfasına gönderilir.

Detail.cshtml:

Detail.cshtml: İlgili ID’değerine göre çekilen Haber “NewsModel”, ekrana yukarıda görüldüğü gibi basılır.

Azure üzerinde, Redis’i Monitor Edebileceğiniz Ekran Görüntüsü Aşağıdaki Gibidir:

Geldik bir makalenin daha sonuna. Bu makalede, Redis’in Azure üzerinde nasıl kullanılabileceğini, daha web servisi katmanına gelmeden, ilgili haber listesinin ve detayının nasıl çekileceği araştırılmıştır. Siz de ilgili haberin güncellenmesi durumunda, Redis Cache’in nasıl bir mekanizma ile güncellenmesi gerektiğini ve cache’e atılacak datanın, timeout süresinin neye göre belirlenmesi gerektiğini araştırabilirsiniz.

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

Source : https://docs.microsoft.com/tr-tr/azure/azure-cache-for-redis/cache-web-app-howto

Source Code:

Herkes Görsün:

Bunlar da hoşunuza gidebilir...

4 Cevaplar

  1. emrah dedi ki:

    Hocam öncelikle bu güzel içerik için teşekkürler. Merak ettiğim şu, bir e-ticaret sitesi için redis i bir veritabanı olarak kullanmak ne kadar doğru olur ?

    • borsoft dedi ki:

      Selamlar,
      Öncelikle teşekkürler. Sadece Redis’i bir e-ticaret sitesinde kullanmak yeterli olmaz. Bir relational DB’nin önünde çalışması daha doğru olur.
      NOT: Unutulmaması gerekene bir durum da, eğer Redis kapanır ise, herseyin DB üzerinden de çalışmaya devam etmesi gerekmektedir.

      İyi çalışamalar.

  2. Mehmet dedi ki:

    Merhabalar hocam,
    Redis teki verileri belli aralıklarda sql servera kaydediyorlar bunu hangfire ile mi yapıyorlar yoksa farklı bir kütüphane mi kullanıyorlar

    • borsoft dedi ki:

      Selamlar,
      Onla da olur. Ben olsam Microservices yapar, Quartzla falan geceleri çalıştırır Redis’den DB’ye atardım.

      İyi çalışmalar.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.