Кэширование в C# (.NET): Redis, MemoryCache и другие решения

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Кэширование в C# (.NET): Redis, MemoryCache и альтернативы

Кэширование — один из ключевых инструментов повышения производительности приложений на C# (.NET). Оно позволяет сократить время отклика, снизить нагрузку на базы данных и уменьшить затраты на инфраструктуру. В этой статье мы разберем встроенные механизмы .NET, популярные реализации на базе Redis, а также альтернативные решения, такие как NCache и Couchbase.

1. Встроенное кэширование: MemoryCache

MemoryCache (пространство имен Microsoft.Extensions.Caching.Memory) — это простой и быстрый кэш, который хранит данные в оперативной памяти одного процесса. Он идеально подходит для однопоточных приложений или веб-серверов с одним экземпляром.

Установка и подключение

dotnet add package Microsoft.Extensions.Caching.Memory

Пример базового использования

using Microsoft.Extensions.Caching.Memory;

public class DataService
{
    private readonly IMemoryCache _cache;
    private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5);

    public DataService(IMemoryCache cache) => _cache = cache;

    public async Task<string> GetDataAsync(string key)
    {
        if (!_cache.TryGetValue(key, out string cachedData))
        {
            cachedData = await FetchFromDatabaseAsync(key);
            _cache.Set(key, cachedData, new MemoryCacheEntryOptions
            {
                AbsoluteExpirationRelativeToNow = _cacheDuration
            });
        }
        return cachedData;
    }
}

Преимущества и недостатки

  • + Простота, нулевая задержка сети.
  • + Встроенная поддержка истечения срока (абсолютное/скользящее).
  • - Не работает при масштабировании на несколько серверов.
  • - При перезапуске приложения кэш очищается.

2. Распределенное кэширование: Redis

Redis — самый популярный выбор для распределенного кэширования в экосистеме .NET. Он работает как отдельный сервис, доступный всем экземплярам приложения. В .NET используется абстракция IDistributedCache.

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

dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis

Настройка в Program.cs

builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379";
    options.InstanceName = "MyAppCache";
});

Пример работы с IDistributedCache

public class RedisCacheService
{
    private readonly IDistributedCache _cache;

    public RedisCacheService(IDistributedCache cache) => _cache = cache;

    public async Task SetAsync(string key, byte[] data, int minutes = 10)
    {
        await _cache.SetAsync(key, data, new DistributedCacheEntryOptions
        {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes)
        });
    }

    public async Task<byte[]> GetAsync(string key)
    {
        return await _cache.GetAsync(key);
    }
}

Продвинутые возможности Redis

  • Сериализация объектов: используйте System.Text.Json или Newtonsoft.Json.
  • Инвалидация по тегам: сторонние библиотеки (например, EasyCaching.Redis) позволяют группировать записи.
  • Pub/Sub: для уведомлений об изменениях кэша.

3. Альтернативы Redis

3.1 NCache

NCache — коммерческое решение (есть бесплатная версия) с поддержкой .NET. Предоставляет расширенные возможности: синхронизация между узлами, SQL-подобные запросы к кэшу, кэширование сессий ASP.NET.

  • + Встроенная поддержка IDistributedCache.
  • + Не требует отдельного сервера (in-process режим).
  • - Лицензирование для продакшена.

3.2 Couchbase

Couchbase — NoSQL база данных с функциями кэширования. В .NET используется через SDK Couchbase.Extensions.Caching.

dotnet add package Couchbase.Extensions.Caching
builder.Services.AddCouchbaseCache(options =>
{
    options.ConnectionString = "couchbase://localhost";
    options.BucketName = "cache-bucket";
});

Подходит для сценариев, где уже используется Couchbase как основное хранилище.

3.3 Azure Cache for Redis

Облачный сервис Microsoft, полностью сов

Рекомендаций