Caching in C# (.NET): Redis, MemoryCache und andere Lösungen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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


Beispiel 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.StackExchangeRedis


Konfiguration 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.Json oder Newtonsoft.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

Empfehlungen