Caching in C# (.NET): Redis, MemoryCache und Alternativen
Caching ist eines der wichtigsten Werkzeuge zur Leistungssteigerung von Anwendungen in C# (.NET). Es verkürzt die Antwortzeiten, reduziert die Belastung von Datenbanken und senkt die Infrastrukturkosten. In diesem Artikel betrachten wir die integrierten Mechanismen von .NET, die gängigen Implementierungen auf Basis von Redis sowie alternative Lösungen wie NCache und Couchbase.
1. Integriertes Caching: MemoryCache
MemoryCache (Namespace Microsoft.Extensions.Caching.Memory) ist ein einfacher und schneller Cache, der Daten im Arbeitsspeicher eines einzelnen Prozesses speichert. Er eignet sich ideal für Single-Thread-Anwendungen oder Webserver mit einer Instanz.
Installation und Einbindung
dotnet add package Microsoft.Extensions.Caching.MemoryBeispiel für die grundlegende Nutzung
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; }}Vorteile und Nachteile
- + Einfachheit, keine Netzwerkverzögerung.
- + Integrierte Unterstützung für Ablaufzeiten (absolut/gleitend).
- - Funktioniert nicht bei Skalierung auf mehrere Server.
- - Bei Neustart der Anwendung wird der Cache geleert.
2. Verteiltes Caching: Redis
Redis ist die beliebteste Wahl für verteiltes Caching im .NET-Ökosystem. Es läuft als separater Dienst, der allen Anwendungsinstanzen zur Verfügung steht. In .NET wird die Abstraktion IDistributedCache verwendet.
Paketinstallation
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedisKonfiguration in Program.cs
builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "MyAppCache";});Beispiel für die Arbeit mit 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); }}Erweiterte Redis-Funktionen
- Objektserialisierung: Verwenden Sie
System.Text.JsonoderNewtonsoft.Json. - Invalidierung nach Tags: Drittanbieter-Bibliotheken (z.B.
EasyCaching.Redis) ermöglichen die Gruppierung von Einträgen. - Pub/Sub: Für Benachrichtigungen über Cache-Änderungen.
3. Alternativen zu Redis
3.1 NCache
NCache ist eine kommerzielle Lösung (mit einer kostenlosen Version) mit .NET-Unterstützung. Es bietet erweiterte Funktionen: Synchronisierung zwischen Knoten, SQL-ähnliche Abfragen auf den Cache, ASP.NET-Sitzungscaching.
- + Integrierte Unterstützung für
IDist
Auch in der Bibliothek
Arbeiten mit ZIP-Archiven in Java: vollständige Anleitung zu java.util.zip
CMake für C++: vollständiger Leitfaden mit Beispielen