EasyCaching в проекте ASP.NET Core Minimal API

При разработке API очень часто возникает необходимость в кэше для повышения производительности и снижения нагрузки на сервер.
ASP.NET Core имеет свою собственную библиотеку для управления кэшем «из коробки», но в реальном сценарии вам нужно написать немного кода, чтобы получить чистое решение.

EasyCaching — это библиотека кэширования с открытым исходным кодом, которая содержит базовые и некоторые расширенные возможности кэширования, что может помочь нам проще управлять кэшированием.

Давайте посмотрим, как мы можем использовать EasyCaching в проекте Minimal API.

Установите пакеты

Основной пакет EasyCaching называется EasyCaching.Core и содержит базовую логику кэширования.
Обычно этот пакет не используется без каких-либо других пакетов EasyCaching.
Причина очень проста: вам нужен провайдер, в котором EasyCaching хранит все данные.
Существует множество провайдеров кэширования, разработанных непосредственно командой EasyCaching:

  • InMemory
  • Redis
  • SQLite
  • LiteDB и многие другие.

Выберите свой провайдер кэширования и установите его через NuGet:

Install-Package EasyCaching.InMemory
Install-Package EasyCaching.Redis
Install-Package EasyCaching.SQLite
Войдите в полноэкранный режим Выход из полноэкранного режима

Все зависимости устанавливаются вместе с пакетом провайдера кэширования.

Настройте проект

Теперь мы готовы добавить EasyCaching в наш проект ASP.NET Core Minimal API.
Откройте файл «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");
});
Вход в полноэкранный режим Выход из полноэкранного режима

Вы можете прочитать официальную документацию, чтобы лучше понять все параметры для провайдера In Memory: 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/

Оцените статью
devanswers.ru
Добавить комментарий