使用 Redis 分散式快取
在雲端原生應用程式中,個別小組會根據自己的排程,使用他們慣用的技術來建置微服務。 微服務通常完全獨立運作。 它們可能會受益於快取,但如果它們執行個別的快取,它們可能無法達到最佳效能改善。 如果您為多個微服務提供單一快取,這些服務可以從另一個微服務所儲存的快取中擷取資訊。
假設您任職於戶外設備零售商。 您已決定在購物車微服務中使用 Redis 伺服器來實作快取。 不過,您也想要確保其他微服務可以受益於您快取的資訊。
在本單元中,您將了解分散式 Redis 快取如何優化應用程式中多個微服務的效能。 您也會瞭解 .NET Aspire 如何輕鬆地實作分散式快取。
什麼是分散式快取?
分散式快取是在數個呼叫服務之間共用的快取。 在雲端原生應用程式中,呼叫服務通常是微服務。 當您儲存一些資訊時,例如目錄中熱門產品的詳細數據、分散式快取中,應用程式中的所有微服務都可能會使用它,並從效能改進中獲得收益。
在 .NET Aspire 中設定分散式快取
若要使用分散式快取,應用程式主機專案和使用快取的微服務都需要變更。
設定應用程式主機
在解決方案的應用程式主機專案中,從安裝分散式快取裝載元件開始:
dotnet add package Aspire.Hosting.Redis --prerelease
或者,您可以使用 Visual Studio 中的 [ 新增 > .NET Aspire 元件 ] 快捷方式,從 NuGet 套件管理員安裝元件:
安裝裝載元件之後,應用程式主機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 套件管理員來安裝元件:
使用分散式快取
在您想要使用快取的任何專案中,您必須取得分散式快取物件,此物件代表 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
);