Einleitung: Warum Caching eine kritische Komponente von C#-Anwendungen ist
\n\nIn der modernen Webentwicklung beeinflusst die Anwendungsleistung direkt die Benutzererfahrung und die Geschäftskennzahlen. Jede Sekunde Verzögerung beim Laden einer Seite kann Sie 7% der Conversions kosten. Caching in C# (.NET) ist nicht nur eine "nette Option", sondern ein unverzichtbares Werkzeug für jeden ernsthaften Entwickler.
\n\nIn diesem Artikel analysieren wir drei Hauptansätze zum Caching im .NET-Ökosystem: Redis, Memcached und integrierte Lösungen (MemoryCache). Sie erfahren, wann welches Tool verwendet werden sollte, wie Sie den Cache richtig konfigurieren und typische Fehler vermeiden. Das Material ist sowohl für Anfänger in der C#-Entwicklung als auch für erfahrene Ingenieure nützlich, die ihr Wissen systematisieren möchten.
\n\n1. Integriertes Caching: MemoryCache und IDistributedCache
\n\nDie .NET-Plattform bietet Entwicklern mehrere integrierte Mechanismen für das Caching, die keine Installation von Drittanbieterdiensten erfordern.
\n\n1.1 MemoryCache – Lokaler Cache für einen einzelnen Server
\n\nIMemoryCache ist die einfachste und schnellste Methode zum Caching von Daten in C#. Die Daten werden im Arbeitsspeicher des aktuellen Prozesses gespeichert. Ideal geeignet für Single-Thread-Anwendungen oder Anwendungen, die auf einem einzelnen Server laufen.
using Microsoft.Extensions.Caching.Memory;\n\npublic class ProductService\n{\n private readonly IMemoryCache _cache;\n \n public ProductService(IMemoryCache cache)\n {\n _cache = cache;\n }\n\n public async Task<Product> GetProductAsync(int id)\n {\n string cacheKey = $"product_{id}";\n \n if (!_cache.TryGetValue(cacheKey, out Product product))\n {\n // Teure Operation (z. B. Datenbankabfrage)\n product = await GetProductFromDatabaseAsync(id);\n \n var cacheOptions = new MemoryCacheEntryOptions()\n .SetAbsoluteExpiration(TimeSpan.FromMinutes(30))\n .SetSlidingExpiration(TimeSpan.FromMinutes(5))\n .SetSize(1);\n \n _cache.Set(cacheKey, product, cacheOptions);\n }\n \n return product;\n }\n}\n\nWesentliche Merkmale von MemoryCache:
\n- \n
- Hohe Geschwindigkeit – Daten werden direkt aus dem RAM gelesen \n
- Keine Serialisierung – speichert Objekte unverändert \n
- Einschränkung – funktioniert nicht in einer Serverfarm (jeder Server hat seinen eigenen Cache) \n
- Risiko – beim Neustart der Anwendung wird der Cache vollständig gelöscht \n
1.2 IDistributedCache – Abstraktion für verteilten Cache
\n\nDas Interface IDistributedCache bietet eine einheitliche API für die Arbeit mit jedem verteilten Cache. Sie können zwischen Redis, SQL Server oder NCache wechseln, ohne den Code der Geschäftslogik zu ändern.
using Microsoft.Extensions.Caching.Distributed;\nusing System.Text.Json;\n\npublic class WeatherService\n{\n private readonly IDistributedCache _cache;\n \n public WeatherService(IDistributedCache cache)\n {\n _cache = cache;\n }\n\n public async Task<WeatherForecast> GetForecastAsync(string city)\n {\n string cacheKey = $"weather_{city}";\n string cachedData = await _cache.GetStringAsync(cacheKey);\n \n if (cachedData != null)\n {\n return JsonSerializer.Deserialize<WeatherForecast>(cachedData);\n }\n \n var forecast = await FetchFromApiAsync(city);\n var serialized = JsonSerializer.Serialize(forecast);\n \n await _cache.SetStringAsync(cacheKey, serialized, new DistributedCacheEntryOptions\n {\n AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)\n });\n \n return forecast;\n }\n}\n\n