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 andere Werkzeuge



In modernen hochbelasteten Anwendungen in C# (.NET) ist Caching einer der Schlüsselmechanismen zur Leistungssteigerung und Reduzierung der Datenbanklast. In diesem Artikel betrachten wir die wichtigsten Caching-Werkzeuge im .NET-Ökosystem im Detail: den integrierten MemoryCache, den verteilten Cache auf Basis von Redis über die Bibliothek StackExchange.Redis sowie die Abstraktion IDistributedCache.



1. Integriertes Caching: MemoryCache



MemoryCache (Namespace Microsoft.Extensions.Caching.Memory) ist die einfachste Möglichkeit, Daten direkt im Arbeitsspeicher des Prozesses zwischenzuspeichern. Ideal geeignet für Einprozessanwendungen (z. B. ASP.NET Core ohne Skalierung).



Beispiel für die grundlegende Verwendung:



using Microsoft.Extensions.Caching.Memory;

// Cache erstellenIMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

// In Cache schreiben mit einer Lebensdauer von 5 Minutencache.Set("user:123", new User { Id = 123, Name = "Ivan" }, TimeSpan.FromMinutes(5));

// Aus Cache lesenif (cache.TryGetValue("user:123", out User user)){ Console.WriteLine($"Benutzer: {user.Name}");}else{ Console.WriteLine("Cache leer, lade aus DB...");}


Vorteile: maximale Geschwindigkeit, keine Netzwerkverzögerung, einfache Konfiguration.
Nachteile: Daten leben nur in einem Prozess, gehen beim Neustart der Anwendung verloren.



2. Verteiltes Caching: Redis + StackExchange.Redis



Für verteilte Systeme (mehrere Server, Microservices) ist ein externer Cache erforderlich. Redis ist die beliebteste Wahl. Die wichtigste Bibliothek für die Arbeit mit Redis in .NET ist StackExchange.Redis (über 6.000 Sterne auf GitHub).



Installation:



dotnet add package StackExchange.Redis


Beispiel für die Arbeit mit Redis:



using StackExchange.Redis;

// Verbindung zu RedisConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();

// Zeichenfolge mit TTL (Lebensdauer) schreibendb.StringSet("session:token123", "user_data_here", TimeSpan.FromHours(1));

// Lesenstring data = db.StringGet("session:token123");if (!string.IsNullOrEmpty(data)){ Console.WriteLine($"Daten aus Cache: {data}");}

// Caching komplexer Objekte (Serialisierung in JSON)var product = new Product { Id = 1, Name = "Laptop", Price = 75000 };string json = System.Text.Json.JsonSerializer.Serialize(product);db.StringSet("product:1", json, TimeSpan.FromMinutes(10));

// Deserialisierung beim Lesenstring cachedJson = db.StringGet("product:1");var cachedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(cachedJson);


Zusätzliche Funktionen von Redis:

  • Hashes — zum Speichern von Objekten mit Feldern (z. B. Benutzerprofil).
  • Listen und Mengen — für Warteschlangen, Ranglisten.
  • Pub/Sub — für Benachrichtigungen zur Cache-Invalidierung.
  • Lua-Skripte — atomare Operationen.


3. Abstraktion IDistributedCache



Microsoft stellt das Interface IDistributedCache (Paket Microsoft.Extensions.Caching.Abstractions) bereit, das es ermöglicht, zwischen verschiedenen Cache-Implementierungen zu wechseln, ohne den Anwendungscode zu ändern.



Implementierungen:

  • MemoryDistributedCache — für Entwicklung und Tests (speichert im Arbeitsspeicher).
  • RedisCache (Paket Microsoft.Extensions.Caching.StackExchangeRedis) — für die Produktion.
  • SqlServerCache

Empfehlungen