Caching in C#: So beschleunigen Sie Ihre Anwendung und sparen Ressourcen

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

Warum Caching die Superkraft jedes C#-Entwicklers ist

\n

Stellen Sie sich vor: Ihre Anwendung greift jedes Mal auf die Datenbank zu, um dieselbe Liste von Städten oder denselben Wechselkurs abzurufen. Die Datenbank ist eine langsame und teure Ressource. Was, wenn wir Ihnen sagen, dass Sie dem Benutzer in 1 Millisekunde statt in 100 antworten können? Ja, das ist keine Magie, sondern ein cleveres Daten-Caching in C#.

\n

Caching ist eine Technik zur temporären Speicherung häufig angefragter Daten in einem schnellen Speicher (normalerweise im Arbeitsspeicher). In diesem Artikel werden wir behandeln, wie Sie einen Cache in .NET-Anwendungen implementieren, sowohl mit integrierten Mechanismen als auch mit externen Lösungen. Sie erfahren, wie Sie die richtige Strategie auswählen und nicht in die Falle veralteter Daten tappen.

\n\n

Arten von Caching in C#: Von MemoryCache bis Redis

\n

Im .NET-Ökosystem gibt es mehrere Ansätze für das Caching. Die Wahl hängt von der Architektur Ihrer Anwendung ab: Monolith oder Microservices, ein Server oder ein Cluster.

\n\n

1. Integrierter MemoryCache (System.Runtime.Caching / Microsoft.Extensions.Caching.Memory)

\n

Der einfachste und schnellste Weg ist die Verwendung von IMemoryCache. Die Daten werden im Arbeitsspeicher des Prozesses gespeichert. Ideal für Single-Thread-Anwendungen oder einfache Websites.

\n

Beispiel für die Registrierung und Verwendung in ASP.NET Core:

\n
// In Program.cs\nbuilder.Services.AddMemoryCache();\n\n// In einem Controller oder Service\npublic class WeatherService\n{\n    private readonly IMemoryCache _cache;\n\n    public WeatherService(IMemoryCache cache)\n    {\n        _cache = cache;\n    }\n\n    public async Task<string> GetWeatherAsync(string city)\n    {\n        string cacheKey = $"weather_{city}";\n\n        // Versuchen, Daten aus dem Cache zu holen\n        if (_cache.TryGetValue(cacheKey, out string cachedData))\n        {\n            return cachedData;\n        }\n\n        // Wenn keine Daten vorhanden sind – laden (z. B. von einer API)\n        string weatherData = await FetchWeatherFromApi(city);\n\n        // Für 10 Minuten im Cache speichern\n        var cacheEntryOptions = new MemoryCacheEntryOptions()\n            .SetAbsoluteExpiration(TimeSpan.FromMinutes(10));\n\n        _cache.Set(cacheKey, weatherData, cacheEntryOptions);\n\n        return weatherData;\n    }\n}
\n

Wichtige Methoden: TryGetValue, Set, Remove. Beachten Sie die Ablaufrichtlinien: absolute Zeit (Daten verfallen genau nach N Minuten) und gleitende Zeit (Daten bleiben erhalten, solange sie abgerufen werden, und N Minuten nach der letzten Anfrage).

\n\n

2. Verteilter Cache: Redis über IDistributedCache

\n

Wenn Sie mehrere Anwendungsinstanzen haben (Webfarm, Microservices), ist MemoryCache nicht geeignet – jeder Server speichert seine eigene Kopie. Hier kommt Redis ins Spiel. Es fungiert als separater Server, der für alle Instanzen gemeinsam ist.

\n

Einbindung von Redis in C#:

\n
// Installieren Sie das Paket: Microsoft.Extensions.Caching.StackExchangeRedis\nbuilder.Services.AddStackExchangeRedisCache(options =>\n{\n    options.Configuration = "localhost:6379";\n    options.InstanceName = "SampleInstance";\n});\n\n// Verwendung über IDistributedCache\npublic class ProductService\n{\n    private readonly IDistributedCache _cache;\n\n    public ProductService(IDistributedCache cache)\n    {\n        _cache = cache;\n    }\n\n    public async Task<Product> GetProductAsync(int id)\n    {\n        string cacheKey = $"product_{id}";\n        var cachedProduct = await _cache.GetStringAsync(cacheKey);\n\n        if (cachedProduct != null)\n        {\n            return JsonSerializer.Deserialize<Product>(cachedProduct);\n        }\n\n        var product = await FetchProductFromDb(id);\n        var serialized = JsonSerializer.Serialize(product);\n\n        await _cache.SetStringAsync(cacheKey, serialized, new DistributedCacheEntryOptions\n        {\n            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30)\n        });\n\n                

Blogs

Buchempfehlungen