Какие решения вы использовали для кеширования данных в C#?

«Какие решения вы использовали для кеширования данных в C#?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор решения для кеширования зависит от масштаба приложения и требований. Вот основные инструменты, которые я применял:

1. IMemoryCache (для кеша в памяти процесса) Идеально для быстрого кеширования данных в рамках одного экземпляра приложения (не распределенного).

// Внедрение через DI
public class MyService
{
    private readonly IMemoryCache _cache;
    public MyService(IMemoryCache cache) => _cache = cache;

    public string GetCachedData()
    {
        return _cache.GetOrCreate("myKey", entry =>
        {
            entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);
            return ExpensiveDatabaseCall(); // Данные кешируются на 10 минут
        });
    }
}

2. IDistributedCache (для распределенного кеша) Используется, когда несколько экземпляров приложения должны разделять общий кеш (например, в веб-ферме). Поддерживает разные бэкенды:

  • Redis (наиболее популярный, высокопроизводительный).
  • SQL Server.
  • NCache.

3. Атрибут [ResponseCache] в ASP.NET Core Для кеширования HTTP-ответов на уровне контроллера или действия, используя заголовки Cache-Control.

[HttpGet]
[ResponseCache(Duration = 60)] // Кеширует ответ на 60 секунд
public IActionResult Get() { ... }

4. Lazy<T> для ленивой инициализации с кешированием результата Полезно для тяжелых в создании объектов, которые нужны только при первом обращении.

private readonly Lazy<ExpensiveService> _service = new Lazy<ExpensiveService>(() => new ExpensiveService());

Критерии выбора: IMemoryCache — для простых сценариев в одном процессе; IDistributedCache с Redis — для масштабируемых и отказоустойчивых систем. Всегда важно настраивать политику срока жизни (TTL) и продумывать стратегию инвалидации кеша.