При разработке 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/