使用 Redis 分散式快取

已完成

在雲端原生應用程式中,個別小組會根據自己的排程,使用他們慣用的技術來建置微服務。 微服務通常完全獨立運作。 它們可能會受益於快取,但如果它們執行個別的快取,它們可能無法達到最佳效能改善。 如果您為多個微服務提供單一快取,這些服務可以從另一個微服務所儲存的快取中擷取資訊。

假設您任職於戶外設備零售商。 您已決定在購物車微服務中使用 Redis 伺服器來實作快取。 不過,您也想要確保其他微服務可以受益於您快取的資訊。

在本單元中,您將了解分散式 Redis 快取如何優化應用程式中多個微服務的效能。 您也會瞭解 .NET Aspire 如何輕鬆地實作分散式快取。

什麼是分散式快取?

分散式快取是在數個呼叫服務之間共用的快取。 在雲端原生應用程式中,呼叫服務通常是微服務。 當您儲存一些資訊時,例如目錄中熱門產品的詳細數據、分散式快取中,應用程式中的所有微服務都可能會使用它,並從效能改進中獲得收益。

在 .NET Aspire 中設定分散式快取

若要使用分散式快取,應用程式主機專案和使用快取的微服務都需要變更。

設定應用程式主機

在解決方案的應用程式主機專案中,從安裝分散式快取裝載元件開始:

dotnet add package Aspire.Hosting.Redis --prerelease

或者,您可以使用 Visual Studio 中的 [ 新增 > .NET Aspire 元件 ] 快捷方式,從 NuGet 套件管理員安裝元件:

顯示 Visual Studio 中 NuGet 套件管理員的螢幕快照,其中顯示 .NET Aspire Redis 快取裝載元件。

安裝裝載元件之後,應用程式主機Program.cs檔案中的程式代碼會註冊快取,並將它傳遞給使用快取的專案:

// Register the cache
var redis = builder.AddRedis("redis");

// Initiate the consuming project and pass the cache
builder.AddProject<Projects.ConsumingProject>()
       .WithReference(redis);

設定取用專案

若要在微服務中安裝 .NET Aspire 分散式快取元件,請在 .NET Aspire 專案中使用如下的命令:

dotnet add package Aspire.StackExchange.Redis.DistributedCache --prerelease

同樣地,您也可以選擇使用 NuGet 套件管理員來安裝元件:

顯示 Visual Studio 中 NuGet 套件管理員的螢幕快照,其中顯示 .NET Aspire Redis 快取元件。

使用分散式快取

在您想要使用快取的任何專案中,您必須取得分散式快取物件,此物件代表 Redis 的連線。 在Program.cs檔案中,此程式代碼會註冊分散式快取:

builder.AddRedisDistributedCache("cache")

在取用項目中註冊快取之後,您可以隨時使用相依性插入來擷取分散式快取:

public class MyService(IDistributedCache cache)
{
   public async Task InitializeAsync()
   {
      // Check if there is cached content
      var cachedInfo = await cache.GetAsync("myinfo")

      if (cachedInfo is null)
      {
         // There's no content in the cache so formulate it here
         // For example, query databases.

        // Store the content in the cache
        await cache.SetAsync("myinfo", cachedInformation, new()
           { AbsoluteExpiration = DateTime.Now.AddSeconds(60) }
        );
      }
   }
}

組態

若要讓微服務連線到 Redis 分散式快取,您必須提供 連接字串 來告訴它們其位置。 上述對方法的AddRedisDistributedCache()呼叫指定了名為 redis的 連接字串。

ConnectionStrings使用組態檔中的 區段,例如在 appsettings.json 中設定 連接字串:

{
  "ConnectionStrings": {
    "redis": "redis.contoso.com:6379"
  }
}

您也可以使用 appsettings.json 來設定分散式快取元件的行為。 例如,此程式代碼會將連線設定為在五秒後逾時,然後重試三次:

{
  "Aspire": {
    "StackExchange": {
      "Redis": {
        "ConfigurationOptions": {
          "ConnectTimeout": 5000,
          "ConnectRetry": 3
        }
      }
    }
  }
}

您也可以在方法上使用內嵌委派來 AddRedisDistributedCache() 設定連線。 此程式代碼會設定與先前 JSON 範例相同的屬性:

builder.AddRedisDistributedCache(
   "redis",
   configureOptions: options => options.ConnectTimeout = 5000
);

深入了解