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.RedisBeispiel 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(PaketMicrosoft.Extensions.Caching.StackExchangeRedis) — für die Produktion.SqlServerCache
Auch in der Bibliothek
SMS-Versand mit Swift (iOS/macOS): MessageUI-API und Drittanbieterdienste
OAuth-Client für TypeScript: Authentifizierung über GitHub, Google und andere Anbieter
Drogon C++ Framework: Vollständiges Tutorial mit Beispielen
HTML-Parsing in C# (.NET): Bibliotheken HtmlAgilityPack und AngleSharp
PDF-Generierung in PHP: Überblick über Bibliotheken und Codebeispiele