Kurz: Vytvoření mezipaměti za zápisem pomocí Azure Functions a Azure Cache for Redis
Cílem tohoto kurzu je použít instanci 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í služby Azure Cache for 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 ve službě Azure Cache for Redis se zřízenými prostředky:
- Instance 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:
Zadejte název databáze a vyberte Vytvořit nový a vytvořte nový server pro uložení databáze.
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.
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.
Po dokončení ověření vyberte Zkontrolovat a vytvořit a pak vytvořit. Databáze SQL se začne nasazovat.
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) );
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. KSET
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:
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
Vytvořte nový soubor s názvem RedisFunction.cs. Ujistěte se, že jste odstranili soubory RedisBindings.cs a RedisTriggers.cs .
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 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 použití Azure EntraID pro ověřování SQL.
Sestavení a spuštění projektu
Ve VS Code přejděte na kartu Spustit a ladit a spusťte projekt.
Vraťte se k instanci Azure Cache for 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
Zpět ve VS Code se triggery registrují. Ověření fungování triggerů:
Na webu Azure Portal přejděte do databáze SQL.
V nabídce prostředků vyberte Editor dotazů.
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 tady zobrazují položky zapsané do vaší instance Azure Cache for Redis.
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.
Ve VS Code přejděte na kartu Azure .
Vyhledejte své předplatné a rozbalte ho. Pak najděte část Aplikace funkcí a rozbalte ji.
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 redisConnectionString
v tématu Přidání připojovací řetězec informací.
Přejděte do aplikace funkcí na webu Azure Portal. V nabídce prostředků vyberte Proměnné prostředí.
V podokně Nastavení aplikace zadejte jako nové pole sqlConnectionString. Jako hodnotu zadejte připojovací řetězec.
Vyberte Použít.
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 Azure Cache for 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ů.
V opačném případě můžete zabránit poplatkům souvisejícím s prostředky, pokud jste dokončili používání prostředků, můžete odstranit skupinu prostředků Azure, kterou jste vytvořili.
Upozorňující
Odstranění skupiny prostředků je nevratné. Když odstraníte skupinu prostředků, všechny prostředky ve skupině prostředků se 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 místo odstranění skupiny prostředků odstranit jednotlivé prostředky.
Odstranění skupiny prostředků
Přihlaste se k portálu Azure Portal a potom vyberte Skupiny prostředků.
Vyberte skupinu prostředků, která se má odstranit.
Pokud existuje mnoho skupin prostředků, zadejte do pole Filtr libovolné pole název skupiny prostředků, kterou jste vytvořili pro dokončení tohoto článku. V seznamu výsledků hledání vyberte skupinu prostředků.
Vyberte Odstranit skupinu prostředků.
V podokně Odstranit skupinu prostředků zadejte název skupiny prostředků, abyste ji potvrdili, a pak vyberte Odstranit.
Během několika okamžiků se odstraní skupina prostředků a všechny její prostředky.
Shrnutí
Tento kurz a začínáme s triggery Azure Functions ve službě Azure Cache for Redis ukazuje, jak pomocí Azure Cache for Redis aktivovat aplikace funkcí Azure. Ukazují také, jak používat Azure Cache for Redis jako mezipaměť za zápisem ve službě Azure SQL Database. Použití služby Azure Cache for Redis se službou Azure Functions je výkonná kombinace, která dokáže vyřešit řadu problémů s integrací a výkonem.