Udostępnij za pośrednictwem


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

Celem tego samouczka jest użycie wystąpienia usługi Azure Managed Redis (wersja zapoznawcza) lub usługi Azure Cache for Redis jako pamięci podręcznej zapisu. 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 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

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, utwórz bezpłatne konto.
  • Ukończenie poprzedniego samouczka: Rozpoczynanie pracy z wyzwalaczami usługi Azure Functions w usłudze Azure Redis przy użyciu następujących zasobów:
    • Wystąpienie usługi Azure Managed Redis (wersja zapoznawcza) lub Azure Cache for Redis
    • Wystąpienie usługi Azure Functions
    • Działająca wiedza na temat korzystania z usługi Azure SQL
    • Środowisko programu Visual Studio Code (VS Code) skonfigurowane przy użyciu zainstalowanych pakietów NuGet

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 Azure Managed Redis lub 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 Microsoft Entra 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 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

Ważne

Narzędzie konsoli nie jest jeszcze dostępne dla usługi Azure Managed Redis. Zamiast tego rozważ użycie interfejsu wiersza polecenia redis lub narzędzia, takiego jak Redis Insight , aby uruchamiać polecenia bezpośrednio w wystąpieniu usługi Redis.

  1. 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 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 Redis i użyj SET poleceń, aby napisać 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, jeśli skończysz z zasobami, możesz usunąć utworzoną grupę zasobów platformy Azure, aby uniknąć naliczania opłat.

Ważne

Usunięcie grupy zasobów jest nieodwracalne. Jeśli usuniesz grupę zasobów, wszystkie zawarte w niej zasoby 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.

Aby usunąć grupę zasobów

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

  2. Wybierz grupę zasobów, którą chcesz usunąć.

    Jeśli istnieje wiele grup zasobów, użyj pola Filtruj dla dowolnego pola... wpisz nazwę grupy zasobów utworzonej dla tego artykułu. Wybierz grupę zasobów na liście wyników.

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

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

  4. Zobaczysz prośbę o potwierdzenie usunięcia grupy zasobów. Wpisz nazwę grupy zasobów w celu potwierdzenia, a następnie wybierz pozycję Usuń.

    Zrzut ekranu przedstawiający formularz, który wymaga nazwy zasobu w celu potwierdzenia usunięcia.

Po krótkim czasie grupa zasobów i wszystkie jej zasoby zostaną usunięte.

Podsumowanie

W tym samouczku i artykule Wprowadzenie do wyzwalaczy usługi Azure Functions w usłudze Azure Redis pokazano, jak używać wyzwalaczy i powiązań usługi Redis w aplikacjach funkcji platformy Azure. Pokazują również, jak używać usługi Redis jako pamięci podręcznej zapisu w usłudze Azure SQL Database. Korzystanie z usługi Azure Managed Redis lub 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ą.