Redis Yazı Serisi 13 – Asp.NET Core’de Session İçin Redis Cache Kullanımı
Merhaba,
Bir web uygulamasının yayınlandığı host üzerinde oluşturulan sessionların uygulama yeniden başlatıldığı durumlarda kaybolması kaçınılmazdır. Bu durum belleğin temizlenmesi açısından iyiye alamet olarak yorumlanabilsede esasında session’daki verilerin kaybı söz konusu olacağından dolayı pekte istenilen bir durum olmasa gerek. Dolayısıyla böyle bir ahvale istinaden sessionların in-memory’de tutulmasından kaçınılması ve herhangi bir distributed memory’de depolanması her açıdan daha tercih edilebilir gözükmektedir.
Bizler bu içeriğimizde Asp.NET Core uygulamalarında session’ların distributed cache olarak Redis server’da nasıl storage edilebileceğini inceleyeceğiz. Bunun için herhangi bir Asp.NET Core uygulamasına Microsoft.Extensions.Caching.Redis kütüphanesinin dahil edilmesi gerekmektedir.
İlgili kütüphaneyi yükledikten sonra ‘Startup.cs’ dosyasında aşağıdaki gibi entegrasyonun yapılması gerekmektedir.
public class Startup { public void ConfigureServices(IServiceCollection services) { . . . services.AddDistributedRedisCache(options => { options.InstanceName = "session"; options.Configuration = "localhost:1453"; }); services.AddSession(options => options.IdleTimeout = TimeSpan.FromMinutes(20)); . . . } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { . . . app.UseSession(); . . . } }
Yukarıdaki kod bloğunu incelersek eğer 8. satırda ‘AddDistributedRedisCache’ metodu ile session’ların hangi Redis server’da tutulacağına dair gerekli konfigürasyonlar yapılmaktadır. 13. satırda ise session servisi eklenmekte ve 24. satırda middleware olarak devreye sokulmaktadır.
Bu entegrasyonlar neticesinde uygulamada kullanılan tüm session’lar direkt olarak Redis sunucusunda cache edilecektirler. Böylece uygulamanın herhangi bir sebepten dolayı kapanması yahut aksaması üretilen sessionların silinmesini engelleyeceği gibi bir yandan da uygulamanın belleğini işgal etmeyecekleri için performansı düşürüp maliyeti arttırmayacaktır.
public class RedisController : Controller { public IActionResult RedisSessionSet() { HttpContext.Session.Set("name", Encoding.UTF8.GetBytes("Gençay Yıldız")); return View(); } public IActionResult RedisSessionGet() { if (HttpContext.Session.TryGetValue("name", out byte[] value)) Console.WriteLine(Encoding.UTF8.GetString(value)); return View(); } }
Görüldüğü üzere session bilgileri hedef Redis sunucusunda başarıyla tutulmaktadır.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Merhaba.Öncelikle öğrendiklerinizi kaliteli bir biçimde bizlerle paylaştığınız için teşekkür ederim herkes adına. Soruma gelirsek :
Paylaşımlı bir hosting satın aldık diyelim.Localde geliştirme yaparken redisi kurduk
peki canlıya alırken uygulamamızı derleyip attık. Redisi sunucuya da kurmamız gerekmiyor mu ? Yani dedicated bir sunucumuz olmadan paylaşımlı hostingimize redisi kuramaz mıyız ? Yazdığımız redis kodları çalışmaz mı ?
Biraz saçma bi soru olmuş olabilir ama aydınlanmak isterim 😀 Teşekkürler.
Merhaba,
Amazon yahut Azure gibi cloud sistemlerden Redis sunucuları ayağa kaldırmanız gerekecektir 🙂 Ardından uygulamanızla ilgili sunuculara bağlantı kurup ilişkilendirebilirsiniz.
İyi çalışmalar…
Hocam makale için teşekkürler,
Benim sorum da şu olacak Redise bir timeout süresi vermedik sessionlar ne kadar süre Ram’de tutulacak?
Teşekkürler hocam.
Her defasinda oldugu kimi cok guzel seri idi. Cok sag olun, tesekkurler.