Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Redis Yazı Serisi 11 – Redis İle DistributedCache Kullanımı

Merhaba,

Redis yazı serimizin bu makalesinde; uygulamanın, verisel trafiğini minimize etmek ve performans ile birlikte ölçeklendirilebilirliğini arttırmak için birden fazla instance ile ayağa kaldırılması sonucu in-memory cache kullanıldığında olası veri tutarsızlığına mahal verebilecek durumların oluşmasına karşılık verileri merkezi olarak store etmeyi tercih eden DistributedCache’i Redis ile inceleyeceğiz.

Redis Yazı Serisi 3 - Distributed Caching Nedir?

İçerik olarak Redis veri türlerine çok temas etmeden yüzeysel cacheleme yapmamızı sağlayan ‘StackExchangeRedisCache’ yöntemini uygulayacağımızı, esas Redis’e tam teferruatlı yönetimi bir sonraki makalede ele alacağımızı bildirerek konuya başlayalım.

Kullanılacak Kütüphane ve Servisler

Bir Asp.NET Core uygulamasında Redis DistributedCache kullanabilmek için ilk olarak uygulamaya Microsoft.Extensions.Caching.StackExchangeRedis kütüphanesinin dahil edilmesi gerekmektedir. Ardından ‘Startup.cs’ dosyasından aşağıdaki gibi ‘AddStackExchangeRedisCache’ modülü uygulamaya eklenmelidir. Burada dikkat edilmesi gereken husus Redis serverın ayakta olmasıdır.

    public class Startup
    {
        .
        .
        .
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            services.AddStackExchangeRedisCache(options => options.Configuration = "localhost:6379");
            .
            .
            .
        }
        .
        .
        .
    }

Bu işlemden sonra artık uygulamada ‘IDistributedCache’ interface’ını kullanarak aşağıdaki örnekte olduğu gibi dependency injection’dan servisimizi talep edebiliriz.

    using Microsoft.Extensions.Caching.Distributed;
    public class ProductController : Controller
    {
        IDistributedCache _distributedCache;
        public ProductController(IDistributedCache distributedCache)
        {
            _distributedCache = distributedCache;
        }
    }

Metotlar

SetString
Metinsel türde key-value tarzında veri depolamasını gerçekleştiren metottur.

        public IActionResult CacheSetString()
        {
            _distributedCache.SetString("date", DateTime.Now.ToString());
            return View();
        }

ya da

        public IActionResult CacheSetString()
        {
            _distributedCache.SetString("date", DateTime.Now.ToString(), new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = DateTime.Now.AddSeconds(1200),
                SlidingExpiration = TimeSpan.FromSeconds(60)
            });
            return View();
        }

GetString
Metinsel türde depolanmış verilerden key değerine karşılık value değerini döndüren fonksiyondur.

        public IActionResult CacheGetString()
        {
            string value = _distributedCache.GetString("date");
            return View();
        }

Remove
Key değeri verilen datayı silen metottur.

        public IActionResult CacheRemove()
        {
            _distributedCache.Remove("date");
            return View();
        }

Set
Cache’de binary olarak data tutmamızı sağlayan fonksiyondur.

        public IActionResult CacheSet()
        {
            byte[] dateByte = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
            _distributedCache.Set("date", dateByte);
            return View();
        }

ya da

        public IActionResult CacheSet()
        {
            byte[] dateByte = Encoding.UTF8.GetBytes(DateTime.Now.ToString());
            _distributedCache.Set("date", dateByte, new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = DateTime.Now.AddSeconds(1200),
                SlidingExpiration = TimeSpan.FromSeconds(60)
            });
            return View();
        }

Get
Binary olarak tutulan datayı geri binary olarak elde etmemizi sağlayan fonksiyondur.

        public IActionResult CacheGet()
        {
            byte[] dateByte = _distributedCache.Get("date");
            string value = Encoding.UTF8.GetString(dateByte);
            return View();
        }

Dosya Cacheleme
Aşağıda resim dosyasının cachelendiği örnek kod bloğunu inceleyebilirsiniz.

        public IActionResult CacheFile()
        {
            string path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/resim.jpg");
            byte[] fileByte = System.IO.File.ReadAllBytes(path);
            _distributedCache.Set("file", fileByte);
            return View();
        }

Cachelenmiş Dosyayı Okuma

        public IActionResult CacheFileRead()
        {
            byte[] fileByte = _distributedCache.Get("file");
            return File(fileByte, "image/jpg");
        }

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

3 Cevaplar

  1. Mehmed Emre dedi ki:

    İçerik için teşekkürler. Bir sorum olacak. Ben asp.net core projemde bir cache helper tarzı sınıf yazmak istiyorum. Fakat in memory cahce DP kullanıyor. Ve bu yüzden static sınıf yapamıyorum. Static yapamasam nesne ile çağırırken kurucu parametresi istiyor. Bunu redis ile yapmak istemiştim fakat onda da olmuyor. Yardımcı olursanız sevinirim.

  1. 19 Nisan 2020

    […] Redis Yazı Serisi 11 – Redis İle DistributedCache Kullanımı […]

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir