Introduction : Pourquoi la mise en cache avancée change tout
\nDans l'architecture moderne à forte charge, la vitesse de réponse et la réduction de la charge sur la base de données sont des enjeux clés. La mise en cache en C# (.NET) n'est plus simplement une mémorisation de résultat : c'est un système complexe de gestion d'état, de durée de vie et de cohérence des données. À un niveau avancé, le développeur doit choisir entre Redis, Memcached et les solutions intégrées en fonction du scénario.
\nDans cet article, nous analyserons trois approches principales de mise en cache dans l'écosystème .NET, comparerons leurs performances, leur complexité d'implémentation et les erreurs typiques. Vous apprendrez à configurer un cache distribué avec Redis, à optimiser Memcached pour les fortes charges et quand le IMemoryCache intégré est la meilleure solution.
Mise en cache intégrée dans .NET : IMemoryCache et IDistributedCache
\nIMemoryCache — cache local rapide
\nLe cache intégré IMemoryCache de l'espace de noms Microsoft.Extensions.Caching.Memory est la solution idéale pour une instance unique d'application. Il stocke les données dans la mémoire vive du processus, offrant une latence minimale.
// Enregistrement dans Startup.cs ou Program.cs\nbuilder.Services.AddMemoryCache();\n\n// Utilisation dans un service\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 if (!_cache.TryGetValue(cacheKey, out Product product))\n {\n product = await _repository.GetProductByIdAsync(id);\n var cacheEntryOptions = new MemoryCacheEntryOptions()\n .SetAbsoluteExpiration(TimeSpan.FromMinutes(5))\n .SetSlidingExpiration(TimeSpan.FromMinutes(1))\n .SetPriority(CacheItemPriority.High);\n\n _cache.Set(cacheKey, product, cacheEntryOptions);\n }\n return product;\n }\n}\n\nAvantages : latence réseau nulle, configuration simple, prise en charge de l'expiration glissante et absolue.
\nInconvénients : ne fonctionne pas lors de la mise à l'échelle sur plusieurs serveurs ; limité par la RAM du processus.
\n\nIDistributedCache — abstraction pour les caches distribués
\nL'interface IDistributedCache permet de basculer facilement entre Redis, SQL Server ou NCache sans modifier la logique métier. L'implémentation par défaut est MemoryDistributedCache (locale), mais pour la production, on choisit généralement Redis.
// Enregistrement de l'implémentation Redis\nbuilder.Services.AddStackExchangeRedisCache(options =>\n{\n options.Configuration = "localhost:6379";\n options.InstanceName = "SampleInstance";\n});\n\n// Utilisation\npublic async Task SetCacheAsync(string key, byte[] data)\n{\n var cache = context.RequestServices.GetRequiredService<IDistributedCache>();\n await cache.SetAsync(key, data, new DistributedCacheEntryOptions\n {\n AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(1)\n });\n}\n\nL'avantage clé est l'unification : vous écrivez le code une fois, et le fournisseur de cache change via la configuration.
\n\nRedis en C# : techniques et modèles avancés
\nConnexion et pool de connexions
\nPour travailler avec Redis dans .NET, on utilise la bibliothèque StackExchange.Redis. Au lieu de créer une nouvelle connexion à chaque fois, utilisez le multiplexage — une seule connexion pour toute l'application.
\n// Singleton global\npublic static ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379,abortConnect=false");\n\n// Obtention de la base de données\nIDatabase db = redis.GetDatabase(0);\n\n// Opérations de base\nawait db.StringSetAsync("user:1", "John Doe", TimeSpan.FromMinutes(30));\nstring name = await db.StringGetAsync("user:1");\n\n
Blogs
Book Recommendations
Lire aussi
Travailler avec JSON en TypeScript : analyse et sérialisation des données
dyld: Library not loaded: @rpath/libswiftCore.dylib : comment vaincre l'erreur
Déploiement d'une application Go sur Kubernetes : guide de base
Programmation asynchrone en Go : guide complet avec exemples
Rust Roadmap 2025 : de zéro à la production en 6 mois