Udostępnij za pośrednictwem


Samouczek: tworzenie pamięci podręcznej za pomocą usługi Azure Functions i usługi Azure Cache for Redis

Celem tego samouczka jest użycie wystąpienia usługi Azure Cache for Redis jako pamięci podręcznej zapisu w tle. Wzorzec zapisu w tym samouczku pokazuje, jak zapisy w pamięci podręcznej wyzwalają odpowiadające zapisy w bazie danych SQL (wystąpienie usługi Azure SQL Database).

Aby zaimplementować tę funkcję, użyj wyzwalacza Redis dla usługi Azure Functions . W tym scenariuszu zobaczysz, jak używać usługi Azure Cache for Redis do przechowywania informacji o spisie i cenach podczas tworzenia kopii zapasowych tych informacji w bazie danych SQL.

Każdy nowy element lub nowa cena zapisana w pamięci podręcznej jest następnie odzwierciedlana w tabeli SQL w bazie danych.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Konfigurowanie bazy danych, wyzwalacza i parametry połączenia.
  • Sprawdź, czy wyzwalacze działają.
  • Wdrażanie kodu w aplikacji funkcji.

Wymagania wstępne

Tworzenie i konfigurowanie nowej bazy danych SQL

W tym przykładzie baza danych SQL jest bazą danych kopii zapasowych. Bazę danych SQL można utworzyć za pośrednictwem witryny Azure Portal lub preferowanej metody automatyzacji.

Aby uzyskać więcej informacji na temat tworzenia bazy danych SQL, zobacz Szybki start: tworzenie pojedynczej bazy danych — Azure SQL Database.

W tym przykładzie użyto portalu:

  1. Wprowadź nazwę bazy danych i wybierz pozycję Utwórz nowy , aby utworzyć nowy serwer do przechowywania bazy danych.

    Zrzut ekranu przedstawiający tworzenie zasobu usługi Azure SQL.

  2. Wybierz pozycję Użyj uwierzytelniania SQL i wprowadź hasło i logowanie administratora. Pamiętaj o tych poświadczeniach lub zapisz je. Podczas wdrażania serwera w środowisku produkcyjnym zamiast tego użyj uwierzytelniania Microsoft Entra.

    Zrzut ekranu przedstawiający informacje o uwierzytelnianiu zasobu usługi Azure SQL.

  3. Przejdź do karty Sieć i wybierz pozycję Publiczny punkt końcowy jako metodę połączenia. Wybierz pozycję Tak dla obu wyświetlanych reguł zapory. Ten punkt końcowy umożliwia dostęp z poziomu aplikacji funkcji platformy Azure.

    Zrzut ekranu przedstawiający ustawienie sieciowe dla zasobu usługi Azure SQL.

  4. Po zakończeniu walidacji wybierz pozycję Przejrzyj i utwórz , a następnie pozycję Utwórz. Baza danych SQL rozpoczyna wdrażanie.

  5. Po zakończeniu wdrażania przejdź do zasobu w witrynie Azure Portal i wybierz kartę Edytor zapytań. Utwórz nową tabelę o nazwie inventory zawierającą dane, do których będziesz zapisywać dane. Użyj następującego polecenia SQL, aby utworzyć nową tabelę z dwoma polami:

    • ItemName wyświetla nazwę każdego elementu.
    • Price przechowuje cenę przedmiotu.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Zrzut ekranu przedstawiający tworzenie tabeli w Edytor Power Query zasobu usługi Azure SQL.

  6. Po zakończeniu działania polecenia rozwiń folder Tables i sprawdź, czy nowa tabela została utworzona.

Konfigurowanie wyzwalacza usługi Redis

Najpierw utwórz kopię tego samego projektu programu VS Code, który został użyty w poprzednim samouczku. Skopiuj folder z poprzedniego samouczka pod nową nazwą, taką jak RedisWriteBehindTrigger, i otwórz go w programie VS Code.

Po drugie usuń pliki RedisBindings.cs i RedisTriggers.cs .

