Mise en cache en C# : Redis, Memcached et solutions intégrées de A à Z

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi la mise en cache est un composant critique des applications C#

\n\n

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

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

1. Mise en cache intégrée : MemoryCache et IDistributedCache

\n\n

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

1.1 MemoryCache — cache local pour un seul serveur

\n\n

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

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

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

1.2 IDistributedCache — abstraction pour le cache distribué

\n\n

L'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.

\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

Book Recommendations