Sdílet prostřednictvím


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

Cílem tohoto kurzu je použít instanci Azure Managed Redis (Preview) nebo 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í 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

  • Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet.
  • Dokončení předchozího kurzu Začínáme s triggery Azure Functions v Azure Redis s těmito zřízenými prostředky:
    • Instance Azure Managed Redis (Preview) nebo Azure Cache for Redis
    • Instance Azure Functions
    • Pracovní znalost používání Azure SQL
    • Prostředí editoru Visual Studio Code (VS Code) nastavené s nainstalovanými balíčky NuGet

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 Managed Redis nebo 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 k ověřování SQL pomocí Azure Microsoft Entra ID.

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 vaší instanci 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

Důležité

Nástroj konzoly ještě není pro Azure Managed Redis k dispozici. Místo toho zvažte použití redis-cli nebo nástroje, jako je Redis Insight , ke spouštění příkazů přímo v instanci Redis.

  1. 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 zde zobrazují položky zapsané do vaší instance 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 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ů.

Jinak pokud jste s prostředky hotovi, můžete odstranit skupinu prostředků Azure, kterou jste vytvořili, abyste se vyhnuli poplatkům.

Důležité

Odstranění skupiny prostředků je nevratné. Při odstranění skupiny prostředků se všechny prostředky, které obsahuje, 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 každý prostředek odstranit jednotlivě místo odstranění skupiny prostředků.

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ů, kterou chcete odstranit.

    Pokud existuje mnoho skupin prostředků, použijte filtr pro jakékoli pole... zadejte název skupiny prostředků, kterou jste vytvořili pro tento článek. V seznamu výsledků vyberte skupinu prostředků.

    Snímek obrazovky se seznamem skupin prostředků, které se mají odstranit v pracovním podokně

  3. Vyberte Odstranit skupinu prostředků.

  4. Zobrazí se výzva k potvrzení odstranění skupiny prostředků. Potvrďte odstranění zadáním názvu vaší skupiny prostředků a vyberte Odstranit.

    Snímek obrazovky s formulářem, který vyžaduje název prostředku k potvrzení odstranění

Po chvíli se skupina prostředků včetně všech prostředků, které obsahuje, odstraní.

Shrnutí

Tento kurz a začínáme s triggery Azure Functions v Azure Redis ukazuje, jak používat triggery a vazby Redis v aplikacích funkcí Azure. Ukazují také, jak používat Redis jako mezipaměť za zápisem s Azure SQL Database. Použití Azure Managed Redis nebo Azure Cache for Redis s Azure Functions je výkonná kombinace, která dokáže vyřešit mnoho problémů s integrací a výkonem.