Introduction : Pourquoi la mise en cache est un composant critique des applications C#
\n\nDans le développement web moderne, la performance de l'application influence directement l'expérience utilisateur et les indicateurs commerciaux. Chaque seconde de retard dans le chargement d'une page peut vous coûter 7 % de conversions. La mise en cache en C# (.NET) n'est pas simplement une "option agréable", mais un outil obligatoire pour tout développeur sérieux.
\n\nDans cet article, nous allons examiner trois approches principales de la mise en cache dans l'écosystème .NET : Redis, Memcached et les solutions intégrées (MemoryCache). Vous apprendrez quand utiliser quel outil, comment configurer correctement le cache et éviter les erreurs typiques. Ce contenu sera utile aussi bien aux développeurs C# débutants qu'aux ingénieurs expérimentés souhaitant systématiser leurs connaissances.
\n\n1. Mise en cache intégrée : MemoryCache et IDistributedCache
\n\nLa plateforme .NET offre aux développeurs plusieurs mécanismes intégrés pour la mise en cache qui ne nécessitent pas l'installation de services tiers.
\n\n1.1 MemoryCache — cache local pour un seul serveur
\n\nIMemoryCache est le moyen le plus simple et le plus rapide de mettre en cache des données en C#. Les données sont stockées dans la mémoire vive du processus en cours. Idéal pour les applications monothread ou les applications fonctionnant sur un seul serveur.
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 // Opération coûteuse (par exemple, requête à la base de données)\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\nCaractéristiques clés de MemoryCache :
\n- \n
- Haute vitesse — les données sont lues directement depuis la RAM \n
- Absence de sérialisation — stocke les objets tels quels \n
- Limitation — ne fonctionne pas dans une ferme de serveurs (chaque serveur a son propre cache) \n
- Risque — au redémarrage de l'application, le cache est complètement vidé \n
1.2 IDistributedCache — abstraction pour le cache distribué
\n\nL'interface IDistributedCache fournit une API unifiée pour travailler avec n'importe quel cache distribué. Vous pouvez basculer entre Redis, SQL Server ou NCache sans modifier le code de la logique métier.
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