Oktatóanyag: Írási gyorsítótár létrehozása az Azure Functions és az Azure Cache for Redis használatával

Az oktatóanyag célja, hogy egy Azure Cache for Redis-példányt használjon írási gyorsítótárként. Az oktatóanyag írási mintája bemutatja, hogyan kell írni a gyorsítótár-eseményindítóba a megfelelő írásokat egy SQL-adatbázisba (az Azure SQL Database szolgáltatás egy példányára).

Ezt a funkciót az Azure Functions Redis-eseményindítója használatával valósíthatja meg. Ebben a forgatókönyvben megtudhatja, hogyan tárolhatja az Azure Cache for Redis készlet- és díjszabási adatait, miközben biztonsági másolatot készít ezekről az információkról egy SQL-adatbázisban.

A gyorsítótárba írt minden új elem vagy új ár megjelenik az adatbázis SQL-táblájában.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • Adatbázis, eseményindító és kapcsolati sztring konfigurálása.
  • Ellenőrizze, hogy az eseményindítók működnek-e.
  • Kód üzembe helyezése függvényalkalmazásban.

Előfeltételek

Új SQL-adatbázis létrehozása és konfigurálása

Ebben a példában az SQL-adatbázis a háttéradatbázis. SQL-adatbázist az Azure Portalon vagy az előnyben részesített automatizálási módszerrel hozhat létre.

Az SQL-adatbázisok létrehozásával kapcsolatos további információkért tekintse meg a rövid útmutatót: Egyetlen adatbázis létrehozása – Azure SQL Database.

Ez a példa a portált használja:

  1. Adjon meg egy adatbázisnevet, és válassza az Új létrehozása lehetőséget egy új kiszolgáló létrehozásához az adatbázis tárolásához.

    Képernyőkép egy Azure SQL-erőforrás létrehozásáról.

  2. Válassza az SQL-hitelesítés használata lehetőséget, és adjon meg egy rendszergazdai bejelentkezést és jelszót. Ügyeljen arra, hogy emlékezzen ezekre a hitelesítő adatokra, vagy írja le őket. Amikor éles környezetben helyez üzembe egy kiszolgálót, használja helyette a Microsoft Entra-hitelesítést.

    Képernyőkép egy Azure SQL-erőforrás hitelesítési adatairól.

  3. Lépjen a Hálózatkezelés lapra, és válassza a Nyilvános végpontot kapcsolati módszerként. Válassza az Igen lehetőséget mindkét megjelenő tűzfalszabály esetében. Ez a végpont engedélyezi a hozzáférést az Azure-függvényalkalmazásból.

    Képernyőkép egy Azure SQL-erőforrás hálózati beállításáról.

  4. Az ellenőrzés befejezése után válassza a Véleményezés + létrehozás , majd a Létrehozás lehetőséget. Az SQL-adatbázis üzembe helyezése elkezdődött.

  5. Az üzembe helyezés befejezése után nyissa meg az erőforrást az Azure Portalon, és válassza a Lekérdezésszerkesztő lapot. Hozzon létre egy új, leltár nevű táblát, amely tartalmazza a hozzá írandó adatokat. A következő SQL-paranccsal hozzon létre egy új táblát két mezővel:

    • ItemName felsorolja az egyes elemek nevét.
    • Price tárolja az elem árát.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Képernyőkép egy azure SQL-erőforrás Lekérdezésszerkesztő táblájának létrehozásáról.

  6. A parancs futtatása után bontsa ki a Táblák mappát, és ellenőrizze, hogy az új tábla létrejött-e.

A Redis-eseményindító konfigurálása

Először készítsen másolatot az előző oktatóanyagban használt VS Code-projektről. Másolja ki a mappát az előző oktatóanyagból egy új névvel( például RedisWriteBehindTrigger), és nyissa meg a VS Code-ban.

Másodszor törölje a RedisBindings.cs és RedisTriggers.cs fájlokat.

