Tutoriel : créer un cache d’écriture différée à l’aide d’Azure Functions et d’Azure Redis
L’objectif de ce tutoriel est d’utiliser une instance Azure Managed Redis (préversion) ou Azure Cache pour Redis en tant que cache en écriture-behind. 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 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
- Un abonnement Azure. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit.
- Réalisation du tutoriel précédent, Bien démarrer avec les déclencheurs Azure Functions dans Azure Redis avec ces ressources provisionnées :
- Instance Azure Managed Redis (préversion) ou Azure Cache pour Redis
- Instance Azure Functions
- Une connaissance pratique de l’utilisation de Azure SQL
- Environnement Visual Studio Code (VS Code) configuré avec les packages NuGet installés
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 :
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.
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.
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.
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.
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) );
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énementSET
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 :
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
Créez un fichier appelé RedisFunction.cs. Vérifiez que vous avez supprimé les fichiers RedisBindings.cs et RedisTriggers.cs.
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 des ressources dans la ressource Azure Managed Redis ou Azure Cache pour Redis. Recherchez la chaîne dans la zone Clés d’accès dans le menu Ressource.
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 Azure Microsoft Entra ID pour SQL.
Créer et exécuter le projet
Dans VS Code, accédez à l’onglet Exécuter et déboguer et exécutez le projet.
Revenez à votre instance 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
Important
L’outil console n’est pas encore disponible pour Azure Managed Redis. Envisagez plutôt d’utiliser redis-cli ou un outil comme Redis Insight pour exécuter des commandes directement sur l’instance Redis.
De retour dans VS Code, les déclencheurs sont en cours d’inscription. Pour vérifier que les déclencheurs fonctionnent :
Accédez à la base de données SQL dans le portail Azure.
Dans le menu Ressource, sélectionnez Éditeur de requête.
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 Redis s’affichent ici.
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.
Dans VS Code, accédez à l’onglet Azure.
Recherchez votre abonnement et développez-le. Ensuite, recherchez la section Application de fonction et développez-la.
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.
Accédez à votre application de fonction dans le portail Azure. Dans le menu des ressources, sélectionnez Variables d’environnement.
Dans le volet Paramètres de l’application, entrez SQLConnectionString comme nouveau champ. Pour Value, entrez votre chaîne de connexion.
Sélectionnez Appliquer.
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 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
Connectez-vous au Portail Azure, puis sélectionnez Groupes de ressources.
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.
Sélectionnez Supprimer le groupe de ressources.
Vous êtes invité à confirmer la suppression du groupe de ressources. Saisissez le nom de votre groupe de ressources pour confirmer, puis sélectionnez Supprimer.
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 Redis montrent comment utiliser des déclencheurs et des liaisons Redis dans les applications d’Azure Functions. Ils montrent également comment utiliser Redis comme cache en écriture différée avec Azure SQL Database. L’utilisation d’Azure Managed Redis ou 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.