ASP.NET Core Minimal API 프로젝트의 EasyCaching

API를 개발할 때 성능을 향상시키고 서버 부하를 줄이기 위해 캐시가 필요한 것은 매우 일반적입니다.
ASP.NET Core에는 기본적으로 캐시를 관리하기 위한 자체 라이브러리가 있지만 실제 시나리오에서는 깨끗한 솔루션을 갖기 위해 일부 코드를 작성해야 합니다.

EasyCaching은 기본 사용법과 캐싱을 더 쉽게 처리하는 데 도움이 되는 일부 고급 캐싱 사용법을 포함하는 오픈 소스 캐싱 라이브러리입니다.

Minimal API 프로젝트에서 EasyCaching을 사용하는 방법을 살펴보겠습니다.

패키지 설치



EasyCaching의 기본 패키지는 EasyCaching.Core라고 하며 캐싱의 기본 논리를 포함합니다.
EasyCaching의 다른 패키지 없이 이 패키지를 사용하는 것은 그리 일반적이지 않습니다.
그 이유는 매우 간단합니다. EasyCaching이 모든 데이터를 저장하는 공급자가 필요합니다.
EasyCaching 팀에서 직접 개발한 많은 캐싱 공급자가 있습니다.
  • 인메모리
  • 레디스
  • SQLite
  • LiteDB
    그리고 훨씬 더.

  • 캐싱 공급자를 선택하고 NuGet을 통해 설치합니다.

    Install-Package EasyCaching.InMemory
    Install-Package EasyCaching.Redis
    Install-Package EasyCaching.SQLite
    


    모든 종속성은 캐싱 공급자 패키지와 함께 설치됩니다.

    프로젝트 구성



    이제 ASP.NET Core Minimal API 프로젝트에 EasyCaching을 추가할 준비가 되었습니다.
    "Program.cs"파일을 열고 클래스 시작 부분의 IServiceCollection에 서비스를 추가합니다.

    builder.Services.AddEasyCaching(options =>
    {
        options.UseInMemory("inMemoryCache");
    });
    


    이는 In Memory 캐시를 사용하는 가장 간단한 방법이며 기본 구성을 사용합니다.
    이 단계에서 많은 매개변수를 설정할 수도 있습니다.

    builder.Services.AddEasyCaching(options =>
    {
        // use memory cache with your own configuration
        options.UseInMemory(config =>
        {
            config.DBConfig = new InMemoryCachingOptions
            {
                // scan time, default value is 60s
                ExpirationScanFrequency = 60,
                // total count of cache items, default value is 10000
                SizeLimit = 100,
    
                // below two settings are added in v0.8.0
                // enable deep clone when reading object from cache or not, default value is true.
                EnableReadDeepClone = true,
                // enable deep clone when writing object to cache or not, default valuee is false.
                EnableWriteDeepClone = false,
            };
            // the max random second will be added to cache's expiration, default value is 120
            config.MaxRdSecond = 120;
            // whether enable logging, default is false
            config.EnableLogging = false;
            // mutex key's alive time(ms), default is 5000
            config.LockMs = 5000;
            // when mutex key alive, it will sleep some time, default is 300
            config.SleepMs = 300;
        }, "inMemoryCache");
    });
    


    메모리 제공자에 대한 모든 매개변수를 더 잘 이해하려면 공식 문서를 읽을 수 있습니다. https://easycaching.readthedocs.io/en/latest/In-Memory/

    EasyCaching을 사용하도록 코드 변경



    기본 WeatherForecast Get 끝점을 사용하여 EasyCaching을 사용하는 것이 얼마나 쉬운지 이해할 수 있습니다.
    우선, 종속성 주입 엔진을 사용하여 공급자의 인스턴스를 검색할 수 있습니다(예, 시작 시 둘 이상을 구성할 수 있습니다).
    그런 다음 EasyCaching 공급자에 값이 저장되어 있는지 확인할 수 있으며 이 경우 엔드포인트에서 캐시된 값을 직접 반환할 수 있습니다.
    다른 경우에는 날씨 값을 로드하고 API에 대한 다음 호출을 위해 캐시에 저장합니다.
    코드를 직접 보면 더 쉽습니다.

    app.MapGet("/weatherforecast", async (IEasyCachingProvider _provider) => 
    {
        if (await _provider.ExistsAsync("forecast"))
        {
            var cachedForecast = await _provider.GetAsync<WeatherForecast[]>("forecast");
            return cachedForecast.Value;
        }
    
        var forecast = Enumerable.Range(1, 5).Select(index =>
            new WeatherForecast
            (
                DateTime.Now.AddDays(index),
                Random.Shared.Next(-20, 55),
                summaries[Random.Shared.Next(summaries.Length)]
            ))
            .ToArray();
    
        await _provider.SetAsync("forecast", forecast, TimeSpan.FromMinutes(60));
    
        return forecast;
    })
    .WithName("GetWeatherForecast");
    


    프로 팁



    매우 쉬운 방법으로 모든 설정을 appsettings.json 파일에 직접 저장할 수 있습니다.

    아래 코드와 같이 공급자 설정을 변경할 수 있습니다.

    options.UseInMemory(Configuration, "default", "easycaching:inmemory");
    


    그런 다음 이 json 섹션을 appsettings.json 파일에 추가할 수 있습니다.

    "easycaching": {
        "inmemory": {
            "MaxRdSecond": 120,
            "EnableLogging": false,
            "LockMs": 5000,
            "SleepMs": 300,
            "DBConfig":{
                "SizeLimit": 10000,
                "ExpirationScanFrequency": 60,
                "EnableReadDeepClone": true,
                "EnableWriteDeepClone": false
            }
        }
    }
    


    In Memory 공급자뿐만 아니라 다른 공급자에 대해서도 동일한 접근 방식을 사용할 수 있습니다.
    여기에서 Redis의 예를 찾을 수 있습니다. https://easycaching.readthedocs.io/en/latest/Redis/

    좋은 웹페이지 즐겨찾기