W tym przykładzie użyjesz wyzwalacza pub/sub, aby wyzwolić keyevent powiadomienia. Cele przykładu to:

  • Wyzwalacz za każdym razem, SET gdy wystąpi zdarzenie. Zdarzenie SET występuje, gdy nowe klucze są zapisywane w wystąpieniu pamięci podręcznej lub zmieniana jest wartość klucza.
  • Po wyzwoleniu SET zdarzenia uzyskaj dostęp do wystąpienia pamięci podręcznej, aby znaleźć wartość nowego klucza.
  • Ustal, czy klucz już istnieje w tabeli spisu w bazie danych SQL.
    • Jeśli tak, zaktualizuj wartość tego klucza.
    • Jeśli nie, napisz nowy wiersz z kluczem i jego wartością.

Aby skonfigurować wyzwalacz:

  1. Zaimportuj pakiet NuGet, System.Data.SqlClient aby umożliwić komunikację z bazą danych SQL. Przejdź do terminalu programu VS Code i użyj następującego polecenia:

      dotnet add package System.Data.SqlClient
    
  2. Utwórz nowy plik o nazwie RedisFunction.cs. Upewnij się, że usunięto pliki RedisBindings.cs i RedisTriggers.cs .

  3. Skopiuj i wklej następujący kod w RedisFunction.cs , aby zastąpić istniejący kod:

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

Ważne

Ten przykład jest uproszczony dla tego samouczka. W przypadku użycia w środowisku produkcyjnym zalecamy użycie sparametryzowanych zapytań SQL w celu zapobiegania atakom polegającym na wstrzyknięciu kodu SQL.

Konfigurowanie parametrów połączenia

Należy zaktualizować plik local.settings.json, aby uwzględnić parametry połączenia dla bazy danych SQL. Dodaj wpis w Values sekcji dla SQLConnectionStringelementu . Plik powinien wyglądać tak, jak w tym przykładzie:

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

Aby znaleźć parametry połączenia usługi Redis, przejdź do menu zasobów w zasobie usługi Azure Cache for Redis. Znajdź ciąg w obszarze Klucze dostępu w menu Zasób.

Aby znaleźć parametry połączenia bazy danych SQL, przejdź do menu zasobów w zasobie bazy danych SQL. W obszarze Ustawienia wybierz pozycję Parametry połączenia, a następnie wybierz kartę ADO.NET. Ciąg znajduje się w obszarze ADO.NET (uwierzytelnianie SQL).

Musisz ręcznie wprowadzić hasło dla parametry połączenia bazy danych SQL, ponieważ hasło nie jest wklejane automatycznie.

Ważne

Ten przykład jest uproszczony dla tego samouczka. W przypadku użycia w środowisku produkcyjnym zalecamy używanie usługi Azure Key Vault do przechowywania parametry połączenia informacji lub używania identyfikatora EntraID platformy Azure do uwierzytelniania SQL.

Kompilowanie i uruchamianie projektu

  1. W programie VS Code przejdź do karty Uruchamianie i debugowanie i uruchom projekt.

  2. Wróć do wystąpienia usługi Azure Cache for Redis w witrynie Azure Portal i wybierz przycisk Konsola , aby wprowadzić konsolę usługi Redis. Spróbuj użyć niektórych SET poleceń:

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. Po powrocie do programu VS Code wyzwalacze są rejestrowane. Aby sprawdzić, czy wyzwalacze działają:

    1. Przejdź do bazy danych SQL w witrynie Azure Portal.

    2. W menu zasobów wybierz pozycję Edytor zapytań.

    3. W obszarze Nowe zapytanie utwórz zapytanie za pomocą następującego polecenia SQL, aby wyświetlić 100 pierwszych elementów w tabeli spisu:

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

      Upewnij się, że elementy zapisane w wystąpieniu usługi Azure Cache for Redis są wyświetlane tutaj.

    Zrzut ekranu przedstawiający skopiowanie informacji do bazy danych SQL z wystąpienia pamięci podręcznej.

Wdrażanie kodu w aplikacji funkcji

