Zelfstudie: Een write-behind-cache maken met behulp van Azure Functions en Azure Redis
Het doel van deze zelfstudie is het gebruik van een Azure Managed Redis (preview) of Azure Cache voor Redis exemplaar als een write-behind-cache. Het write-behind-patroon in deze zelfstudie laat zien hoe schrijfbewerkingen naar de cachetrigger overeenkomende schrijfbewerkingen naar een SQL-database (een exemplaar van de Azure SQL Database-service).
U gebruikt de Redis-trigger voor Azure Functions om deze functionaliteit te implementeren. In dit scenario ziet u hoe u Redis gebruikt om inventaris- en prijsgegevens op te slaan, terwijl u een back-up maakt van die informatie in een SQL-database.
Elk nieuw item of elke nieuwe prijs die naar de cache wordt geschreven, wordt vervolgens weergegeven in een SQL-tabel in de database.
In deze zelfstudie leert u het volgende:
- Configureer een database, trigger en verbindingsreeks s.
- Controleer of triggers werken.
- Code implementeren in een functie-app.
Vereisten
- Een Azure-abonnement. Als u nog geen Azure-abonnement hebt, maakt u een gratis account.
- Voltooiing van de vorige zelfstudie, Aan de slag met Azure Functions-triggers in Azure Redis, met de volgende resources ingericht:
- Een azure Managed Redis (preview) of Azure Cache voor Redis-exemplaar
- Azure Functions-exemplaar
- Een werkende kennis van het gebruik van Azure SQL
- Visual Studio Code-omgeving (VS Code) ingesteld met NuGet-pakketten geïnstalleerd
Een nieuwe SQL-database maken en configureren
De SQL-database is de back-updatabase voor dit voorbeeld. U kunt een SQL-database maken via Azure Portal of via uw voorkeursmethode voor automatisering.
In dit voorbeeld wordt de portal gebruikt:
Voer een databasenaam in en selecteer Nieuwe maken om een nieuwe server te maken voor de database.
Selecteer SQL-verificatie gebruiken en voer een aanmeldings- en wachtwoord voor een beheerder in. Vergeet deze referenties niet of noteer ze. Wanneer u een server in productie implementeert, gebruikt u in plaats daarvan Microsoft Entra-verificatie.
Ga naar het tabblad Netwerken en kies Openbaar eindpunt als verbindingsmethode. Selecteer Ja voor beide firewallregels die worden weergegeven. Dit eindpunt biedt toegang vanuit uw Azure-functie-app.
Nadat de validatie is voltooid, selecteert u Beoordelen en maken en vervolgens Maken. De SQL-database wordt geïmplementeerd.
Nadat de implementatie is voltooid, gaat u naar de resource in Azure Portal en selecteert u het tabblad Query-editor . Maak een nieuwe tabel met de naam Inventaris waarin de gegevens worden opgeslagen die u ernaar schrijft. Gebruik de volgende SQL-opdracht om een nieuwe tabel met twee velden te maken:
ItemName
geeft de naam van elk item weer.Price
slaat de prijs van het artikel op.
CREATE TABLE inventory ( ItemName varchar(255), Price decimal(18,2) );
Nadat de opdracht is uitgevoerd, vouwt u de map Tabellen uit en controleert u of de nieuwe tabel is gemaakt.
De Redis-trigger configureren
Maak eerst een kopie van hetzelfde VS Code-project dat u in de vorige zelfstudie hebt gebruikt. Kopieer de map uit de vorige zelfstudie onder een nieuwe naam, zoals RedisWriteBehindTrigger, en open deze in VS Code.
Verwijder vervolgens de RedisBindings.cs- en RedisTriggers.cs-bestanden.
In dit voorbeeld gebruikt u de pub/subtrigger om meldingen te activeren keyevent
. De doelstellingen van het voorbeeld zijn:
- Elke keer dat een
SET
gebeurtenis plaatsvindt, activeren. EenSET
gebeurtenis treedt op wanneer nieuwe sleutels naar het cache-exemplaar worden geschreven of de waarde van een sleutel wordt gewijzigd. - Nadat een
SET
gebeurtenis is geactiveerd, opent u het cache-exemplaar om de waarde van de nieuwe sleutel te vinden. - Bepaal of de sleutel al bestaat in de inventaristabel in de SQL-database.
- Zo ja, werk de waarde van die sleutel bij.
- Zo niet, schrijf dan een nieuwe rij met de sleutel en de bijbehorende waarde.
De trigger configureren:
Importeer het
System.Data.SqlClient
NuGet-pakket om communicatie met de SQL-database mogelijk te maken. Ga naar de VS Code-terminal en gebruik de volgende opdracht:dotnet add package System.Data.SqlClient
Maak een nieuw bestand met de naam RedisFunction.cs. Zorg ervoor dat u de RedisBindings.cs en RedisTriggers.cs bestanden hebt verwijderd.
Kopieer en plak de volgende code in RedisFunction.cs om de bestaande code te vervangen:
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}");
}
}
Belangrijk
Dit voorbeeld is vereenvoudigd voor de zelfstudie. Voor productiegebruik raden we u aan om geparameteriseerde SQL-query's te gebruiken om SQL-injectieaanvallen te voorkomen.
Verbindingsreeksen configureren
U moet het local.settings.json bestand bijwerken om de verbindingsreeks voor uw SQL-database op te nemen. Voeg een vermelding toe in de Values
sectie voor SQLConnectionString
. Uw bestand moet eruitzien zoals dit voorbeeld:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
"redisConnectionString": "<redis-connection-string>",
"SQLConnectionString": "<sql-connection-string>"
}
}
Als u de Redis-verbindingsreeks wilt vinden, gaat u naar het resourcemenu in azure Managed Redis of Azure Cache voor Redis resource. Zoek de tekenreeks in het gebied Toegangssleutels in het menu Resource.
Als u de SQL-database verbindingsreeks wilt vinden, gaat u naar het resourcemenu in de SQL-databaseresource. Selecteer onder Instellingen verbindingsreeksen en selecteer vervolgens het tabblad ADO.NET. De tekenreeks bevindt zich in het gebied ADO.NET (SQL-verificatie).
U moet het wachtwoord voor uw SQL-database handmatig invoeren verbindingsreeks, omdat het wachtwoord niet automatisch wordt geplakt.
Belangrijk
Dit voorbeeld is vereenvoudigd voor de zelfstudie. Voor productiegebruik raden we u aan Azure Key Vault te gebruiken om verbindingsreeks informatie op te slaan of Azure Microsoft Entra-id te gebruiken voor SQL-verificatie.
De app bouwen en het project uitvoeren
Ga in VS Code naar het tabblad Uitvoeren en foutopsporing en voer het project uit.
Ga terug naar uw Redis-exemplaar in Azure Portal en selecteer de consoleknop om de Redis-console in te voeren. Probeer een aantal
SET
opdrachten te gebruiken:SET apple 5.25
SET bread 2.25
SET apple 4.50
Belangrijk
Het consolehulpprogramma is nog niet beschikbaar voor Azure Managed Redis. In plaats daarvan kunt u overwegen de redis-cli of een hulpprogramma zoals Redis Insight te gebruiken om opdrachten rechtstreeks op het Redis-exemplaar uit te voeren.
In VS Code worden de triggers geregistreerd. Controleren of de triggers werken:
Ga naar de SQL-database in Azure Portal.
Selecteer Query-editor in het resourcemenu.
Maak voor Nieuwe query een query met de volgende SQL-opdracht om de top 100 items in de inventaristabel weer te geven:
SELECT TOP (100) * FROM [dbo].[inventory]
Controleer of de items die naar uw Redis-exemplaar zijn geschreven, hier worden weergegeven.
De code implementeren in uw functie-app
Deze zelfstudie bouwt voort op de vorige zelfstudie. Zie Code implementeren in een Azure-functie voor meer informatie.
Ga in VS Code naar het tabblad Azure .
Zoek uw abonnement en vouw het uit. Zoek vervolgens de sectie Functie-app en vouw dat uit.
Selecteer en houd uw functie-app ingedrukt (of klik er met de rechtermuisknop op) en selecteer vervolgens Implementeren in functie-app.
Verbindingsreeks-informatie toevoegen
Deze zelfstudie bouwt voort op de vorige zelfstudie. Zie Verbindingsreeks toevoegen voor meer informatie.redisConnectionString
Ga naar uw functie-app in Azure Portal. Selecteer omgevingsvariabelen in het resourcemenu.
Voer in het deelvenster App-instellingen SQLConnectionString in als een nieuw veld. Voer bij Waarde uw verbindingsreeks in.
Selecteer Toepassen.
Ga naar de blade Overzicht en selecteer Opnieuw opstarten om de app opnieuw te starten met de nieuwe verbindingsreeks informatie.
Implementatie verifiëren
Nadat de implementatie is voltooid, gaat u terug naar uw Redis-exemplaar en gebruikt SET
u opdrachten om meer waarden te schrijven. Controleer of ze ook worden weergegeven in uw SQL-database.
Als u wilt bevestigen dat uw functie-app goed werkt, gaat u naar de app in de portal en selecteert u Log stream in het resourcemenu. U ziet nu de triggers die daar worden uitgevoerd en de bijbehorende updates die worden aangebracht in uw SQL-database.
Als u de SQL-databasetabel ooit wilt wissen zonder deze te verwijderen, kunt u de volgende SQL-query gebruiken:
TRUNCATE TABLE [dbo].[inventory]
Resources opschonen
Als u de resources wilt blijven gebruiken die u in dit artikel hebt gemaakt, moet u de resourcegroep behouden.
Als u klaar bent met de resources, kunt u de Azure-resourcegroep verwijderen die u hebt gemaakt om kosten te voorkomen.
Belangrijk
Het verwijderen van een resourcegroep kan niet ongedaan worden gemaakt. Wanneer u een resourcegroep verwijdert, worden alle resources in de groep definitief verwijderd. Zorg ervoor dat u niet per ongeluk de verkeerde resourcegroep of resources verwijdert. Als u de resources in een bestaande resourcegroep hebt gemaakt die resources bevat die u wilt behouden, kunt u elke resource afzonderlijk verwijderen in plaats van de resourcegroep te verwijderen.
Een resourcegroep verwijderen
Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.
Selecteer de resourcegroep die u wilt verwijderen.
Als er veel resourcegroepen zijn, gebruikt u het vak Filter voor een veld... en typt u de naam van de resourcegroep die u voor dit artikel hebt gemaakt. Selecteer de resourcegroep in de lijst met resultaten.
Selecteer Resourcegroep verwijderen.
U wordt gevraagd om het verwijderen van de resourcegroep te bevestigen. Typ ter bevestiging de naam van de resourcegroep. Selecteer vervolgens Verwijderen.
Na enkele ogenblikken worden de resourcegroep en alle bijbehorende resources verwijderd.
Samenvatting
Deze zelfstudie en Aan de slag met Azure Functions-triggers in Azure Redis laten zien hoe u Redis-triggers en -bindingen gebruikt in Azure-functie-apps. Ze laten ook zien hoe u Redis gebruikt als een write-behind-cache met Azure SQL Database. Het gebruik van Azure Managed Redis of Azure Cache voor Redis met Azure Functions is een krachtige combinatie die veel integratie- en prestatieproblemen kan oplossen.