Кэширование в 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, полностью сов