Caching in C#: Redis, Memcached und integrierte Lösungen von A bis Z

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

Einleitung: Warum Caching eine kritische Komponente von C#-Anwendungen ist

\n\n

In 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\n

In 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\n

1. Integriertes Caching: MemoryCache und IDistributedCache

\n\n

Die .NET-Plattform bietet Entwicklern mehrere integrierte Mechanismen für das Caching, die keine Installation von Drittanbieterdiensten erfordern.

\n\n

1.1 MemoryCache – Lokaler Cache für einen einzelnen Server

\n\n

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

\n\n
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\n

Wesentliche 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
\n\n

1.2 IDistributedCache – Abstraktion für verteilten Cache

\n\n

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

\n\n
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

2. R

Blogs

Buchempfehlungen