.Net Core Mvc Uygulamasında Redis Cache Kullanımı

Selamlar, bu makalede bir .Net Core Mvc uygulamasında Redis Cache mekanizmasını nasıl inşa ederiz onun üzerine konuşuyor olacağız.

Bir önceki makalede Memory Cache yapısını incelemiştik ve ön belleğe almanın önemine değinmiştik. Barındırılan verilerin büyüklüğü, kullanıcı sayısı gibi faktörler önbelleğe alma ihtiyacı ortaya çıkardığı gibi uygulamalar büyüdükçe inşa edilen caching mekanizmasının ihtiyaçlara ne kadar cevap verdiği de önemli hale gelmektedir.

Bir Cache mekanizması inşa edilirken önemli noktalardan bir tanesi veri tutarlılığının sağlanmasıdır. Diğer bir önemli husus ise önbelleğe alınan verilerin,herhangi bir sorun ile karşılaşıldığında bellekten silinmesidir. Tüm ihtiyaçları göz önünde bulundurduğumuzda karşımıza Distributed Cache kavramı çıkmaktadır.

Distributed Cache


Önbelleğe alınacak verilerin uygulamanın ayağa kalktığı Server yerine tamamen ayrı bir ön bellekleme servisinde tutulmasıdır. Böylelikle önbelleğe alınan veriler merkezi bir noktada tutularak tüm kullanıcıların aynı veriyi tüketmesi sağlanmış olacaktır. Uygulamanın barındırıldığı Server’da bir sorun yaşanması durumunda önbelleğe alınmış olan veriler zarar görmeyecek ve Server ayağa kalktığında ise aynı şekilde önbellekteki verilerin tüketilmesine devam edilebilecektir.

Redis


C dili ile yazılmış open source bir NoSql veritabanıdır. Veriler key,value şekilde tutulur. Redis’in bir Disributed Cache mekanizması olarak çok tercih edilmesinin nedenlerinden bir tanesi içerisinde barındırdığı veri türleridir. Nesne yönelimli bir dil ile geliştirme yapmış geliştiricilere bu veri türleri hiçte yabancı gelmeyecektir. Distributed Cache mekanizması inşa ederken Redis’i iki yöntem ile kullanabiliriz.

  • StackExchange.Redis Api
  • IDistributedCache

Biz bu bölümde IDistributedCache interface üzerinden kullanıyor olacağız. Şimdi gelin gerekli kurulumları gerçekleştirelim.

Chocolatey ile Redis Windows Kurulumu

  1. Öncelikle buradaki linke gidilir ve PowerShell yönetici olarak çalıştılır.
  2. Get-ExecutionPolicy komutu çalıştırılır.
  3. Sonuç Restricted ise Set-ExecutionPolicy AllSigned komutu çalıştılır AllSigned ise bu adıma gerek yok.
  4. Hemen ardından aşağıdaki kod komut satırında çalıştırılır ve Chocolatey kurulumu tamamlanır.
  5. Redis kurulumu için buradaki linke gidilerek choco install redis-64 komutu PowerShell üzerinden çalıştırılır ve kurulum tamamlanır.
  6. Son olarak PowerShell ile redis-server komutu ile Redis Server ayağa kaldırılır.

Redis Desktop Manager


Buradaki linkten üye olma işlemini gerçleştirdikten sonra windows için olan sürümü indirilir. İndirilen setup üzerinden kurulum gerçekleştirilir. 15 günlük ücretsiz sürümü mevcut. Önbelleğe alınan verilerin takibini gerçekleştirmek için kullanışlı bir arayüz sunmakta.

Kurulumları tamamladıktan sonra örnek uygulama üzerinde konuyu daha iyi anlamaya çalışalım.

Uygulama x markasının müşterilerinin ürünlerde yaşanan sorunlar üzerine servis talep kayıtlarını oluşturabildikleri bir web uygulamasıdır.

Öncelikle IDistibutedCache interface’ini kullanabilmek için Manage Nuget Packages üzerinden Microsoft.Extensions.Caching.Redis kütüphanesini indiriyoruz. Hemen ardından Startup tarafına gelip services.AddDistributedRedisCache(x => { x.Configuration = “localhost:6379”; }); servisimizi ekliyoruz ve host ve port bilgilerimizi geçiyoruz.Başka bir yapılandırmaya gerek kalmadan kullanmaya başlayabiliriz.

Manager Service

GetAll(); methodu tetiklendiğinde ilk olarak IDistributedCache nesnesi üzerinden StringGetAsync(); metodu çağırılır ve servicerecords key’e ait veri olup olmadığını kontrol edilir. Veriler daha önceden önbelleğe alınmamış ise veritabanına gidilir entitity framework yardımı ile verileri çekilir ve kayıt varsa SetStringAsync(); methodunu kullanarak ilgili key bilgisine çekilen veriler SerializeObject(); metodu ile serialize edip gönderilir. Öncesinde bir önbelleğe alma işlemi gerçekleştirilmiş ise StringGetAsync(); methodu ile ilgili key’e ait veri alınır DeserializeObject(); metodu kullanılarak ilgli nesneye deserialize edilip geri dönülür.

Bir servis kaydının durumunun güncellenmesi halinde RemoveAsync(); metodu ile ilgili key’i silinir. Listenin tekrar çekilmesi durumunda ilgili key silinmiş olduğundan güncel verilerin tekrardan çekilip önbelleğe alınmasını sağlınır.

Customer Service

GetByUserId(int userId); methodu tetiklendiğinde ilk olarak IDistributedCache nesnesi üzerinden StringGetAsync(); metodu çağırılır ve servicerecords key’e ait veri olup olmadığını kontrol edilir. Öncesinde bir önbelleğe alma işlemi gerçekleştirilmemiş ise veritabanına gidip entitity framework yardımı ile veriler çekilir ve kayıt varsa SetStringAsync(); methodu kullanarak ilgili key bilgisine çekilen veriler SerializeObject(); metodu ile serialize edilip gönderilir. Öncesinde bir önbelleğe alma işlemi gerçekleştirilmiş iseStringGetAsync(); methodu çağırılır ve ilgili key’e ait veriler alınıp DeserializeObject(); metodu kullarak ilgli nesneye deserialize ediliri. Her customer’ın kendi açmış olduğu servis taleplerini görebilmesi için UserId üzerinden Where koşulu uygulayıp ilgili veriler geri dönülür.

Add(); metodu ile yeni bir servis kaydının eklenmesi halinde RemoveAsync(); metodu ile ilgili key’i silinir. Listenin tekrar çekilmesi durumunda ilgili key silinmiş olduğu için güncel verilerin tekrardan çekilip önbelleğe alınması sağlanır.

Test

Şimdi gelin servis yöneticisinin bir servis kaydının durumunu güncellemesinin ardından Redis’de bulunan verilerin güncellenip güncellenmediğinden emin olmaya çalışalım.

Durum güncellenmesi yapılmadan önce

Durum güncellenmesi yapıldıktan sonra

Benim bu makalede anlatacaklarım bu kadar umarım faydalı bir yazı olmuştur. Makalenin örnek kodlarını alt kısımda sizler ile paylaşıyorum. Bir başka makalede görüşmek üzere. Hoşçakalın 🙂

Source


https://github.com/redis/redis
https://github.com/eaktassssss/TechnicalService

BUNLAR DA HOŞUNUZA GİDEBİLİR...

Bir cevap yazın

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