Home ASP.NET Core Distributed Redis Cache Kullanımı
Post
Cancel

ASP.NET Core Distributed Redis Cache Kullanımı

Merhabalar bu makalede ASP.NET Core projesinde Redis ile distributed cache yapısını inceleyeceğiz. Öncelikle Redis hakkında bilgi sahibi olmak isterseniz Redis Nedir? Ne İşe Yarar? Nerelerde Kullanılır? konusunu incelediğim makalemi okuyabilirsiniz. Öncelikle bir netcorerediscache isminde ASP.NET Core Web API projesi oluşturuyorum. Projeye Microsoft.Extensions.Caching.StackExchangeRedis paketini ekliyorum.

1
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

StackExchangeRedis eklendikten sonra Program.cs içerisinde AddStackExchangeRedisCache metodunu ekliyorum.

1
2
3
4
5
6
7
8
  builder.Services.AddStackExchangeRedisCache(options =>
  {
    options.ConfigurationOptions = new ConfigurationOptions
    {
        EndPoints = { "localhost:6379" },
        Password = "msuzen123!",
    };
  });

Projeyi oluşturduğumda standart oluşan WeatherForecastController’da cache işlemlerini yapıyorum.

1
2
3
4
5
6
7
8
9
10
    List<string> dataList = new List<string>();
    string serializedCacheData;

    var cacheKey = "summaries";
    var cacheData = _distributedCache.Get(cacheKey);
    if (cacheData != null)
    {
        serializedCacheData = Encoding.UTF8.GetString(cacheData);
        dataList = JsonSerializer.Deserialize<List<string>>(serializedCacheData);  
    }

_distributedCache.Get(cacheKey) ile “summaries” anahtarındaki cache değerini alıyorum. Eğer değer null değil ise değer string listesine deserialize yaparak set ediyorum. Eğer null ise aşağıdaki kod bloğu ile bu sefer veritabanından yada örnekteki gibi sabit listeyi byte[] tipinde serialize yaparak cache ekleme işlemi yapıyorum.

1
2
3
4
5
6
7
8
9
10
11
12
13
    else
    {
        dataList = Summaries.ToList();
        serializedCacheData = JsonSerializer.Serialize(dataList);
        cacheData = Encoding.UTF8.GetBytes(serializedCacheData);
        _distributedCache.Set(cacheKey,cacheData,new DistributedCacheEntryOptions()
        {
            AbsoluteExpiration = DateTime.Now.AddMinutes(10),
            SlidingExpiration = TimeSpan.FromMinutes(2),
        });
    }

    return dataList;

Burada DistributedCacheEntryOptions parametrelerinden iki tanesine değineceğim.

  • AbsoluteExpiration: Verilen süre sonunda cachedeki verinin expire olmasını sağlar.
  • SlidingExpiration: Veri expire olmadan istendiğinde istek sonrasında expire süresine verilen süre eklenir.

Tüm controller kod bloğu aşağıdaki gibidir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System.Text;
using System.Text.Json;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;

namespace netcorerediscache.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private IDistributedCache _distributedCache;

        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        
        public WeatherForecastController(IDistributedCache distributedCache)
        {
            _distributedCache = distributedCache;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public List<string> Get()
        {
            List<string> dataList = new List<string>();
            string serializedCacheData;

            var cacheKey = "summaries";
            var cacheData = _distributedCache.Get(cacheKey);
            if (cacheData != null)
            {
                serializedCacheData = Encoding.UTF8.GetString(cacheData);
                dataList = JsonSerializer.Deserialize<List<string>>(serializedCacheData);  
            }
            else
            {
                dataList = Summaries.ToList();
                serializedCacheData = JsonSerializer.Serialize(dataList);
                cacheData = Encoding.UTF8.GetBytes(serializedCacheData);
                _distributedCache.Set(cacheKey,cacheData,new DistributedCacheEntryOptions()
                {
                    AbsoluteExpiration = DateTime.Now.AddMinutes(10),
                    SlidingExpiration = TimeSpan.FromMinutes(2),
                });
            }

            return dataList;
        }
    }
} 

Projeyi çalıştırıp swagger yardımıyla test ettiğimde ilk istekte cache boş olduğu için cache ekleyip statik veriyi geri döndürüyor. İkinci istekte cache verisini geri döndürüyor. Bir sonraki makalede görüşmek üzere.

Kaynaklar

https://codewithmukesh.com/blog/redis-caching-in-aspnet-core/

https://www.c-sharpcorner.com/article/distributed-redis-caching-in-asp-net-core/

This post is licensed under CC BY 4.0 by the author.

Redis Nedir? Ne İşe Yarar? Nasıl Kullanılır?

Repository Pattern İle .NET 6 Web API Üzerinde Multiple DbContext Kullanımı