Azure Cache for Redis

Les applications et les services web constituent aujourd’hui le cœur de toute entreprise, de sorte que même les petites entreprises possèdent leur propre site ou application mobile. La latence que les utilisateurs rencontrent pour obtenir des données a un impact profond sur leur impression d’utiliser votre solution, surtout si l’objectif du site est de vendre des biens. De plus, un temps de chargement de page prolongé a également des implications sur le SEO (optimisation pour les moteurs de recherche) et peut réduire davantage le trafic. Les mécanismes de mise en cache ont été créés pour aider à éliminer de tels problèmes. Ils peuvent également être utilisés pour réduire les requêtes inutiles vers la couche de données en stockant les données calculées en mémoire afin que les requêtes futures soient traitées immédiatement et que la consommation de telles ressources, par exemple la mémoire, soit réduite. Pour les services à fort trafic, l’utilisation du mécanisme de mise en cache est devenue indispensable.

Redis est l’un des systèmes de stockage de données en mémoire les plus populaires. Dans cet article, nous fournirons aux lecteurs un aperçu général de ce qu’est Redis, comment il peut être utilisé, et nous examinerons également Azure Cache for Redis et des exemples de base pour commencer à l’utiliser. Alors, examinons toutes ces questions une par une.

Introduction à Redis

Comme mentionné dans la documentation officielle, Redis (qui, soit dit en passant, signifie Remote Dictionary Server) est un système de structures de données en mémoire open-source (sous licence BSD), utilisé comme base de données, cache et courtier de messages.

Essentiellement, Redis est similaire à un magasin clé-valeur. La différence réside dans le fait que dans les magasins clé-valeur traditionnels, vous associaiez des clés de chaîne à des valeurs de chaîne, tandis que Redis prend en charge des structures de données plus complexes telles que les chaînes, les hachages, les listes, les ensembles, les ensembles triés avec requêtes de plage, les bitmaps, les HyperLogLogs, les index géospatiaux avec requêtes de rayon et les flux. Toutes les clés sont binaires, vous pouvez donc utiliser n’importe quelle séquence binaire comme clé, d’une chaîne au contenu d’un fichier JPEG. La prise en charge de cet large éventail de types de données complexes est la principale différence entre Redis et les autres bases de données clé-valeur.

Redis est également extrêmement rapide. C’est l’une des raisons pour lesquelles il est utilisé pour des solutions avec des données changeant rapidement et fréquemment accédées. Parfois, pour cette raison, Redis est utilisé comme base de données primaire alternative et certains développeurs le trouvent être une bonne solution. Malgré cela, vous devez vous souvenir que si votre serveur tombe en panne, vous perdez tout ce qui était en mémoire, et c’est l’argument principal pour l’utiliser comme stockage transitoire.

Comme mentionné ci-dessus, Redis est riche en fonctionnalités et utilisé non seulement comme stockage, mais aussi dans un certain nombre d’autres cas d’utilisation, qui sont listés ci-dessous avec une courte explication :

  • Mise en cache des sessions utilisateur. Stocker beaucoup de données dans les cookies a un impact négatif sur les performances. Au lieu de cela, vous pouvez utiliser la mise en cache en mémoire.
  • Redis Pub/Sub. Il est disponible depuis la version 2.0 et implémente le paradigme de messagerie Publish/Subscribe avec une plus grande évolutivité grâce à la séparation des abonnés des éditeurs. Ils ne savent en fait rien l’un de l’autre : les éditeurs publient des messages dans les canaux et les abonnés reçoivent les messages qui les intéressent.
  • Files d’attente. Deux types de files d’attente permettent d’exécuter des tâches dans un ordre particulier ou de planifier leur exécution.
  • Compteurs. Le nom parle de lui-même. Vous pouvez créer des compteurs nommés, chacun pouvant stocker les 120 derniers échantillons à diverses précisions temporelles (comme 1 seconde, 5 secondes, 1 minute, etc.), et qui peuvent être utilisés pour l’analyse en temps réel.
  • Il prend en charge l’exécution d’un lot de commandes comme une seule opération sous forme de transactions distribuées.
  • Prend en charge la création de vos propres extensions scriptées à la base de données Redis, à l’aide de l’interpréteur Lua intégré à Redis depuis la version 2.6.0.
  • Il permet de créer des clés avec un temps de vie limité. Après l’expiration du délai d’attente, une telle clé sera automatiquement supprimée.
  • Redis Sentinel assure la haute disponibilité de Redis, donc en l’utilisant, on peut créer un déploiement Redis qui résiste sans intervention humaine à certains types de pannes.

Redis peut être utilisé dans de nombreux domaines tels que les jeux, l’Ad-Tech, les services financiers, la santé et l’IoT. En fait, il a déjà été utilisé avec succès par de nombreuses entreprises bien connues, telles que Twitter, GitHub, Weibo, Pinterest, Snapchat, Craigslist, Digg, Stack Exchange, Flickr, et bien d’autres. Le but de l’utilisation varie d’une entreprise à l’autre. Certaines d’entre elles emploient Redis pour son usage prévu, par exemple, GitHub l’utilise comme un magasin clé/valeur persistant pour les informations de routage et diverses autres données. Stack Exchange l’utilise comme niveau de cache. Flickr trouve les Listes Redis très utiles et tous les événements, chargements et mises à jour via le système de tâches sont placés dans une file d’attente sous forme de liste Redis. Digg utilise la fonctionnalité de compteurs pour les compteurs d’événements de page cumulatifs. Et ce ne sont là que quelques exemples. Sur techstacks.io, vous pouvez trouver une énorme liste d’entreprises qui utilisent Redis. La popularité de Redis ne cesse de croître rapidement et le nombre d’entreprises augmente également.

Azure Cache for Redis

De plus en plus d’entreprises se tournent vers les services cloud. Il existe de nombreuses grandes et petites entreprises dans le monde qui s’appuient sur Microsoft Azure pour exécuter leurs applications. L’une des fonctionnalités proposées est Azure Cache for Redis – un service de cache dédié et sécurisé de Microsoft. Il est basé sur Redis et peut être utilisé de la même manière. Comme mentionné dans la documentation officielle, il existe de nombreuses situations où Azure Cache for Redis peut être utile et elles sont fondamentalement proches des cas d’utilisation de Redis. Ce service est disponible en trois niveaux, vous pouvez donc choisir celui qui convient le mieux à votre entreprise pour le moment. Il n’offre pas de niveau de prix gratuit, et en fait, cela n’a pas de sens, car vous pouvez toujours essayer Redis localement pour comprendre s’il résout vos problèmes ou non, puis passer à Azure.

Azure Cache for Redis offre l’ensemble des fonctionnalités et l’écosystème fournis par Redis d’une part, et l’hébergement fiable et la surveillance de Microsoft d’autre part. Voici un bref aperçu des avantages offerts :

  1. Azure Cache for Redis prend en charge une diversité de langages de programmation comme C, C#, Java, PHP, VCL, Fancy, Io, Lua, Perl, Rust, Go, Scala, Matlab, Python, vous n’êtes donc pas trop limité dans le choix d’un langage de programmation.
  2. Comme la couche de cache et la couche applicative sont séparées, elles peuvent être mises à l’échelle indépendamment, elles ne dépendent pas de la disponibilité l’une de l’autre et cela offre encore plus d’avantages.
  3. Il a la capacité de conserver les données non seulement en mémoire mais aussi dans n’importe quel emplacement de stockage de données persistant. Cela permet aux données d’être disponibles après des événements de défaillance ou de sauvegarder les données et de les déplacer vers une autre instance Redis.
  4. Il utilise l’authentification Redis et prend également en charge le SSL pour sécuriser la communication cache/client.
  5. Le service Microsoft Azure Cache for Redis offre également des fonctionnalités telles que la réplication. Si le cache principal échoue, la réplique devient le principal et en crée et remplit une nouvelle pour lui. Ce processus est automatique et géré par Microsoft Azure.
  6. Comme tous les services Microsoft Azure, Azure Cache for Redis permet de surveiller l’état du service, les métriques d’utilisation, les performances du cache, de configurer différents types d’alertes, etc.
  7. Vous pouvez même planifier une fenêtre de maintenance pour votre cache. Lorsqu’elle est spécifiée, toutes les mises à jour du serveur Redis sont effectuées pendant cette fenêtre.
  8. Vous pouvez importer ou exporter des données vers/depuis Azure Cache for Redis, ce qui est très utile lorsque vous avez besoin de pré-remplir des données ou de migrer entre des instances. Ces opérations manipulent des fichiers RDB, qui sont entièrement compatibles avec Redis. Par conséquent, vous pouvez exporter des données de n’importe quel serveur Redis, où qu’il fonctionne, ou vous pouvez migrer vers n’importe quel autre serveur sans perte de données.

La combinaison des fonctionnalités de Redis avec un hébergement fiable et un large ensemble d’outils de Microsoft attire un grand nombre d’entreprises. Alaska Airlines, SiriusIQ, Stackify, Tata Consultancy Services et bien d’autres choisissent Azure Cache for Redis pour leurs solutions. Leurs domaines d’activité sont très variés, ce qui prouve une fois de plus qu’il peut être appliqué à de nombreux domaines. Maintenant que nous avons examiné les objectifs généraux de l’utilisation de Redis et que nous avons une compréhension de base, allons plus loin et fournissons un guide rapide sur la façon de commencer à utiliser Microsoft Azure Cache for Redis avec .NET.

Azure Cache for Redis : Démarrage rapide

En fait, commencer avec Azure Cache for Redis est assez simple. Tout ce dont vous avez besoin est de créer et de configurer un cache, puis de configurer les clients de cache afin qu’ils puissent accéder au cache. Nous examinerons chacune de ces étapes pour vous donner une vision claire du processus.

Créer un cache

Tout d’abord, il convient de préciser que cet article contient de nombreux détails qui intéresseront davantage les débutants.

Initialement, créez un compte si vous n’en avez pas, et connectez-vous au portail Azure. Si vous le connaissez déjà, vous pouvez sauter l’explication suivante, sinon voici les étapes pour créer le service Azure Cache for Redis :

  1. Cliquez sur le bouton “Créer une ressource” dans le coin supérieur gauche ;
  2. Recherchez “Azure Cache for Redis” et cliquez sur le bouton “Créer” ;
  3. Remplissez les champs suivants :
    1. Nom DNS – nom du cache ;
    2. Abonnement ;
    3. Groupe de ressources ;
    4. Emplacement. Vous devriez le choisir avec soin si vous créez le service pour un projet existant, une région devrait être proche des autres services qui utiliseront le cache ;
    5. Niveau tarifaire. Le niveau tarifaire détermine la taille, les performances et les fonctionnalités disponibles pour le cache. Le niveau Premium offre un ensemble plus large d’options, par exemple, il vous permet de configurer un cluster Redis, un réseau virtuel, etc., mais comme nous examinons un exemple d’utilisation de base, nous n’examinerons pas ces options ;
    6. “Activer le port non SSL (6379)” – il est fortement recommandé de ne pas utiliser cette option car, dans ce cas, les clés d’accès sont envoyées via TCP en texte clair et peuvent compromettre l’accès à votre cache.

Après la création du service, sa page de présentation doit devenir disponible, où vous pouvez trouver le nom d’hôte, les informations d’utilisation, les informations de charge du serveur, les journaux d’activité, les clés et de nombreuses autres informations utiles. L’étape suivante consiste à créer le projet et à le configurer pour utiliser Azure Cache for Redis.

Configuration du projet et du client de cache

Vous pouvez utiliser ce service dans différents types de projets, même le tester via l’outil en ligne de commande Redis. Dans notre article, nous examinerons un exemple d’utilisation dans une application web ASP.NET Core. Nous allons créer un projet .NET Core à partir de zéro pour couvrir toutes les étapes nécessaires pour commencer. Pour cela, procédez comme suit :

  1. Ouvrez Visual Studio ;
  2. Cliquez sur l’option de menu “Fichier”, puis sélectionnez “Nouveau” et “Projet” ;
  3. Choisissez le type “Application Web ASP.NET Core” ;
  4. Entrez le nom du projet (pour cet exemple, ce sera “AzureRedisIntro”), son emplacement et cliquez sur “OK” ;
  5. Dans l’exemple, nous utiliserons ASP.NET Core 2.2, choisissez-le donc dans la liste déroulante ;
  6. Sélectionnez le modèle “API” dans la liste.

Voici des captures d’écran de l’étape de création du projet :

Puisque nous utilisons .NET Core, nous devons installer le package “Microsoft.Extensions.Caching.Redis.Core” via le gestionnaire de packages NuGet. Pour ce faire, faites simplement un clic droit sur le nom du projet, sélectionnez “Gérer les packages NuGet…”, basculez vers l’onglet “Parcourir” et recherchez-le.

Pour vous connecter au service Redis créé, nous devons copier la “Chaîne de connexion principale” dans le fichier de configuration. Vous la trouverez sur la page de présentation du service en cliquant sur la section “Clés d’accès” dans le volet de navigation. Le fichier de configuration devrait donc ressembler à ceci à la fin :

{
      "Logging": {
          "LogLevel": {
              "Default": "Warning"
          }
      },
      "AllowedHosts": "*",
      "CacheConnection": "[Chaîne de connexion principale]"
  }

Après ces préparations de base, nous devons configurer l’accès au service Redis du cache. Pour ce faire, vous devez ajouter la méthode `AddDistributedRedisCache` à la classe Startup.cs. Cette méthode permet d’utiliser RedisCache via l’injection de dépendances dans chaque partie du code qui attend un objet instance implémentant l’interface IDistributedCache. Voici le contenu complet du fichier “Startup.cs” :

using Microsoft.AspNetCore.Builder;
  using Microsoft.AspNetCore.Hosting;
  using Microsoft.AspNetCore.Mvc;
  using Microsoft.Extensions.Configuration;
  using Microsoft.Extensions.DependencyInjection;

  namespace AzureRedisIntro {
      public class Startup {
          public static string CacheConnection = "";

              public Startup(IHostingEnvironment env) {
                  var builder = new ConfigurationBuilder()
                  .SetBasePath(env.ContentRootPath)
                  .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                  .AddEnvironmentVariables();
                  Configuration = builder.Build();

                  CacheConnection = Configuration.GetConnectionString("CacheConnection");
              }

              public IConfiguration Configuration { get; }

              // This method gets called by the runtime. Use this method to add services to the container.
              public void ConfigureServices(IServiceCollection services) {
                  services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

                  services.AddDistributedRedisCache(options => {
                      options.Configuration = Configuration.GetConnectionString("CacheConnection");
                      options.InstanceName = "RedisIntro"; // Your DNS Name
                  });
              }

              // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
              public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
                  if (env.IsDevelopment()) {
                      app.UseDeveloperExceptionPage();
                  }
                  else {
                      // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                      app.UseHsts();
                  }

                  app.UseHttpsRedirection();
                  app.UseMvc();
              }
          }
      }
  }

Utilisation du service Azure Cache for Redis

Azure Cache for Redis peut mettre en cache des objets .NET sérialisés ou des types de données primitifs. Pour la sérialisation, vous pouvez choisir n’importe quel sérialiseur qui vous convient le mieux, et dans cet article, nous utiliserons le package le plus courant, Newtonsoft.Json. Il devrait déjà être installé si vous avez répété toutes les étapes décrites.

Pour notre exemple assez simple, nous créons un modèle pour examiner un peu le stockage d’objets .NET sérialisés dans le cache. Pour ce faire, créez simplement un nouveau dossier “Models” et ajoutez-y le fichier “Book.cs”, qui est indiqué ci-dessous :

using System;

  namespace AzureRedisIntro.Models {
      public class Book {
          public Guid ID { get; set; }
          public string Name { get; set; }
          public string Description { get; set; }
      }
  }

Le modèle est assez petit et propre, il n’y a donc pas de commentaires ou d’explications fournies, et nous passons au contrôleur. Après avoir créé le projet à partir d’un modèle, vous devriez déjà avoir un contrôleur, dans notre cas nommé “ValuesController”. Remplacez-le par le code suivant :

using AzureRedisIntro.Models;
  using Microsoft.AspNetCore.Authorization;
  using Microsoft.AspNetCore.Mvc;
  using Microsoft.Extensions.Caching.Distributed;
  using Newtonsoft.Json;
  using System;

  namespace AzureRedisIntro.Controllers {
      [Route("api/[controller]")]
      [AllowAnonymous]
      public class ValuesController : Controller {
          private IDistributedCache _cache;

          public ValuesController(IDistributedCache cache) {
              _cache = cache;
          }

          [HttpGet("[action]")]
          public object GetCacheValue(Guid bookID) {
              if (bookID == Guid.Empty)
              return BadRequest("Incorrect identifier.");

              return JsonConvert.DeserializeObject(_cache.GetString(bookID.ToString()));
          }

          [HttpPost("[action]")]
          public object SetCacheValue([FromBody]Book model) {
              if (model == null)
              return BadRequest("Model is empty.");
              Book book = new Book() {
                  Description = model.Description,
                  Name = model.Name,
                  ID = model.ID
              };
              _cache.SetString(book.ID.ToString(), JsonConvert.SerializeObject(book));

              return Ok();
          }
      }
  }

 

Examinons chaque partie du code pour mieux comprendre le processus. Nous avons mentionné l’interface IDistributedCache auparavant, donc son rôle devrait être clair pour l’instant, nous examinons simplement les méthodes fournies :

  • Get, GetAsync – accepte une clé de chaîne et récupère un élément mis en cache sous forme de tableau d’octets s’il est trouvé dans le cache ;
  • Set, SetAsync – ajoute un élément (sous forme de tableau d’octets) au cache à l’aide d’une clé de chaîne ;
  • Refresh, RefreshAsync – actualise un élément dans le cache en fonction de sa clé, en réinitialisant son délai d’expiration glissant (le cas échéant) ;
  • Remove, RemoveAsync – supprime un élément du cache en fonction de sa clé de chaîne.

Dans l’exemple, via les méthodes “GetCacheValue” et “SetCacheValue”, nous avons montré l’utilisation des deux premières de la liste (et, comme vous pouvez le voir, les variantes synchrones). Après avoir exécuté un exemple, ces méthodes devraient retourner les résultats suivants :

Méthode SetCacheValue

Méthode GetCacheValue

Comme vous pouvez le constater après ces brèves revues, tout est assez simple, et Azure Cache for Redis est un service vraiment facile à utiliser et à démarrer.

En résumé

Dans cet article, nous avons tenté de donner un aperçu général de Redis et d’Azure Cache for Redis, de montrer les avantages et les cas d’utilisation fournis. La plupart des informations doivent être utiles aux débutants, ou aux personnes intéressées par certains détails d’utilisation. Nous espérons que cet article a donné un point de départ aux débutants et a inspiré d’autres à apprendre quelque chose de nouveau à ce sujet ou même à commencer à l’utiliser.