Mise en cache en C# (.NET) : Redis, MemoryCache et alternatives
La mise en cache est l'un des outils clés pour améliorer les performances des applications en C# (.NET). Elle permet de réduire le temps de réponse, de diminuer la charge sur les bases de données et de réduire les coûts d'infrastructure. Dans cet article, nous analyserons les mécanismes intégrés de .NET, les implémentations populaires basées sur Redis, ainsi que des solutions alternatives comme NCache et Couchbase.
1. Mise en cache intégrée : MemoryCache
MemoryCache (espace de noms Microsoft.Extensions.Caching.Memory) est un cache simple et rapide qui stocke les données dans la mémoire vive d'un seul processus. Il est idéal pour les applications monothread ou les serveurs web avec une seule instance.
Installation et connexion
dotnet add package Microsoft.Extensions.Caching.MemoryExemple d'utilisation de base
using Microsoft.Extensions.Caching.Memory;
public class DataService{ private readonly IMemoryCache _cache; private readonly TimeSpan _cacheDuration = TimeSpan.FromMinutes(5);
public DataService(IMemoryCache cache) => _cache = cache;
public async Task<string> GetDataAsync(string key) { if (!_cache.TryGetValue(key, out string cachedData)) { cachedData = await FetchFromDatabaseAsync(key); _cache.Set(key, cachedData, new MemoryCacheEntryOptions { AbsoluteExpirationRelativeToNow = _cacheDuration }); } return cachedData; }}Avantages et inconvénients
- + Simplicité, latence réseau nulle.
- + Prise en charge intégrée de l'expiration (absolue/glissante).
- - Ne fonctionne pas lors de la mise à l'échelle sur plusieurs serveurs.
- - Le cache est vidé lors du redémarrage de l'application.
2. Mise en cache distribuée : Redis
Redis est le choix le plus populaire pour la mise en cache distribuée dans l'écosystème .NET. Il fonctionne comme un service séparé, accessible à toutes les instances de l'application. Dans .NET, l'abstraction IDistributedCache est utilisée.
Installation du package
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedisConfiguration dans Program.cs
builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = "localhost:6379"; options.InstanceName = "MyAppCache";});Exemple de travail avec IDistributedCache
public class RedisCacheService{ private readonly IDistributedCache _cache;
public RedisCacheService(IDistributedCache cache) => _cache = cache;
public async Task SetAsync(string key, byte[] data, int minutes = 10) { await _cache.SetAsync(key, data, new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(minutes) }); }
public async Task<byte[]> GetAsync(string key) { return await _cache.GetAsync(key); }}Fonctionnalités avancées de Redis
- Sérialisation d'objets : utilisez
System.Text.JsonouNewtonsoft.Json. - Invalidation par balises : les bibliothèques tierces (par exemple,
EasyCaching.Redis) permettent de regrouper les entrées. - Pub/Sub : pour les notifications de modifications du cache.
3. Alternatives à Redis
3.1 NCache
NCache est une solution commerciale (avec une version gratuite) prenant en charge .NET. Elle offre des fonctionnalités avancées : synchronisation entre nœuds, requêtes de type SQL sur le cache, mise en cache des sessions ASP.NET.
- + Prise en charge intégrée de
IDist
Aussi dans la bibliothèque
Générateur de QR codes en PHP : bibliothèque phpqrcode et alternatives
Bibliothèque WebSocket Kotlin : Ktor WebSocket Client et Server
Validation des données en Rust : bibliothèques et approches pour un code fiable
Client Elasticsearch pour PHP : elasticsearch-php — guide complet