Mise en cache en C# (.NET) : Redis, MemoryCache et autres outils
Dans les applications modernes à forte charge en C# (.NET), la mise en cache est l'un des mécanismes clés pour améliorer les performances et réduire la charge sur les bases de données. Dans cet article, nous examinerons en détail les principaux outils de mise en cache dans l'écosystème .NET : le MemoryCache intégré, le cache distribué basé sur Redis via la bibliothèque StackExchange.Redis, ainsi que l'abstraction IDistributedCache.
1. Mise en cache intégrée : MemoryCache
MemoryCache (espace de noms Microsoft.Extensions.Caching.Memory) est le moyen le plus simple de mettre en cache des données directement dans la mémoire vive du processus. Idéal pour les applications monoprocessus (par exemple, ASP.NET Core sans mise à l'échelle).
Exemple d'utilisation de base :
using Microsoft.Extensions.Caching.Memory;
// Création du cacheIMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
// Écriture dans le cache avec une durée de vie de 5 minutescache.Set("user:123", new User { Id = 123, Name = "Ivan" }, TimeSpan.FromMinutes(5));
// Lecture depuis le cacheif (cache.TryGetValue("user:123", out User user)){ Console.WriteLine($"Utilisateur : {user.Name}");}else{ Console.WriteLine("Cache vide, chargement depuis la BD...");}Avantages : vitesse maximale, latence réseau nulle, configuration simple.
Inconvénients : les données ne vivent que dans un seul processus, elles sont perdues lors du redémarrage de l'application.
2. Mise en cache distribuée : Redis + StackExchange.Redis
Pour les systèmes distribués (plusieurs serveurs, microservices), un cache externe est nécessaire. Redis est le choix le plus populaire. La bibliothèque principale pour travailler avec Redis en .NET est StackExchange.Redis (plus de 6 000 étoiles sur GitHub).
Installation :
dotnet add package StackExchange.RedisExemple de travail avec Redis :
using StackExchange.Redis;
// Connexion à RedisConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();
// Écriture d'une chaîne avec TTL (durée de vie)db.StringSet("session:token123", "user_data_here", TimeSpan.FromHours(1));
// Lecturestring data = db.StringGet("session:token123");if (!string.IsNullOrEmpty(data)){ Console.WriteLine($"Données du cache : {data}");}
// Mise en cache d'objets complexes (sérialisation en JSON)var product = new Product { Id = 1, Name = "Ordinateur portable", Price = 75000 };string json = System.Text.Json.JsonSerializer.Serialize(product);db.StringSet("product:1", json, TimeSpan.FromMinutes(10));
// Désérialisation lors de la lecturestring cachedJson = db.StringGet("product:1");var cachedProduct = System.Text.Json.JsonSerializer.Deserialize<Product>(cachedJson);Fonctionnalités supplémentaires de Redis :
- Hashes — pour stocker des objets avec des champs (par exemple, profil utilisateur).
- Listes et ensembles — pour les files d'attente, les classements.
- Pub/Sub — pour les notifications d'invalidation du cache.
- Scripts Lua — opérations atomiques.
3. Abstraction IDistributedCache
Microsoft fournit l'interface IDistributedCache (package Microsoft.Extensions.Caching.Abstractions), qui permet de basculer entre différentes implémentations de cache sans modifier le code de l'application.
Implémentations :
MemoryDistributedCache— pour le développement et les tests (stocke en mémoire).RedisCache(packageMicrosoft.Extensions.Caching.StackExchangeRedis) — pour la production.SqlServerCache
Aussi dans la bibliothèque
ORM pour C++ : comparaison et exemples d'utilisation (ODB, SOCI, SQLiteCpp)
Autorisation et authentification en Kotlin : Ktor, JWT et Spring Security
Traitement et édition d'images en TypeScript : Jimp, Sharp, Canvas
GraphQL pour Swift : Apollo iOS — client pour iOS et macOS