.NET Core ve Redis Kullanarak Distributed Cache Mekanizması Kurma

Redis Nedir?

Redis özünde key-value tipinde NoSQL bir veritabanıdır.  En önemli artısı ise verileri bellekte tutmasıdır. Çoğunuzun aklına bizim çok datamız var bu kadar belleği nereden bulacağız gibi sorular gelebilir. String-string tipinde datalar tutuyorsak 1M adet data 100 mb gibi bir yer kaplıyor.

Öncelikle Redis’i yükleyelim;

  • Komut satırını yönetici olarak çalıştırıp aşağıdaki kodu çalıştıralım.
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  • Chocolatey yüklendikten sonra şimdi de Redis’i yükleyelim
choco install redis-64

  • Komut satırına “redis-server” yazdığımızda aşağıdaki gibi bir ekranla karşılaşmamız lazım.

Şimdi bir tane .NET Core Web API oluşturalım. Bu örnek projede database first olarak ilerleyeceğim. Hedefim ise öğrenci bilgilerini bu öğrencinin aldığı dersleri tutmak üzerine olacak. Basitçe aşağıdaki veritabanını tasarladım.

Şimdi API endpointlerimizi oluşturalım ve cache olmadan bir benchmark çalıştıralım. Sonuçlarımıza bakalım.

ID’si girilen öğrencinin adını soyadını ve aldığı dersleri bize dönen endpointimiz yazdık.

[HttpGet("{id}")]
        public async Task<IActionResult> GetStudents([FromRoute] int id)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var students = _context.Students.Where(s => s.Id == id).Select(p => new
            {
                Name = p.Name,
                Surname = p.Surname,
                Course=_context.StudentsCourses.Where(cours=>cours.StudentId==p.Id).Select(c=>new
                {
                    CouseNam=_context.Courses.Where(cs=>cs.Id==c.Id).Select(a=>new
                    {
                        Name=a.CourseName,
                    })
                }).ToList(),


            }).ToList();

            if (students == null)
            {
                return NotFound();
            }

            return Ok(students);
        }

Şimdi “ab – Apache HTTP sunucusu başarım ölçme aracı” ile sunucumuza yük bindirelim.

Şimdi projemize Redis Cache ekleyelim.

  • Nuget üzerinden “Microsoft.Extensions.Caching.Redis.Core” paketini yükleyelim.
public void ConfigureServices(IServiceCollection services)
{
    services.AddDistributedRedisCache(options =>
    {
        options.InstanceName = "Sample";
        options.Configuration = "localhost";
    });
    services.AddSession();
    services.AddMvc();
}

public void Configure(IApplicationBuilder app, 
    IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseSession();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}
  • Controllerimize aşağıdaki değişkeni global olarak ekleyelim.
private readonly IDistributedCache _cache;

Controllerimizde gerekli değişikleri yapalım.

 [HttpGet("{id}")]
        [ResponseCache(Duration = 60)]
        public async Task<IActionResult> GetStudentsAsync([FromRoute] int id)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            if (_cache.GetStringAsync(Convert.ToString(id)) == null)
            {
                var students = _context.Students.Where(s => s.Id == id).Select(p => new
                {
                    Name = p.Name,
                    Surname = p.Surname,
                    Course = _context.StudentsCourses.Where(cours => cours.StudentId == p.Id).Select(c => new
                    {
                        CouseNam = _context.Courses.Where(cs => cs.Id == c.Id).Select(a => new
                        {
                            Name = a.CourseName,
                        })
                    }).ToList(),


                }).ToList();

                var cache = JsonConvert.SerializeObject(students);
                _cache.SetStringAsync(id.ToString(), cache);
                return Ok(students);
            }

            else
            {
                var cache = await _cache.GetStringAsync(Convert.ToString(id));
                var b = JsonConvert.DeserializeObject(cache);
                return Ok(b);
            }



        }

Benchmark sonuçlarımıza göz atalım.

 

Kaynak kod: https://github.com/limanerkan/RedisTutorial

 


Yayımlandı

kategorisi

,

yazarı:

Yorumlar

“.NET Core ve Redis Kullanarak Distributed Cache Mekanizması Kurma” için bir yanıt

  1. Osman avatarı
    Osman

    if (_cache.GetStringAsync(Convert.ToString(id)) == null) bunun yerine neden KeyExists kullanmadınız ?

Bir yanıt yazın

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

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.