Ebben a példában a pub/al trigger használatával aktiválja az értesítéseket keyevent . A példa céljai a következők:

  • Esemény minden előfordulásának SET aktiválása. Esemény SET akkor fordul elő, ha a rendszer új kulcsokat ír a gyorsítótárpéldányba, vagy egy kulcs értéke megváltozik.
  • Az SET esemény aktiválása után lépjen a gyorsítótárpéldányhoz az új kulcs értékének megkereséséhez.
  • Állapítsa meg, hogy a kulcs már létezik-e az SQL-adatbázis leltártáblájában .
    • Ha igen, frissítse a kulcs értékét.
    • Ha nem, írjon egy új sort a kulccsal és az értékével.

Az eseményindító konfigurálása:

  1. Importálja a System.Data.SqlClient NuGet-csomagot az SQL-adatbázissal való kommunikáció engedélyezéséhez. Lépjen a VS Code terminálra, és használja a következő parancsot:

      dotnet add package System.Data.SqlClient
    
  2. Hozzon létre egy RedisFunction.cs nevű új fájlt. Győződjön meg arról, hogy törölte a RedisBindings.cs és RedisTriggers.cs fájlokat.

  3. Másolja és illessze be a következő kódot a RedisFunction.cs a meglévő kód helyére:

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

Fontos

Ez a példa egyszerűbb az oktatóanyaghoz. Éles használat esetén javasoljuk, hogy paraméteres SQL-lekérdezésekkel előzze meg az SQL-injektálási támadásokat.

Kapcsolati sztringek konfigurálása

Frissítenie kell a local.settings.json fájlt, hogy tartalmazza az SQL-adatbázis kapcsolati sztring. Adjon hozzá egy bejegyzést a Values következő szakaszhoz SQLConnectionString: . A fájlnak ehhez a példához kell hasonlítania:

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

A Redis kapcsolati sztring megkereséséhez nyissa meg az Azure Cache for Redis erőforrás erőforrás menüjét. A sztring a Gépház Hozzáférési kulcsok területén található.

Az SQL-adatbázis kapcsolati sztring megkereséséhez lépjen az SQL-adatbázis erőforrásának erőforrásmenüjéhez. A Gépház területen válassza a Csatlakozás ion sztringeket, majd válassza a ADO.NET lapot. A sztring a ADO.NET (SQL-hitelesítés) területen található.

Manuálisan kell megadnia az SQL-adatbázis jelszavát kapcsolati sztring, mert a jelszó nem lesz automatikusan beillesztve.

Fontos

Ez a példa egyszerűbb az oktatóanyaghoz. Éles használat esetén javasoljuk, hogy az Azure Key Vault használatával tárolja kapcsolati sztring információkat, vagy használja az Azure EntraID-t AZ SQL-hitelesítéshez.

A projekt buildelése és futtatása

  1. A VS Code-ban lépjen a Futtatás és hibakeresés lapra , és futtassa a projektet.

  2. Térjen vissza az Azure Cache for Redis-példányhoz az Azure Portalon, és a Konzol gombra kattintva lépjen be a Redis-konzolba. Próbálkozzon néhány SET parancs használatával:

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. A VS Code-ban az eseményindítók regisztrálása folyamatban van. Az eseményindítók működésének ellenőrzése:

    1. Nyissa meg az SQL-adatbázist az Azure Portalon.

    2. Az erőforrás menüjében válassza a Lekérdezésszerkesztő lehetőséget.

    3. Új lekérdezés esetén hozzon létre egy lekérdezést a következő SQL-paranccsal a leltártábla 100 legfontosabb elemének megtekintéséhez:

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

      Győződjön meg arról, hogy az Azure Cache for Redis-példányba írt elemek itt jelennek meg.

    Képernyőkép arról, hogy az adatok át lettek másolva az SQL-be a gyorsítótárpéldányból.

A kód üzembe helyezése a függvényalkalmazásban

Ez az oktatóanyag az előző oktatóanyagra épül. További információ: Kód üzembe helyezése Egy Azure-függvényben.

  1. A VS Code-ban lépjen az Azure lapra.

  2. Keresse meg előfizetését, és bontsa ki. Ezután keresse meg a Függvényalkalmazás szakaszt, és bontsa ki azt.

  3. Jelölje ki és tartsa lenyomva a függvényalkalmazást (vagy kattintson rá a jobb gombbal), majd válassza az Üzembe helyezés függvényalkalmazásban lehetőséget.

