Lorsque l'on commence à traiter le sujet des performances sur une API, on en vient rapidement à l'idée d'utiliser un cache afin d'optimiser l'accès aux données, par exemple en évitant de systématiquement attaquer la base de données.

Un type de cache extrêmement simple à mettre en place est le cache local (en opposition au cache distribué) qui consiste simplement à stocker en mémoire, directement sur le process de l'API, les différents éléments.

Ce type de cache est à utiliser pour stocker des données de référentiel en lecture seule, qui changent peu. Une considération importante à prendre en compte si vous êtes sur du multi-instances est que chaque instance aura son propre cache local (au contraire du cache distribué). Attention donc aux problématiques de synchronisations, d'invalidations, etc.

Voyons ensemble comment mettre en place un cache local sur une API ASPNET Core.

Enregistrement du IMemoryCache

Microsoft propose l'interface IMemoryCache, disponible via le Nuget Microsoft.Extensions.Caching.Memory, représentant un cache mémoire et que l'on va utiliser comme cache local. L'avantage de ce Nuget est qu'il fonctionne nativement avec l'injection d'ASPNET Core.

Pour enregistrer le cache mémoire sur votre API, il suffit d'ajouter la ligne suivant dans la méthode ConfigureServices de la classe Startup:

 services.AddMemoryCache();

Utilisation du cache mémoire

A partir de là, vous pouvez injecter l'interface IMemoryCache n'importe où afin d'accéder à votre cache mémoire. L'utilisation se fait alors très simplement, en appelant par exemple la méthode GetOrCreateAsync :

public class MyController 
{
  private readonly IMemoryCache memoryCache;

  public MyController(IMemoryCache memoryCache)
  {
    this.memoryCache = memoryCache;
  }

  [HttpGet]
  public async Task<ActionResult> GetData()
  {
    var data = await this.memoryCache.GetOrCreateAsync("mycachekey", entry => {
      entry.SlidingExpiration = TimeSpan.FromMinutes(30);
      return [...];
    });

    return this.Ok(data);
  }
}

Si la clef de cache existe, la valeur stockée sera retournée (évitant ainsi un appel à la base de données), sinon la fonction passée en paramètre sera appelée, et la valeur retournée sera stockée en cache pour la durée configurée (30min dans l'exemple précédent).

Et voilà rien de plus compliqué. Nous verrons dans deux prochains articles comment hydrater le cache au démarrage de l'API et comment le mettre à jour avant son expiration pour garantir des données fraîches tout le temps.

Bonne mise en cache !

Si cet article t'a plu, n'hésites pas à partager , et si tu as des questions / remarques, n'hésites pas à me contacter