Share via


Zelfstudie: Een write-behind-cache maken met behulp van Azure Functions en Azure Cache voor Redis

Het doel van deze zelfstudie is het gebruik van een 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 Azure Cache voor Redis kunt gebruiken 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 Cache voor Redis, met de volgende resources ingericht:
    • 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.

Zie quickstart: Een individuele database maken - Azure SQL Database voor meer informatie over het maken van een SQL-database.

In dit voorbeeld wordt de portal gebruikt:

  1. Voer een databasenaam in en selecteer Nieuwe maken om een nieuwe server te maken voor de database.

    Schermopname van het maken van een Azure SQL-resource.

  2. 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.

    Schermopname van de verificatiegegevens voor een Azure SQL-resource.

  3. 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.

    Schermopname van de netwerkinstelling voor een Azure SQL-resource.

  4. Nadat de validatie is voltooid, selecteert u Beoordelen en maken en vervolgens Maken. De SQL-database wordt geïmplementeerd.

  5. 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)
        );
    

    Schermopname van het maken van een tabel in Power Query-editor van een Azure SQL-resource.

  6. 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. Een SET 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:

  1. 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
    
  2. Maak een nieuw bestand met de naam RedisFunction.cs. Zorg ervoor dat u de RedisBindings.cs en RedisTriggers.cs bestanden hebt verwijderd.

  3. 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 de 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 Verbinding maken iontekenreeksen 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 EntraID te gebruiken voor SQL-verificatie.

De app bouwen en het project uitvoeren

  1. Ga in VS Code naar het tabblad Uitvoeren en foutopsporing en voer het project uit.

  2. Ga terug naar uw Azure Cache voor 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
  3. In VS Code worden de triggers geregistreerd. Controleren of de triggers werken:

    1. Ga naar de SQL-database in Azure Portal.

    2. Selecteer Query-editor in het resourcemenu.

    3. 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 Azure Cache voor Redis exemplaar zijn geschreven, hier worden weergegeven.

    Schermopname van de informatie die is gekopieerd naar SQL vanuit het cache-exemplaar.

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.

  1. Ga in VS Code naar het tabblad Azure .

  2. Zoek uw abonnement en vouw het uit. Zoek vervolgens de sectie Functie-app en vouw dat uit.

  3. 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

  1. Ga naar uw functie-app in Azure Portal. Selecteer omgevingsvariabelen in het resourcemenu.

  2. Voer in het deelvenster App Instellingen SQL Verbinding maken ionString in als een nieuw veld. Voer bij Waarde uw verbindingsreeks in.

  3. Selecteer Toepassen.

  4. 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 Azure Cache voor Redis exemplaar en gebruikt u SET 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

  1. Meld u aan bij Azure Portal en selecteer vervolgens Resourcegroepen.

  2. 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.

    Schermopname van een lijst met resourcegroepen die u wilt verwijderen in het werkvenster.

  3. Selecteer Resourcegroep verwijderen.

  4. U wordt gevraagd om het verwijderen van de resourcegroep te bevestigen. Typ ter bevestiging de naam van de resourcegroep. Selecteer vervolgens Verwijderen.

    Schermopname van een formulier waarvoor de resourcenaam is vereist om het verwijderen te bevestigen.

Na enkele ogenblikken worden de resourcegroep en alle bijbehorende resources verwijderd.

Samenvatting

Deze zelfstudie en Aan de slag met Azure Functions-triggers in Azure Cache voor Redis laten zien hoe u Azure Cache voor Redis kunt gebruiken om Azure-functie-apps te activeren. Ze laten ook zien hoe u Azure Cache voor Redis gebruikt als een write-behind-cache met Azure SQL Database. Het gebruik van Azure Cache voor Redis met Azure Functions is een krachtige combinatie die veel integratie- en prestatieproblemen kan oplossen.