Ten samouczek opiera się na poprzednim samouczku. Aby uzyskać więcej informacji, zobacz Wdrażanie kodu w funkcji platformy Azure.

  1. W programie VS Code przejdź do karty Azure .

  2. Znajdź swoją subskrypcję i rozwiń ją. Następnie znajdź sekcję Aplikacja funkcji i rozwiń ją.

  3. Wybierz i przytrzymaj (lub kliknij prawym przyciskiem myszy) aplikację funkcji, a następnie wybierz polecenie Wdróż w aplikacji funkcji.

Dodawanie informacji o parametry połączenia

Ten samouczek opiera się na poprzednim samouczku. Aby uzyskać więcej informacji na temat programu redisConnectionString, zobacz Dodawanie parametry połączenia informacji.

  1. Przejdź do aplikacji funkcji w witrynie Azure Portal. W menu zasobów wybierz pozycję Zmienne środowiskowe.

  2. W okienku Ustawienia aplikacji wprowadź ciąg SQLConnectionString jako nowe pole. W polu Wartość wprowadź parametry połączenia.

  3. Wybierz Zastosuj.

  4. Przejdź do bloku Przegląd i wybierz pozycję Uruchom ponownie, aby ponownie uruchomić aplikację przy użyciu nowych informacji parametry połączenia.

Weryfikowanie wdrożenia

Po zakończeniu wdrażania wróć do wystąpienia usługi Azure Cache for Redis i użyj SET poleceń, aby zapisać więcej wartości. Upewnij się, że są one również wyświetlane w bazie danych SQL.

Jeśli chcesz potwierdzić, że aplikacja funkcji działa prawidłowo, przejdź do aplikacji w portalu i wybierz pozycję Strumień dziennika z menu zasobów. Powinny być tam widoczne wyzwalacze i odpowiednie aktualizacje wprowadzane do bazy danych SQL.

Jeśli kiedykolwiek chcesz wyczyścić tabelę bazy danych SQL bez jej usunięcia, możesz użyć następującego zapytania SQL:

TRUNCATE TABLE [dbo].[inventory]

Czyszczenie zasobów

Jeśli chcesz nadal korzystać z zasobów utworzonych w tym artykule, zachowaj grupę zasobów.

W przeciwnym razie, aby uniknąć opłat związanych z zasobami, jeśli skończysz korzystać z zasobów, możesz usunąć utworzoną grupę zasobów platformy Azure.

Ostrzeżenie

Usunięcie grupy zasobów jest nieodwracalne. Po usunięciu grupy zasobów wszystkie zasoby w grupie zasobów zostaną trwale usunięte. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub grupy zasobów. Jeśli zasoby zostały utworzone w istniejącej grupie zasobów zawierającej zasoby, które chcesz zachować, możesz usunąć każdy zasób indywidualnie zamiast usuwać grupę zasobów.

Usuwanie grupy zasobów

  1. Zaloguj się do witryny Azure Portal, a następnie wybierz pozycję Grupy zasobów.

  2. Wybierz grupę zasobów do usunięcia.

    Jeśli istnieje wiele grup zasobów, w polu Filtruj dla dowolnego pola wprowadź nazwę utworzonej grupy zasobów, aby ukończyć ten artykuł. Na liście wyników wyszukiwania wybierz grupę zasobów.

    Zrzut ekranu przedstawiający listę grup zasobów do wyboru do usunięcia.

  3. Wybierz pozycję Usuń grupę zasobów.

  4. W okienku Usuń grupę zasobów wprowadź nazwę grupy zasobów, aby potwierdzić, a następnie wybierz pozycję Usuń.

    Zrzut ekranu przedstawiający pole wymagające wprowadzenia nazwy zasobu w celu potwierdzenia usunięcia.

W ciągu kilku minut grupa zasobów i wszystkie jej zasoby zostaną usunięte.

Podsumowanie

W tym samouczku i artykule Rozpoczynanie pracy z wyzwalaczami usługi Azure Functions w usłudze Azure Cache for Redis pokazano, jak używać usługi Azure Cache for Redis do wyzwalania aplikacji funkcji platformy Azure. Pokazują również, jak używać usługi Azure Cache for Redis jako pamięci podręcznej zapisu w usłudze Azure SQL Database. Korzystanie z usługi Azure Cache for Redis z usługą Azure Functions to zaawansowana kombinacja, która może rozwiązać wiele problemów z integracją i wydajnością.