Что такое In-Memory Cache?

«Что такое In-Memory Cache?» — вопрос из категории ASP.NET Core, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

In-Memory Cache — это механизм хранения данных в оперативной памяти (RAM) процесса приложения для сверхбыстрого повторного доступа, позволяющий избежать повторных затратных операций (тяжёлых вычислений, запросов к БД, вызовов внешних API).

Характеристики:

  • Скорость: Доступ к данным в RAM на порядки быстрее, чем к диску или сети.
  • Волатильность: Данные теряются при остановке или перезапуске приложения.
  • Ограниченность: Кэш конкурирует за память с самим приложением.

Типичные сценарии использования в ASP.NET Core:

  • Кэширование редко меняющихся справочников из БД.
  • Хранение результатов сложных вычислений или отчётов.
  • Временное хранение состояния сессии пользователя.
  • Кэширование ответов от внешних HTTP-сервисов.

Пример реализации с IMemoryCache:

  1. Регистрация сервиса:

    // В Program.cs или Startup.ConfigureServices
    builder.Services.AddMemoryCache();
  2. Использование в сервисе:

    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).