Kapcsolati sztring adatainak hozzáadása

Ez az oktatóanyag az előző oktatóanyagra épül. További információt a redisConnectionStringKapcsolati sztring hozzáadása című témakörben talál.

  1. Nyissa meg a függvényalkalmazást az Azure Portalon. Az erőforrás menüjében válassza a Környezeti változók lehetőséget.

  2. Az Alkalmazás Gépház panelen adja meg az SQL Csatlakozás ionString értéket új mezőként. Az Érték mezőben adja meg a kapcsolati sztring.

  3. Válassza az Alkalmazás lehetőséget.

  4. Lépjen az Áttekintés panelre, és válassza az Újraindítás lehetőséget az alkalmazás újraindításához az új kapcsolati sztring adatokkal.

Az üzembe helyezés ellenőrzése

Az üzembe helyezés befejezése után térjen vissza az Azure Cache for Redis-példányhoz, és használjon SET parancsokat további értékek írásához. Győződjön meg arról, hogy az SQL-adatbázisban is megjelennek.

Ha ellenőrizni szeretné, hogy a függvényalkalmazás megfelelően működik-e, nyissa meg az alkalmazást a portálon, és válassza a Naplóstream lehetőséget az erőforrás menüjében. Látnia kell az ott futó eseményindítókat és az SQL-adatbázis megfelelő frissítéseit.

Ha törlés nélkül szeretné törölni az SQL-adatbázistáblát, a következő SQL-lekérdezést használhatja:

TRUNCATE TABLE [dbo].[inventory]

Az erőforrások eltávolítása

Ha továbbra is használni szeretné a cikkben létrehozott erőforrásokat, tartsa meg az erőforráscsoportot.

Ellenkező esetben, ha végzett az erőforrásokkal, törölheti a létrehozott Azure-erőforráscsoportot a díjak elkerülése érdekében.

Fontos

Az erőforráscsoport törlése nem vonható vissza. Az erőforráscsoport törlésekor a benne foglalt összes erőforrás véglegesen törlődik. Figyeljen arra, hogy ne töröljön véletlenül erőforráscsoportot vagy erőforrásokat. Ha olyan meglévő erőforráscsoportban hozta létre az erőforrásokat, amely a megtartani kívánt erőforrásokat tartalmazza, az erőforráscsoport törlése helyett egyenként törölheti az egyes erőforrásokat.

Erőforráscsoport törlése

  1. Jelentkezzen be az Azure Portalra, és válassza az Erőforráscsoportok elemet.

  2. Válassza ki a törölni kívánt erőforráscsoportot.

    Ha sok erőforráscsoport van, használja a Szűrő bármely mezőhöz... mezőt, írja be a cikkhez létrehozott erőforráscsoport nevét. Válassza ki az erőforráscsoportot az eredménylistában.

    Képernyőkép a munkaablakban törölni kívánt erőforráscsoportok listájáról.

  3. Válassza az Erőforráscsoport törlése elemet.

  4. A rendszer az erőforráscsoport törlésének megerősítését kéri. A megerősítéshez írja be az erőforráscsoport nevét, és válassza a Törlést.

    Képernyőkép egy űrlapról, amely megköveteli az erőforrás nevét a törlés megerősítéséhez.

A rendszer néhány pillanaton belül törli az erőforráscsoportot és annak erőforrásait.

Összegzés

Ez az oktatóanyag és az Azure Functions-eseményindítók használatának első lépései az Azure Cache for Redisben bemutatják, hogyan lehet az Azure Cache for Redist használni az Azure-függvényalkalmazások aktiválásához. Azt is bemutatják, hogyan használhatja az Azure Cache for Redist írási mögöttes gyorsítótárként az Azure SQL Database-zel. Az Azure Cache for Redis használata az Azure Functions használatával hatékony kombináció, amely számos integrációs és teljesítményproblémát képes megoldani.