Kurz: Vytvoření mezipaměti za zápisem pomocí Azure Functions a Azure Cache for Redis

Cílem tohoto kurzu je použít instanci Azure Cache for Redis jako mezipaměť za zápisem. Vzor zápisu v tomto kurzu ukazuje, jak zápisy do mezipaměti aktivují odpovídající zápisy do databáze SQL (instance služby Azure SQL Database).

K implementaci této funkce použijete trigger Redis pro Azure Functions . V tomto scénáři se dozvíte, jak pomocí služby Azure Cache for Redis ukládat informace o inventáři a cenách při zálohování těchto informací do databáze SQL.

Každá nová položka nebo nová cena zapsaná do mezipaměti se pak projeví v tabulce SQL v databázi.

V tomto kurzu se naučíte:

  • Nakonfigurujte databázi, trigger a připojovací řetězec.
  • Ověřte, že triggery fungují.
  • Nasaďte kód do aplikace funkcí.

Požadavky

Vytvoření a konfigurace nové databáze SQL

Databáze SQL je backingová databáze pro tento příklad. Databázi SQL můžete vytvořit prostřednictvím webu Azure Portal nebo prostřednictvím preferované metody automatizace.

Další informace o vytvoření databáze SQL najdete v tématu Rychlý start: Vytvoření izolované databáze – Azure SQL Database.

V tomto příkladu se používá portál:

  1. Zadejte název databáze a vyberte Vytvořit nový a vytvořte nový server pro uložení databáze.

    Snímek obrazovky s vytvořením prostředku Azure SQL

  2. Vyberte Použít ověřování SQL a zadejte přihlašovací jméno a heslo správce. Nezapomeňte si tyto přihlašovací údaje zapamatovat nebo si je poznamenejte. Při nasazování serveru v produkčním prostředí místo toho použijte ověřování Microsoft Entra.

    Snímek obrazovky s ověřovacími informacemi pro prostředek Azure SQL

  3. Přejděte na kartu Sítě a jako metodu připojení zvolte Veřejný koncový bod . U obou zobrazených pravidel brány firewall vyberte Ano . Tento koncový bod umožňuje přístup z vaší aplikace funkcí Azure.

    Snímek obrazovky s nastavením sítě pro prostředek Azure SQL

  4. Po dokončení ověření vyberte Zkontrolovat a vytvořit a pak vytvořit. Databáze SQL se začne nasazovat.

  5. Po dokončení nasazení přejděte na webu Azure Portal k prostředku a vyberte kartu Editor dotazů. Vytvořte novou tabulku s názvem Inventář obsahující data, která do něj zapíšete. Pomocí následujícího příkazu SQL vytvořte novou tabulku se dvěma poli:

    • ItemName zobrazí název každé položky.
    • Price ukládá cenu položky.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Snímek obrazovky znázorňující vytvoření tabulky v Editor Power Query prostředku Azure SQL

  6. Po dokončení příkazu rozbalte složku Tabulky a ověřte, že byla vytvořena nová tabulka.

Konfigurace triggeru Redis

Nejprve vytvořte kopii stejného projektu VS Code, který jste použili v předchozím kurzu. Zkopírujte složku z předchozího kurzu pod novým názvem, například RedisWriteBehindTrigger, a otevřete ji ve VS Code.

Za druhé odstraňte soubory RedisBindings.cs a RedisTriggers.cs .

V tomto příkladu použijete trigger pub/sub k aktivaci keyevent oznámení. Mezi cíle příkladu patří:

  • Aktivační událost pokaždé, když dojde k SET události. K SET události dojde, když se do instance mezipaměti zapíšou nové klíče nebo se změní hodnota klíče.
  • SET Po aktivaci události přejděte k instanci mezipaměti a vyhledejte hodnotu nového klíče.
  • Zjistěte, jestli klíč již v tabulce inventáře v databázi SQL existuje.
    • Pokud ano, aktualizujte hodnotu tohoto klíče.
    • Pokud ne, napište nový řádek s klíčem a jeho hodnotou.

Konfigurace triggeru:

  1. Importem System.Data.SqlClient balíčku NuGet povolte komunikaci s databází SQL. Přejděte do terminálu VS Code a použijte následující příkaz:

      dotnet add package System.Data.SqlClient
    
  2. Vytvořte nový soubor s názvem RedisFunction.cs. Ujistěte se, že jste odstranili soubory RedisBindings.cs a RedisTriggers.cs .

  3. Zkopírujte a vložte následující kód do RedisFunction.cs a nahraďte stávající kód:

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}");
    }
}

Důležité

Tento příklad je pro kurz zjednodušený. Pro produkční použití doporučujeme použít parametrizované dotazy SQL, abyste zabránili útokům prostřednictvím injektáže SQL.

Konfigurace připojovacích řetězců

Musíte aktualizovat soubor local.settings.json tak, aby zahrnoval připojovací řetězec pro vaši databázi SQL. Přidejte položku do oddílu Values pro SQLConnectionString. Soubor by měl vypadat jako v tomto příkladu:

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

Pokud chcete najít připojovací řetězec Redis, přejděte do nabídky prostředků v prostředku Azure Cache for Redis. Vyhledejte řetězec v oblasti Přístupové klíče v nabídce Prostředek.

