Ответ
In-Memory Cache — это механизм хранения данных в оперативной памяти (RAM) процесса приложения для сверхбыстрого повторного доступа, позволяющий избежать повторных затратных операций (тяжёлых вычислений, запросов к БД, вызовов внешних API).
Характеристики:
- Скорость: Доступ к данным в RAM на порядки быстрее, чем к диску или сети.
- Волатильность: Данные теряются при остановке или перезапуске приложения.
- Ограниченность: Кэш конкурирует за память с самим приложением.
Типичные сценарии использования в ASP.NET Core:
- Кэширование редко меняющихся справочников из БД.
- Хранение результатов сложных вычислений или отчётов.
- Временное хранение состояния сессии пользователя.
- Кэширование ответов от внешних HTTP-сервисов.
Пример реализации с IMemoryCache:
-
Регистрация сервиса:
// В Program.cs или Startup.ConfigureServices builder.Services.AddMemoryCache(); -
Использование в сервисе:
public class CatalogService { private readonly IMemoryCache _cache; private readonly IProductRepository _repository; private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5); public CatalogService(IMemoryCache cache, IProductRepository repository) { _cache = cache; _repository = repository; } public async Task<List<Product>> GetTopProductsAsync() { // Попытка получить данные из кэша string cacheKey = "top_products"; if (!_cache.TryGetValue(cacheKey, out List<Product> products)) { // Данных в кэше нет -> получаем из источника (БД) products = await _repository.GetTopSellingProductsAsync(10); // Настраиваем параметры кэширования и сохраняем var cacheOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration(_cacheDuration) // Удалится через 5 минут .SetPriority(CacheItemPriority.High); // При нехватке памяти удалится в последнюю очередь _cache.Set(cacheKey, products, cacheOptions); } return products; // Данные либо из кэша, либо только что загружены } }Важные аспекты:
- Стратегии вытеснения:
Absolute Expiration(удаление в заданное время),Sliding Expiration(обновление срока при каждом обращении). - Зависимости: Можно инвалидировать кэш при изменении данных, но
IMemoryCacheне предоставляет встроенного механизма для распределённых сценариев. - Распределённый кэш: Для приложений, работающих на нескольких серверах (ферма), используйте
IDistributedCache(Redis, SQL Server).
- Стратегии вытеснения: