Tutoriel : créer un cache d’écriture différée à l’aide d’Azure Functions et d’Azure Cache pour Redis

L’objectif de ce tutoriel est d’utiliser une instance Azure Cache pour Redis comme cache d’écriture différée. Le modèle d’écriture différée de ce tutoriel montre comment les écritures dans le déclencheur de cache correspondant écrivent dans une base de données SQL (une instance du service Azure SQL Database).

Vous utilisez le déclencheur Redis pour Azure Functions pour implémenter cette fonctionnalité. Dans ce scénario, vous voyez comment utiliser Azure Cache pour Redis pour stocker des informations d’inventaire et de tarification, lors de la sauvegarde de ces informations dans une base de données SQL.

Chaque nouvel élément ou nouveau prix écrit dans le cache est ensuite répercuté dans une table SQL de la base de données.

Dans ce tutoriel, vous allez apprendre à :

  • Configurez une base de données, un déclencheur et des chaînes de connexion.
  • Vérifiez que les déclencheurs fonctionnent.
  • Déployez du code sur une application de fonction.

Prérequis

Créer et configurer une nouvelle base de données SQL

La base de données SQL est la base de données de stockage de cet exemple. Vous pouvez créer une base de données SQL via le portail Azure ou par le biais de votre méthode d’automatisation préférée.

Pour plus d’informations sur la création d’une base de données SQL, consultez Démarrage rapide : Créer une base de données unique – base de données Azure SQL.

Cet exemple utilise le portail :

  1. Entrez un nom de base de données et sélectionnez Créer pour créer un serveur qui contiendra la base de données.

    Capture d’écran de la création d’une ressource Azure SQL.

  2. Sélectionnez Utiliser l’authentification SQL et entrez un identifiant d’administrateur et le mot de passe correspondant. Veillez à vous souvenir de ces informations d'identification ou à les écrire. Quand vous déployez un serveur en production, utilisez plutôt l’authentification Microsoft Entra.

    Capture d’écran des informations d’authentification pour une ressource Azure SQL.

  3. Accédez à l’onglet Mise en réseau, puis choisissez Point de terminaison public comme méthode de connexion. Sélectionnez Oui pour les deux règles de pare-feu qui s’affichent. Ce point de terminaison autorise l’accès à partir de votre application de fonction Azure.

    Capture d’écran des paramètres de mise en réseau d’une ressource Azure SQL.

  4. Une fois la validation terminée, sélectionnez Vérifier + créer, puis Créer. La base de données SQL commence à être déployée.

  5. Une fois le déploiement terminé, accédez à la ressource dans le portail Azure, puis sélectionnez l’onglet Éditeur de requête. Créez une table appelée Inventaire qui contient les données que vous allez y écrire. Utilisez la commande SQL suivante pour créer une table comportant deux champs :

    • ItemName répertorie le nom de chaque article.
    • Price stocke le prix de l’article.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Capture d’écran montrant la création d’une table dans l’Éditeur Power Query d’une ressource Azure SQL.

  6. Une fois l’exécution de cette commande terminée, développez le dossier Tables et vérifiez que la table a été créée.

Configurer le déclencheur Redis

Tout d’abord, effectuez une copie du même projet VS Code que celui utilisé dans le tutoriel précédent. Copiez le dossier du tutoriel précédent sous un nouveau nom, par exemple RedisWriteBehindTrigger, puis ouvrez-le dans VS Code.

Ensuite, supprimez les fichiers RedisBindings.cs et RedisTriggers.cs.

Dans cet exemple, nous allons utiliser le déclencheur pub/sub pour déclencher les notifications keyevent. Les objectifs de l’exemple sont les suivants :

  • Déclencher chaque fois qu’un événement SET se produit. Un événement SET se produit lorsque de nouvelles clés sont écrites dans l’instance de cache ou que la valeur d’une clé est modifiée.
  • Une fois qu’un événement SET est déclenché, accédez à l’instance de cache pour trouver la valeur de la nouvelle clé.
  • Déterminez si la clé existe déjà dans la table Inventaire de la base de données SQL.
    • Si c’est le cas, mettez à jour la valeur de cette clé.
    • Si ce n’est pas le cas, écrivez une nouvelle ligne avec la clé et sa valeur.

Pour configurer le déclencheur :

  1. Importez le package NuGet System.Data.SqlClient pour activer la communication avec la base de données SQL. Accédez au terminal VS Code et utilisez la commande suivante :

      dotnet add package System.Data.SqlClient
    
  2. Créez un fichier appelé RedisFunction.cs. Vérifiez que vous avez supprimé les fichiers RedisBindings.cs et RedisTriggers.cs.

  3. Copiez et collez le code suivant dans RedisFunction.cs pour remplacer le code existant :

using Microsoft.Extensions.Logging;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Redis;
using System.Data.SqlClient;

public class WriteBehindDemo
{
    private readonly ILogger<WriteBehindDemo> logger;

    public WriteBehindDemo(ILogger<WriteBehindDemo> logger)
    {
        this.logger = logger;
    }
    
    public string SQLAddress = System.Environment.GetEnvironmentVariable("SQLConnectionString");

    //This example uses the PubSub trigger to listen to key events on the 'set' operation. A Redis Input binding is used to get the value of the key being set.
    [Function("WriteBehind")]
    public void WriteBehind(
        [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:set")] Common.ChannelMessage channelMessage,
        [RedisInput(Common.connectionString, "GET {Message}")] string setValue)
    {
        var key = channelMessage.Message; //The name of the key that was set
        var value = 0.0;

        //Check if the value is a number. If not, log an error and return.
        if (double.TryParse(setValue, out double result))
        {
            value = result; //The value that was set. (i.e. the price.)
            logger.LogInformation($"Key '{channelMessage.Message}' was set to value '{value}'");
        }
        else
        {
            logger.LogInformation($"Invalid input for key '{key}'. A number is expected.");
            return;
        }        

        // Define the name of the table you created and the column names.
        String tableName = "dbo.inventory";
        String column1Value = "ItemName";
        String column2Value = "Price";        
        
        logger.LogInformation($" '{SQLAddress}'");
        using (SqlConnection connection = new SqlConnection(SQLAddress))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand())
                {
                    command.Connection = connection;

                    //Form the SQL query to update the database. In practice, you would want to use a parameterized query to prevent SQL injection attacks.
                    //An example query would be something like "UPDATE dbo.inventory SET Price = 1.75 WHERE ItemName = 'Apple'".
                    command.CommandText = "UPDATE " + tableName + " SET " + column2Value + " = " + value + " WHERE " + column1Value + " = '" + key + "'";
                    int rowsAffected = command.ExecuteNonQuery(); //The query execution returns the number of rows affected by the query. If the key doesn't exist, it will return 0.

                    if (rowsAffected == 0) //If key doesn't exist, add it to the database
                 {
                         //Form the SQL query to update the database. In practice, you would want to use a parameterized query to prevent SQL injection attacks.
                         //An example query would be something like "INSERT INTO dbo.inventory (ItemName, Price) VALUES ('Bread', '2.55')".
                        command.CommandText = "INSERT INTO " + tableName + " (" + column1Value + ", " + column2Value + ") VALUES ('" + key + "', '" + value + "')";
                        command.ExecuteNonQuery();

                        logger.LogInformation($"Item " + key + " has been added to the database with price " + value + "");
                    }

                    else {
                        logger.LogInformation($"Item " + key + " has been updated to price " + value + "");
                    }
                }
                connection.Close();
            }

            //Log the time that the function was executed.
            logger.LogInformation($"C# Redis trigger function executed at: {DateTime.Now}");
    }
}

Important

Cet exemple est simplifié pour le tutoriel. Pour une utilisation en production, nous vous recommandons d’utiliser des requêtes SQL paramétrables pour empêcher les attaques par injection de code SQL.

Configuration des chaînes de connexion

Vous devez mettre à jour le fichier local.settings.json afin d’inclure la chaîne de connexion de votre base de données SQL. Ajouter une entrée à la section Values pour SQLConnectionString. Votre fichier se présente ainsi :

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
    "redisConnectionString": "<redis-connection-string>",
    "SQLConnectionString": "<sql-connection-string>"
  }
}

Pour rechercher la chaîne de connexion Redis, accédez au menu de ressource dans la ressource Azure Cache pour Redis. La chaîne se trouve dans la zone Clés d’accès de Paramètres.

Pour trouver la chaîne de connexion aux bases de données SQL, allez dans le menu des ressources de la base de données SQL. Sous Paramètres, sélectionnez Chaînes de connexion, puis sélectionnez l’onglet ADO.NET. La chaîne se trouve dans la zone ADO.NET (authentification SQL).

Vous devez entrer manuellement le mot de passe de votre chaîne de connexion de base de données SQL, car le mot de passe n’est pas collé automatiquement.

Important

Cet exemple est simplifié pour le tutoriel. Pour une utilisation en production, nous vous recommandons d’utiliser Azure Key Vault pour stocker les informations de chaîne de connexion ou d’utiliser l’authentification Microsoft Entra ID pour SQL.

Créer et exécuter le projet

  1. Dans VS Code, accédez à l’onglet Exécuter et déboguer et exécutez le projet.

  2. Revenez à votre instance Azure Cache pour Redis dans le portail Azure et sélectionnez le bouton Console pour accéder à la console Redis. Essayez d’utiliser des commandes SET :

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. De retour dans VS Code, les déclencheurs sont en cours d’inscription. Pour vérifier que les déclencheurs fonctionnent :

    1. Accédez à la base de données SQL dans le portail Azure.

    2. Dans le menu Ressource, sélectionnez Éditeur de requête.

    3. Pour Nouvelle requête, créez une requête avec la commande SQL suivante pour afficher les 100 premiers éléments de la table d’inventaire :

      SELECT TOP (100) * FROM [dbo].[inventory]
      

      Vérifiez que les éléments écrits dans votre instance Azure Cache pour Redis s’affichent ici.

    Capture d’écran montrant que les informations ont été copiées dans SQL à partir de l’instance de cache.

Déployer le code sur votre application de fonction

Ce tutoriel repose sur le tutoriel précédent. Pour plus d’informations, consultez Déployer du code sur une fonction Azure.

  1. Dans VS Code, accédez à l’onglet Azure.

  2. Recherchez votre abonnement et développez-le. Ensuite, recherchez la section Application de fonction et développez-la.

  3. Sélectionnez et maintenez la touche (ou cliquez avec le bouton droit) sur votre application de fonction, puis sélectionnez Déployer sur l’application de fonction.

Ajouter des informations de chaîne de connexion

Ce tutoriel repose sur le tutoriel précédent. Pour plus d’informations sur redisConnectionString, consultez Ajouter des informations de chaîne de connexion.

  1. Accédez à votre application de fonction dans le portail Azure. Dans le menu des ressources, sélectionnez Variables d’environnement.

  2. Dans le volet Paramètres de l’application, entrez SQLConnectionString comme nouveau champ. Pour Value, entrez votre chaîne de connexion.

  3. Sélectionnez Appliquer.

  4. Accédez au panneau Vue d’ensemble, puis sélectionnez Redémarrer pour redémarrer l’application avec les nouvelles informations de chaîne de connexion.

Vérifier le déploiement

Une fois le déploiement terminé, revenez à votre instance Azure Cache pour Redis et utilisez les commandes SET pour écrire d’autres valeurs. Vérifiez qu’elles apparaissent également dans votre base de données SQL.

Si vous souhaitez confirmer que votre application de fonction fonctionne correctement, accédez à l’application dans le portail et sélectionnez Flux de journal dans le menu Ressource. Vous devez voir les déclencheurs qui s’exécutent à cet emplacement et les mises à jour correspondantes apportées à votre base de données SQL.

Si vous souhaitez effacer la table de base de données SQL sans la supprimer, vous pouvez utiliser la requête SQL suivante :

TRUNCATE TABLE [dbo].[inventory]

Nettoyer les ressources

Si vous souhaitez continuer à utiliser les ressources que vous avez créées dans cet article, conservez le groupe de ressources.

Sinon, si vous avez terminé avec les ressources, vous pouvez supprimer le groupe de ressources Azure que vous avez créé pour éviter les frais.

Important

La suppression d’un groupe de ressources est irréversible. Quand vous supprimez un groupe de ressources, toutes les ressources qu’il contient sont supprimées définitivement. Veillez à ne pas supprimer accidentellement des ressources ou un groupe de ressources incorrects. Si vous avez créé les ressources dans un groupe de ressources existant contenant des ressources que vous souhaitez conserver, vous pouvez supprimer chaque ressource individuellement, au lieu de supprimer l’intégralité du groupe de ressources.

Pour supprimer un groupe de ressources

  1. Connectez-vous au Portail Azure, puis sélectionnez Groupes de ressources.

  2. Recherchez le groupe de ressources à supprimer.

    S’il existe de nombreux groupes de ressources, utilisez la zone Filtrer pour n’importe quel champ..., tapez le nom du groupe de ressources que vous avez créé pour cet article. Sélectionnez le groupe de ressources dans la liste des résultats.

    Capture d’écran montrant une liste de groupes de ressources à supprimer dans le volet de travail.

  3. Sélectionnez Supprimer le groupe de ressources.

  4. Vous êtes invité à confirmer la suppression du groupe de ressources. Saisissez le nom de votre groupe de ressources pour confirmer, puis sélectionnez Supprimer.

    Capture d’écran montrant un formulaire qui demande le nom de la ressource pour confirmer la suppression.

Après quelques instants, le groupe de ressources et toutes ses ressources sont supprimés.

Résumé

Ce tutoriel et Bien démarrer avec les déclencheurs Azure Functions dans Azure Cache pour Redis montrent comment utiliser Azure Cache pour Redis pour déclencher des applications de fonction Azure. Ils montrent également comment utiliser Azure Cache pour Redis comme cache en écriture différée avec Azure SQL Database. L’utilisation d’Azure Cache pour Redis avec Azure Functions est une combinaison puissante qui peut résoudre de nombreux problèmes d’intégration et de performances.