Pokud chcete najít připojovací řetězec databáze SQL, přejděte do nabídky prostředků v prostředku databáze SQL. V části Nastavení vyberte Připojovací řetězce a pak vyberte kartu ADO.NET. Řetězec je v oblasti ADO.NET (ověřování SQL).

Heslo pro vaši databázi SQL připojovací řetězec musíte zadat ručně, protože heslo se nevkládá automaticky.

Důležité

Tento příklad je pro kurz zjednodušený. Pro produkční použití doporučujeme použít Azure Key Vault k ukládání připojovací řetězec informací nebo použití Azure EntraID pro ověřování SQL.

Sestavení a spuštění projektu

  1. Ve VS Code přejděte na kartu Spustit a ladit a spusťte projekt.

  2. Vraťte se k instanci Azure Cache for Redis na webu Azure Portal a výběrem tlačítka Konzola přejděte do konzoly Redis. Zkuste použít některé SET příkazy:

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. Zpět ve VS Code se triggery registrují. Ověření fungování triggerů:

    1. Na webu Azure Portal přejděte do databáze SQL.

    2. V nabídce prostředků vyberte Editor dotazů.

    3. V případě nového dotazu vytvořte dotaz s následujícím příkazem SQL, který zobrazí prvních 100 položek v tabulce inventáře:

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

      Ověřte, že se tady zobrazují položky zapsané do vaší instance Azure Cache for Redis.

    Snímek obrazovky znázorňující, že se informace zkopírovaly do SQL z instance mezipaměti

Nasazení kódu do aplikace funkcí

Tento kurz vychází z předchozího kurzu. Další informace najdete v tématu Nasazení kódu do funkce Azure.

  1. Ve VS Code přejděte na kartu Azure .

  2. Vyhledejte své předplatné a rozbalte ho. Pak najděte část Aplikace funkcí a rozbalte ji.

  3. Vyberte a podržte aplikaci funkcí (nebo na ji klikněte pravým tlačítkem myši) a pak vyberte Nasadit do aplikace funkcí.

Přidání informací o připojovací řetězec

Tento kurz vychází z předchozího kurzu. Další informace najdete redisConnectionStringv tématu Přidání připojovací řetězec informací.

  1. Přejděte do aplikace funkcí na webu Azure Portal. V nabídce prostředků vyberte Proměnné prostředí.

  2. V podokně Nastavení aplikace zadejte jako nové pole sqlConnectionString. Jako hodnotu zadejte připojovací řetězec.

  3. Vyberte Použít.

  4. Přejděte do okna Přehled a výběrem možnosti Restartovat restartujte aplikaci s novými informacemi o připojovací řetězec.

Ověření nasazení

Po dokončení nasazení se vraťte do instance Azure Cache for Redis a pomocí SET příkazů napište další hodnoty. Ověřte, že se také zobrazují ve vaší databázi SQL.

Pokud chcete ověřit, že vaše aplikace funkcí funguje správně, přejděte na portálu do aplikace a v nabídce prostředků vyberte Stream protokolu. Měli byste vidět spuštěné triggery a odpovídající aktualizace provedené v databázi SQL.

Pokud byste někdy chtěli vymazat tabulku databáze SQL bez odstranění, můžete použít následující dotaz SQL:

TRUNCATE TABLE [dbo].[inventory]

Vyčištění prostředků

Pokud chcete dál používat prostředky, které jste vytvořili v tomto článku, ponechte skupinu prostředků.

V opačném případě můžete zabránit poplatkům souvisejícím s prostředky, pokud jste dokončili používání prostředků, můžete odstranit skupinu prostředků Azure, kterou jste vytvořili.

Upozorňující

Odstranění skupiny prostředků je nevratné. Když odstraníte skupinu prostředků, všechny prostředky ve skupině prostředků se trvale odstraní. Ujistěte se, že nechtěně neodstraníte nesprávnou skupinu prostředků nebo prostředky. Pokud jste prostředky vytvořili v existující skupině prostředků, která obsahuje prostředky, které chcete zachovat, můžete místo odstranění skupiny prostředků odstranit jednotlivé prostředky.

Odstranění skupiny prostředků

  1. Přihlaste se k portálu Azure Portal a potom vyberte Skupiny prostředků.

  2. Vyberte skupinu prostředků, která se má odstranit.

    Pokud existuje mnoho skupin prostředků, zadejte do pole Filtr libovolné pole název skupiny prostředků, kterou jste vytvořili pro dokončení tohoto článku. V seznamu výsledků hledání vyberte skupinu prostředků.

    Snímek obrazovky znázorňující seznam skupin prostředků, ze které si můžete vybrat, ze kterého chcete odstranit

  3. Vyberte Odstranit skupinu prostředků.

  4. V podokně Odstranit skupinu prostředků zadejte název skupiny prostředků, abyste ji potvrdili, a pak vyberte Odstranit.

    Snímek obrazovky znázorňující pole, které vyžaduje zadání názvu prostředku k potvrzení odstranění

Během několika okamžiků se odstraní skupina prostředků a všechny její prostředky.

Shrnutí

Tento kurz a začínáme s triggery Azure Functions ve službě Azure Cache for Redis ukazuje, jak pomocí Azure Cache for Redis aktivovat aplikace funkcí Azure. Ukazují také, jak používat Azure Cache for Redis jako mezipaměť za zápisem ve službě Azure SQL Database. Použití služby Azure Cache for Redis se službou Azure Functions je výkonná kombinace, která dokáže vyřešit řadu problémů s integrací a výkonem.