Поделиться через


Руководство. Создание кэша за записью с помощью Функции Azure и Кэш Azure для Redis

Цель этого руководства — использовать экземпляр Кэш Azure для Redis в качестве кэша записи. Шаблон записи в этом руководстве показывает, как записывается в триггер кэша, соответствующий записи в базу данных SQL (экземпляр службы База данных SQL Azure).

Триггер Redis используется для Функции Azure для реализации этой функции. В этом сценарии вы узнаете, как использовать Кэш Azure для Redis для хранения сведений о инвентаризации и ценах, а также резервного копирования этих сведений в базе данных SQL.

Затем каждый новый элемент или новая цена, записанная в кэш, отражается в таблице SQL в базе данных.

В этом руководстве описано следующее:

  • Настройте базу данных, триггер и строка подключения.
  • Убедитесь, что триггеры работают.
  • Разверните код в приложении-функции.

Необходимые компоненты

Создание и настройка новой базы данных SQL

База данных SQL — это резервная база данных для этого примера. Базу данных SQL можно создать с помощью портал Azure или с помощью предпочтительного метода автоматизации.

Дополнительные сведения о создании базы данных SQL см. в кратком руководстве по созданию одной базы данных — База данных SQL Azure.

В этом примере используется портал:

  1. Введите имя базы данных и нажмите кнопку "Создать" , чтобы создать новый сервер для хранения базы данных.

    Снимок экрана: создание ресурса SQL Azure.

  2. Выберите "Использовать проверку подлинности SQL" и введите пароль и вход администратора. Не забудьте помнить эти учетные данные или записать их. При развертывании сервера в рабочей среде используйте вместо этого проверку подлинности Microsoft Entra.

    Снимок экрана: сведения о проверке подлинности для ресурса SQL Azure.

  3. Перейдите на вкладку "Сеть" и выберите общедоступную конечную точку в качестве метода подключения. Выберите "Да" для обоих правил брандмауэра, которые отображаются. Эта конечная точка позволяет получить доступ из приложения-функции Azure.

    Снимок экрана: параметр сети для ресурса SQL Azure.

  4. После завершения проверки нажмите кнопку "Просмотр и создание " и " Создать". База данных SQL начинает развертываться.

  5. После завершения развертывания перейдите к ресурсу в портал Azure и выберите вкладку редактора запросов. Создайте новую таблицу с именем инвентаризации, в которой хранятся данные, которые будут записываться в него. Чтобы создать новую таблицу с двумя полями, используйте следующую команду SQL:

    • ItemName перечисляет имя каждого элемента.
    • Price хранит цену элемента.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Снимок экрана: создание таблицы в Редактор запросов ресурса SQL Azure.

  6. После завершения выполнения команды разверните папку "Таблицы " и убедитесь, что новая таблица создана.

Настройка триггера Redis

Сначала создайте копию того же проекта VS Code, который использовался в предыдущем руководстве. Скопируйте папку из предыдущего руководства под новым именем, например RedisWriteBehindTrigger, и откройте ее в VS Code.

Во-вторых, удалите файлы RedisBindings.cs и RedisTriggers.cs .

В этом примере для активации keyevent уведомлений используется триггер pub/sub. Цели примера:

  • Активируйте каждый раз при возникновении SET события. SET Событие происходит при записи новых ключей в экземпляр кэша или изменения значения ключа.
  • SET После активации события перейдите к экземпляру кэша, чтобы найти значение нового ключа.
  • Определите, существует ли ключ в таблице инвентаризации в базе данных SQL.
    • Если да, обновите значение этого ключа.
    • Если нет, напишите новую строку с ключом и его значением.

Чтобы настроить триггер, выполните следующие действия.

  1. System.Data.SqlClient Импортируйте пакет NuGet, чтобы включить связь с базой данных SQL. Перейдите в терминал VS Code и выполните следующую команду:

      dotnet add package System.Data.SqlClient
    
  2. Создайте файл с именем RedisFunction.cs. Убедитесь, что вы удалили RedisBindings.cs и RedisTriggers.cs файлы.

  3. Скопируйте и вставьте следующий код в RedisFunction.cs , чтобы заменить существующий код:

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

Внимание

Этот пример упрощен для руководства. Для использования в рабочей среде рекомендуется использовать параметризованные запросы SQL, чтобы предотвратить атаки на внедрение SQL.

Настройка строк подключения

Необходимо обновить файл local.settings.json, чтобы включить строка подключения для базы данных SQL. Добавьте запись в Values разделе для SQLConnectionString. Файл должен выглядеть так, как показано в этом примере.

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

Чтобы найти строка подключения Redis, перейдите в меню ресурсов в ресурсе Кэш Azure для Redis. Найдите строку в области "Ключи доступа" в меню "Ресурс".

