.Net Distributed Redis Cache

multinet-dev-35
4 min readSep 29, 2023

--

Giriş

1-) Redis Nedir?

Redis, bir veri yapısı sunucusudur. Açık kaynak, bellek kullanımlı, anahtar-değer deposudur. Redis “Uzak Sözlük Sunucusu” (İngilizce: “REmote DIctionary Server”) anlamına gelmektedir. Haziran 2015'ten beri Redis Labs şirketi tarafından geliştirilmesine destek sağlanmaktadır. Ondan önce Pivol Software ve VMware şirketleri tarafından desteklenmiştir.

2-) Distributed Cache Nedir?

Dağıtılmış önbellek, birden çok uygulama sunucusu tarafından paylaşılan ve genellikle bu sunucuya erişen uygulama sunucularında dış hizmet olarak tutulan bir önbellektir. Dağıtılmış önbellek, özellikle uygulama bir bulut hizmeti veya sunucu grubu tarafından barındırıldığında uygulamanın performansını ve ölçeklenebilirliğini iyileştirebilir.

Dağıtılmış önbellek, önbelleğe alınan verilerin tek tek uygulama sunucularında depolandığı diğer önbelleğe alma senaryolarına göre çeşitli avantajlara sahiptir.

Önbelleğe alınan veriler dağıtıldığında, veriler:

  • Birden çok sunucuya yönelik istekler arasında tutarlı.
  • Sunucu yeniden başlatmalarını ve uygulama dağıtımlarını sürdürmektedir.
  • Yerel bellek kullanmaz.

3-) .Net IDistributedCache

IDistributedCache dağıtılmış önbellek uygulamasındaki öğeleri işlemek için aşağıdaki yöntemleri sağlar:

Get, GetAsync: Bir dize anahtarını kabul eder ve önbellekte bulunursa önbelleğe alınmış bir byte[] öğeyi dizi olarak alır.
Set, SetAsync: Dize anahtarı kullanarak önbelleğe bir öğe (dizi olarak byte[] ) ekler.
Refresh, RefreshAsync: Önbellekteki bir öğeyi anahtarına göre yeniler ve kayan süre sonu zaman aşımını (varsa) sıfırlar.
Remove, RemoveAsync: Bir önbellek öğesini dize anahtarına göre kaldırır.

Amaç

Servisimizin mantığı uzak sunucudan kampayanları çekip redis’e cachelemek olacaktır ve bu kampanyalar cache’te bulunuyor ise cache üzerinden sunulacaktır.

1-) Uzak sunucu kampanya verilerini ayarlama

Uzak sunucuyu mimiklemek için mockapi.io üzerinden kampanya resource’u ayarlıyoruz.

Kampanya için verilerimizi giriyoruz.

2-) Redis server kurulumu

Uygulamamızı ve redis server’ı docker üzerinden kuracağız. Aşağıdaki konfigürasyon ile 6379 portundan ve test123 şifresiyle redis server’ımıza erişebilecek hale geliyoruz.

Docker Compose’u çalıştırıyoruz.

Bağlantımızı Redis Insight uygulaması ile test edebiliriz.

3-) Api uygulamasının yazılımı

Visual studio üzerinden .Net Core api projesi açıyoruz.

Nuget paketlerini ekliyoruz.

Program.cs dosyasına konfigürasyonlarımızı ekliyoruz.

Buradaki Redis ConnectionString’imizi appsettings.json üzerinden ayarlıyoruz.

Burada dikkat edecek olursanız host.docker.internal domainini kullandık. Bu domain container’dan bağımsız kendi makinemizin kendisidir.

Campaign dto’muzu oluşturuyoruz.

IDistributedCache interface’i için extension yazıyoruz. Bu extension’un amacı eğer cache server’ında anahtarımıza tanımlı bir değer var ise o değeri dönecek, yok ise getter fonksiyonunu çağırıp verilen anahtara o değeri ayarlayıp geriye değerimizi dönecektir. Cache süremizin ayarlanması için timeSpan kullandık.

CampaignsController’ımızı ve action’ımızı oluşturuyoruz. RestSharp kütüphanesini kullanarak mockapi.io üzerindeki verilerimizi GetFromRemoteServer metoduyla çekiyoruz. cache.Get extension’ımız sayesinde verdiğimiz anahtara göre eğer daha önce hiç mockapi.io’dan veri çekmediysek verileri çekip bir günlük süre sonunda yok olacak şekilde cache’e atıyoruz ve değerimizi dönüyoruz, GetFromRemoteServer bir kere çalıştıktan sonra bir günlük süre boyunca veriler redis cache server’ından okunup dönecektir.

4-) Swagger üzerinden test edilmesi

Swagger üzerinden campaigns servisimizi çağırdığımızda mockapi.io’daki tanımladığımız veriler dönmektedir.

Redis insight üzerinden campaigns anahtarımızla ilgili değerin ayarlandığını görebiliyoruz.

Sonuç

Kampanyalarımız bir gün boyunca değişmeyeceği ve sürekli uzak sunucuya istek yapmamak için cache’leme işlemini kullandık. Buradaki kazanım uzak sunucu’da kampanyaları dönebilmek için süre alan işlemleri(veritabanın verilerin çekilmesi, security işlemlerinin yapılması gibi) sadece bir kez yaptırıp sonrasında cache üzerinden okuyup servisimizi hızlandırmayı amaçladık. Uzak sunucudaki kampanya servisine daha az yük sağlamış olduk ve uygulamamızı hızlandırdık.

--

--