教學課程:開始在 Azure Cache for Redis 中使用 Azure Functions 觸發程序和繫結
本教學課程示範如何透過 Azure Cache for Redis 和 Azure Functions 實作基本觸發程序。 接續引導您使用 Visual Studio Code (VS Code),以 C# 撰寫和部署 Azure 函數。
在本教學課程中,您會了解如何:
- 設定必要的工具。
- 設定並連線至快取。
- 建立 Azure 函數並將程式碼部署至其中。
- 確認觸發程序的記錄。
必要條件
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請建立免費帳戶。
- Visual Studio Code \(英文\)。
設定 Azure Cache for Redis 執行個體
使用 Azure 入口網站或您慣用的 CLI 工具來建立新的 Azure Cache for Redis 執行個體。 本教學課程使用標準 C1,這是良好的起點。 使用快速入門指南來開始使用。
預設設定應已足夠。 本教學課程使用公用端點進行示範,但仍建議您針對實際執行環境的任何內容使用私人端點。
建立快取可能需要幾分鐘的時間。 您在程序完成時可以移至下一節。
設定 Visual Studio Code
如果您尚未安裝適用於 VS Code 的 Azure Functions 延伸模組,請在 [延伸模組] 功能表上搜尋 Azure Functions,並選擇 [安裝]。 如果您未安裝 C# 延伸模組,請也進行安裝。
移至 [Azure] 索引標籤。登入您的 Azure 帳戶。
若要保存您所建立的專案,請在電腦上建立新的本機資料夾。 本教學課程使用 RedisAzureFunctionDemo 作為範例。
在 [Azure] 索引標籤,選取 [工作區] 索引標籤右上角的閃電圖示以建立新函數應用程式。
選取 [建立函數...]。
選取所建立資料夾以開始建立新的 Azure Functions 專案。 您會收到多個畫面上的圖示。 選取:
- C# 作為語言。
- .NET 8.0 隔離的 LTS 做為 .NET 執行階段。
- Skip for now 作為專案範本。
如果您未安裝 .NET Core SDK,則系統也將提示您進行安裝。
重要
針對 .NET 函式,建議針對內含式模型使用隔離式背景工作角色模型。 如需內含式和隔離式背景工作角色模型的比較,請參閱 Azure Functions 上適用於 .NET 的隔離式背景工作角色模型與內含式模型之間的差異 (英文)。 此範例會使用隔離式背景工作角色模型。
確認新的專案顯示在 [總管] 窗格上。
安裝必要 NuGet 套件
您必須安裝 Microsoft.Azure.Functions.Worker.Extensions.Redis
(適用於 Redis 延伸模組的 NuGet 套件),允許使用 Redis Keyspace 通知作為 Azure Functions 中的觸發程式。
移至 VS Code 中的 [終端] 索引標籤並輸入下列命令來安裝此套件:
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Redis --prerelease
注意
Microsoft.Azure.Functions.Worker.Extensions.Redis
套件會用於 .NET 隔離式背景工作處理序函式。 .NET 內含式函式和所有其他語言都會改用 Microsoft.Azure.WebJobs.Extensions.Redis
套件。
設定快取
移至新建立的 Azure Cache for Redis 執行個體。
在 Azure 入口網站中移至快取,然後:
在資源功能表上,選擇 [進階設定]。
向下捲動至 notify-keyspace-events 方塊,然後輸入 KEA。
KEA 是設定字串,可啟用所有金鑰和事件的 Keyspace 通知。 如需 Keyspace 設定字串的詳細資訊,請參閱 Redis 文件。
選取視窗頂部的 [儲存]。
在 [資源] 功能表上尋找 [存取金鑰],然後記下或複製 [主要連接字串] 方塊的內容。 此字串用於連線至快取。
設定 Redis 觸發程序的範例程式碼
在 VS Code 中,將名為 Common.cs 的檔案新增至專案。 這個類別可用來協助剖析 PubSubTrigger 的 JSON 序列化回應。
複製以下程式碼並貼到 Common.cs 檔案中:
public class Common { public const string connectionString = "redisConnectionString"; public class ChannelMessage { public string SubscriptionChannel { get; set; } public string Channel { get; set; } public string Message { get; set; } } }
將名為 RedisTriggers.cs 的檔案新增至專案。
複製下列程式碼範例並貼至新檔案中:
using Microsoft.Extensions.Logging; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Extensions.Redis; public class RedisTriggers { private readonly ILogger<RedisTriggers> logger; public RedisTriggers(ILogger<RedisTriggers> logger) { this.logger = logger; } // PubSubTrigger function listens to messages from the 'pubsubTest' channel. [Function("PubSubTrigger")] public void PubSub( [RedisPubSubTrigger(Common.connectionString, "pubsubTest")] Common.ChannelMessage channelMessage) { logger.LogInformation($"Function triggered on pub/sub message '{channelMessage.Message}' from channel '{channelMessage.Channel}'."); } // KeyeventTrigger function listens to key events from the 'del' operation. [Function("KeyeventTrigger")] public void Keyevent( [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:del")] Common.ChannelMessage channelMessage) { logger.LogInformation($"Key '{channelMessage.Message}' deleted."); } // KeyspaceTrigger function listens to key events on the 'keyspaceTest' key. [Function("KeyspaceTrigger")] public void Keyspace( [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:keyspaceTest")] Common.ChannelMessage channelMessage) { logger.LogInformation($"Key 'keyspaceTest' was updated with operation '{channelMessage.Message}'"); } // ListTrigger function listens to changes to the 'listTest' list. [Function("ListTrigger")] public void List( [RedisListTrigger(Common.connectionString, "listTest")] string response) { logger.LogInformation(response); } // StreamTrigger function listens to changes to the 'streamTest' stream. [Function("StreamTrigger")] public void Stream( [RedisStreamTrigger(Common.connectionString, "streamTest")] string response) { logger.LogInformation(response); } }
本教學課程示範在 Redis 作業上觸發的多種方式:
PubSubTrigger
,當作業發佈至名為pubsubTest
的 Pub/Sub 通道時,便會觸發此程式碼。KeyspaceTrigger
,此程式碼建置在 Pub/Sub 觸發程序上。 使用此程式碼以尋找keyspaceTest
金鑰的變更。KeyeventTrigger
,此程式碼也會建置在 Pub/Sub 觸發程序上。 使用此程式碼以尋找DEL
命令的使用。ListTrigger
,此程式碼會尋找listTest
清單的變更。StreamTrigger
,此程式碼會尋找streamTest
資料流的變更。
連線至快取
若要在 Redis 作業上觸發,則必須傳入快取執行個體的連接字串。 此資訊會儲存在系統在資料夾自動建立的 local.settings.json 檔案。 建議您使用本機設定檔案作為安全性最佳做法。
若要連線至快取,請在 local.settings.json 檔案新增
ConnectionStrings
區段,然後使用redisConnectionString
參數新增連接字串。 區段應如此範例所示:{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "redisConnectionString": "<your-connection-string>" } }
Common.cs 中的程式碼在本機執行時會尋找此值:
public const string connectionString = "redisConnectionString";
重要
針對教學課程,已簡化此範例。 若要使用生產環境,建議您使用 Azure Key Vault 來儲存連接字串資訊,或使用 EntraID 向 Redis 執行個體進行驗證。
在本機建置和執行程式碼
切換至 VS Code 中的 [執行和偵錯] 索引標籤,然後選擇綠色箭號以在本機偵測程式碼。 如果您未安裝 Azure Functions 核心工具,系統也將提示您進行安裝。 在此情況下,您必須在安裝後重新啟動 VS Code。
程式碼應成功建置。 您可在終端輸出中追蹤其進度。
若要測試觸發程序功能,請嘗試建立並刪除
keyspaceTest
金鑰。您可使用偏好的方式以連線至快取。 一個簡單的方式是在 Azure Cache for Redis 入口網站中使用內建控制台工具。 移至 Azure 入口網站中的快取執行個體,然後選擇 [控制台] 以開啟。
開啟控制台後,請嘗試下列命令:
SET keyspaceTest 1
SET keyspaceTest 2
DEL keyspaceTest
PUBLISH pubsubTest testMessage
LPUSH listTest test
XADD streamTest * name Clippy
確認觸發程序在終端中啟用。
新增 Redis 繫結
繫結會新增簡化的方式,以讀取或寫入儲存在 Redis 執行個體上的資料。 為了示範繫結的優點,我們新增了另外兩個函式。 一個稱為 SetGetter
,其會在每次設定索引鍵時觸發,並使用輸入繫結傳回索引鍵的新值。 另一個稱為 StreamSetter
,其會在將新項目新增至串流 myStream
時觸發,並使用輸出繫結將值 true
寫入索引鍵 newStreamEntry
。
將名為 RedisBindings.cs 的檔案新增至專案。
複製下列程式碼範例並貼至新檔案中:
using Microsoft.Extensions.Logging; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Extensions.Redis; public class RedisBindings { private readonly ILogger<RedisBindings> logger; public RedisBindings(ILogger<RedisBindings> logger) { this.logger = logger; } //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("SetGetter")] public void SetGetter( [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:set")] Common.ChannelMessage channelMessage, [RedisInput(Common.connectionString, "GET {Message}")] string value) { logger.LogInformation($"Key '{channelMessage.Message}' was set to value '{value}'"); } //This example uses the PubSub trigger to listen to key events to the key 'key1'. When key1 is modified, a Redis Output binding is used to set the value of the 'key1modified' key to 'true'. [Function("SetSetter")] [RedisOutput(Common.connectionString, "SET")] public string SetSetter( [RedisPubSubTrigger(Common.connectionString, "__keyspace@0__:key1")] Common.ChannelMessage channelMessage) { logger.LogInformation($"Key '{channelMessage.Message}' was updated. Setting the value of 'key1modified' to 'true'"); return $"key1modified true"; } }
切換至 VS Code 中的 [執行和偵錯] 索引標籤,然後選擇綠色箭號以在本機偵測程式碼。 程式碼應成功建置。 您可在終端輸出中追蹤其進度。
若要測試輸入繫結功能,請嘗試設定任何索引鍵的新值,例如使用命令
SET hello world
您應該會看到SetGetter
函式觸發並傳回更新的值。若要測試輸出繫結功能,請嘗試使用命令
XADD myStream * item Order1
將新項目新增至串流myStream
。 請注意,新串流項目上觸發了StreamSetter
函式,並將true
值設定為另一個稱為newStreamEntry
的索引鍵。 此set
命令也會觸發SetGetter
函式。
將程式碼部署至 Azure 函數
建立新的 Azure 函數:
移至 [Azure] 索引標籤並展開訂用帳戶。
以滑鼠右鍵按一下 [函數應用程式],然後選擇 [在 Azure 中建立函數應用程式 (進階)]。
您會收到多個資訊的提示以設定新的函數應用程式:
- 輸入唯一名稱。
- 選取 [.NET 8 隔離式] 做為執行階段堆疊。
- 選擇 [Linux] 或 [Windows] (均可正常運作)。
- 選擇現有或新的資源群組以保留函數應用程式。
- 選擇與快去執行個體相同的區域。
- 選擇 [進階] 作為主控方案。
- 建立新的 Azure App Service 方案。
- 選擇 [EP1] 定價層。
- 選取現有的儲存體帳戶或建立新帳戶。
- 建立新 Application Insights 資源。 您使用資源以確認觸發程序正常運作。
重要
取用函數目前不支援 Redis 觸發程式。
等候幾分鐘的時間以建立新的函數應用程式。 其會顯示在訂用帳戶中的 [函數應用程式] 下方。 以滑鼠右鍵按一下新的函數應用程式,然後選擇 [部署至函數應用程式]。
應用程式隨後建置並開始部署。 您可在輸出視窗中追蹤其進度。
新增連接字串資訊
在 Azure 入口網站中,移至新的函數應用程式,然後從資源功能表中選取 [環境變數]。
在工作窗格中,移至 [應用程式設定]。
針對 [名稱],輸入 redisConnectionString。
針對 [值],輸入連接字串。
選取頁面上的 [套用] 以確認。
瀏覽至 [概觀] 窗格,然後選取 [重新啟動],以使用連接字串資訊重新啟動函數應用程式。
測試觸發程序和繫結
完成部署並新增連接字串資訊後,請在 Azure 入口網站中開啟函數應用程式。 然後從資源功能表選擇 [記錄資料流]。
等候 Log Analytics 連線,然後使用 Redis 控制台以啟用任意觸發程序。 確認此處已記錄觸發程序。
清除資源
如果您想要繼續使用在本文中建立的資源,請保留該資源群組。
否則,若要避免與資源相關的費用,如果您完成使用資源,可以刪除您所建立的 Azure 資源群組。
警告
刪除資源群組是無法回復的動作。 當您刪除資源群組時,資源群組中的所有資源都將永久刪除。 請確定您不會不小心刪除錯誤的資源群組或資源。 如果您是在具有想要保留資源的現有資源群組內建立資源,則可以個別刪除每個資源,而不必刪除整個資源群組。
刪除資源群組
登入 Azure 入口網站,然後選取 [資源群組]。
選取要刪除的資源群組。
如果有許多資源群組,請在 [篩選任何欄位] 中,輸入您建立以完成本文的資源群組名稱。 在搜尋結果清單中,選取資源群組。
選取 [刪除資源群組]。
在 [刪除資源群組] 窗格中,輸入要確認的資源群組名稱,然後選取 [刪除]。
不久後,系統便會刪除該資源群組及其所有的資源。