Чтобы найти строка подключения базы данных SQL, перейдите в меню ресурсов в ресурсе базы данных SQL. В разделе Параметры выберите строки Подключение ion и перейдите на вкладку ADO.NET. Строка находится в области ADO.NET (проверка подлинности SQL).

Необходимо вручную ввести пароль для базы данных SQL строка подключения, так как пароль не вставлен автоматически.

Внимание

Этот пример упрощен для руководства. Для использования в рабочей среде рекомендуется использовать Azure Key Vault для хранения строка подключения сведений или использования Azure EntraID для проверки подлинности SQL.

Сборка и выполнение проекта

  1. В VS Code перейдите на вкладку "Запуск и отладка" и запустите проект.

  2. Вернитесь к экземпляру Кэш Azure для Redis в портал Azure и нажмите кнопку консоли, чтобы ввести консоль Redis. Попробуйте использовать некоторые SET команды:

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. Еще в VS Code триггеры регистрируются. Чтобы проверить, работают ли триггеры:

    1. Перейдите в базу данных SQL в портал Azure.

    2. В меню ресурсов выберите редактор запросов.

    3. Для нового запроса создайте запрос со следующей командой SQL, чтобы просмотреть первые 100 элементов в таблице инвентаризации:

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

      Убедитесь, что элементы, записанные в экземпляр Кэш Azure для Redis, отображаются здесь.

    Снимок экрана: данные скопированы в SQL из экземпляра кэша.

Развертывание кода в приложении-функции

В этом руководстве описано, как показано в предыдущем руководстве. Дополнительные сведения см. в статье "Развертывание кода в функции Azure".

  1. В VS Code перейдите на вкладку Azure .

  2. Найдите подписку и разверните ее. Затем найдите раздел приложения-функции и разверните его.

  3. Выберите и удерживайте (или щелкните правой кнопкой мыши) приложение-функцию, а затем выберите "Развернуть в приложении-функции".

Добавление сведений о строка подключения

В этом руководстве описано, как показано в предыдущем руководстве. Дополнительные сведения см. в разделе "Добавление строка подключения сведений".redisConnectionString

  1. Откройте приложение-функцию на портале Azure. В меню ресурсов выберите переменные среды.

  2. В области "Приложение Параметры" введите SQL Подключение ionString в качестве нового поля. Введите значение строка подключения.

  3. Выберите Применить.

  4. Перейдите в колонку "Обзор" и выберите "Перезапустить", чтобы перезапустить приложение с новыми сведениями строка подключения.

Проверка развертывания

После завершения развертывания вернитесь к экземпляру Кэш Azure для Redis и используйте SET команды для записи дополнительных значений. Убедитесь, что они также отображаются в базе данных SQL.

Если вы хотите убедиться, что приложение-функция работает правильно, перейдите к приложению на портале и выберите поток журналов в меню ресурсов. Вы должны увидеть триггеры, запущенные там, и соответствующие обновления, внесенные в базу данных SQL.

Если вы когда-либо хотите очистить таблицу базы данных SQL, не удаляя ее, можно использовать следующий SQL-запрос:

TRUNCATE TABLE [dbo].[inventory]

Очистка ресурсов

Если вы хотите продолжить использовать ресурсы, созданные в этой статье, сохраните группу ресурсов.

В противном случае, если вы закончите работу с ресурсами, можно удалить созданную группу ресурсов Azure, чтобы избежать расходов.

Внимание

Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все содержащиеся в ней ресурсы удаляются без возможности восстановления. Будьте внимательны, чтобы случайно не удалить не ту группу ресурсов или не те ресурсы. Если вы создали ресурсы внутри существующей группы ресурсов, содержащей ресурсы, которые необходимо сохранить, можно удалить каждый ресурс по отдельности, а не удалить группу ресурсов.

Удаление группы ресурсов

  1. Войдите на портал Azure и щелкните Группы ресурсов.

  2. Выберите группу ресурсов, которую нужно удалить.

    Если существует множество групп ресурсов, используйте фильтр для любого поля... введите имя группы ресурсов, созданной для этой статьи. Выберите группу ресурсов в списке результатов.

    Снимок экрана: список групп ресурсов для удаления в рабочей области.

  3. Выберите команду Удалить группу ресурсов.

  4. Подтвердите операцию удаления группы ресурсов. Введите имя группы ресурсов, которую необходимо удалить, и щелкните Удалить.

    Снимок экрана: форма, для которой требуется имя ресурса для подтверждения удаления.

Через некоторое время группа ресурсов и все ее ресурсы будут удалены.

Итоги

В этом руководстве и начале работы с триггерами Функции Azure в Кэш Azure для Redis показано, как использовать Кэш Azure для Redis для активации приложений-функций Azure. Они также показывают, как использовать Кэш Azure для Redis в качестве кэша записи с База данных SQL Azure. Использование Кэш Azure для Redis с Функции Azure — это мощная комбинация, которая может решить множество проблем интеграции и производительности.