統合メモリ内キャッシュと分散キャッシュに Redis を使用して .NET 9 でハイブリッド キャッシュを構築する
Hybrid cache
ハイブリッド キャッシュは、メモリ内および外部ソースのデータをキャッシュするための統合ライブラリであり、多層キャッシュとも呼ばれます。言い換えれば、この多層キャッシュは IDistributedCache と IMemoryCache に代わるものです。また、.NET でのキャッシュの使用を簡素化することも目的としています。分散キャッシュの古いアプローチでは、コンテンツが適切にキャッシュされて取得されることを保証するために追加のコードを記述する必要がありました。このパッケージは、.NET でのキャッシュを簡素化し、堅牢なキャッシュ ソリューションを作成するための素晴らしい追加機能です。 Microsoft を使用して、ハイブリッド cache.Extensions.Caching.Hybrid nuget パッケージを実装します。この記事では、ハイブリッド キャッシュ パッケージのすべての機能について説明します。
パッケージの機能
- 拡張可能なコード: メモリ内キャッシュ用に記述されたコードは、Redis、SQL Server などの外部キャッシュ サーバーと統合するために変更せずにそのまま使用できます。
- 同時実行管理: ハイブリッド キャッシュを使用するには、依存関係サービスとしてハイブリッド キャッシュ クラスを使用する必要があります。このクラスは、キーのデータを取得するためにインスタンスのみが使用され、同じエントリに対して同時リクエストが行われないことを保証します。すべての同時リクエストは、このリクエストが完了するまで待機します。
- マルチソース キャッシュ/プライマリ-セカンダリ ソース キャッシュ: アプリケーションが複数のデータ ソースをキャッシュ用に構成している場合、データはすべての場所に保存されます。
データを取得するには、まずプライマリ ソースでデータをチェックします。そのデータが利用できない場合、リクエストは次の図に示すように二次ソースに転送されます (シナリオ 1 が青、シナリオ 2 が赤)。
コードのセットアップ
開始するには、まず Microsoft.Extensions.Caching.Hybrid パッケージをインストールします。
Program.cs で、以下のコードを記述してハイブリッド キャッシュを追加します。
builder.Services.AddHybridCache(); ハイブリッド キャッシュを構成するには、セットアップ アクションとして AddHybridCache 内に以下のコードを記述します。 Below is an example.
builder.Services.AddHybridCache(options =>
{
options.ReportTagMetrics = true;
options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions
{
Expiration = TimeSpan.FromSeconds(30),
LocalCacheExpiration = TimeSpan.FromSeconds(30),
};
});
インメモリ キャッシュを実装する
上記の依存関係サービスの構成は、メモリ内キャッシュを実行するのに十分です。以下は、アプリケーション メモリ内のキーと値を設定および取得するための API コントローラのサンプル コードです。
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;
namespace HybridCacheDemoApplication.Controllers
{
[ApiController]
[Route("[controller]")]
public class CacheController : ControllerBase
{
private readonly HybridCache _cache;
const string cacheKey = "ping";
public CacheController(HybridCache cache)
{
_cache = cache;
}
[HttpGet(Name = "GetPingKey")]
public async Task<IActionResult> Get()
{
var keydata = await _cache.GetOrCreateAsync<string>(
cacheKey, // Unique key to the cache entry
async cancel => await Task.FromResult("pong from get")
);
return Ok(new {message = $"{cacheKey} data: {keydata}"});
}
[HttpGet("set",Name = "SetPingKey")]
public async Task<IActionResult> Set()
{
await _cache.SetAsync<string>(cacheKey, "ping");
return Ok(new { message = $"{cacheKey} is set" });
}
}
}
このコードがどのように機能するかを理解するには、以下の表を順番に参照してください。
キャッシュ実行デモテーブル
シーケンスエンドポイント出力の説明 1 http://localhost:5154/cache/
{
"message": "ping data: pong from get"
} このエンドポイントは、値が設定されていない場合、キャッシュ値を「pong from get」として設定します。したがって、「pong from get」と出力されます 2 http://localhost:5154/cache/set
{
"message": "ping is set"
} このエンドポイントはキャッシュ内の値を設定します。 3 http://localhost:5154/cache/
{
"message": "ping data: ping"
} これは 1 つのステップで呼び出したのと同じエンドポイントですが、今回は値がすでにキャッシュに存在しています。 キャッシュ キーの削除:キャッシュ キーを削除するには、以下の実装を使用します。
[HttpGet("del",Name="DeletePingKey")]
public async Task<IActionResult> RemoveKey()
{
await _cache.RemoveAsync(cacheKey); //Removes data
return Ok(new {message=$"{cacheKey} removed"});
} Redis サーバーを使用した分散キャッシュ
分散キャッシュを実装するには、追加の依存関係サービス構成を実行する必要があります。この例では、Redis キャッシュを外部キャッシュ ソースとして使用します。
次に、Microsoft.Extensions.Caching.StackExchangeRedis
を使用して Redis パッケージを構成します。インストールしたら、以下のコードを追加して Redis を追加する必要があります。接続文字列は、{HOST_NAME}:{PORT_NUMBER},password={PASSWORD}
の形式になります。
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration =
builder.Configuration.GetConnectionString("RedisConnectionString");
}); 次に、http://localhost:5154/cache/set を呼び出します。データは Redis キャッシュにシームレスに設定されます。以下は Redis でどのように見えるかです

このシナリオでは、分散キャッシュ サーバー、つまり Redis の依存関係を追加するだけで、コードがいかにシームレスに機能したかに注目してください。
Serialization
外部キャッシュ サーバーにデータを送信するために、このパッケージは byte[]、string、および System.Text.Json を使用します。これは、AddHybridCache 依存関係サービスに加えて .AddSerializer() または AddSerializerFactory() メソッドを使用してさらにカスタマイズできます。より最適化されたシリアライザーを使用すると、アプリケーションのパフォーマンスが向上します。
その他のカスタマイズ
依存関係を構成するときにフラグを設定することで、キャッシュ サービスの動作をさらにカスタマイズできます。以下は、キャッシュの圧縮を無効にするサンプル フラグの 1 つです。
Note. これはベスト プラクティスではありませんが、圧縮が不要または使用されない場合のシナリオに応じて異なる場合があります。
builder.Services.AddHybridCache(options =>
{
options.ReportTagMetrics = true;
options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions
{
Flags = Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryFlags.DisableCompression
};
}); 実験的機能:タグ - 相互に関連するキーの操作
場合によっては、相互に関連する多数のキーを扱うことがあります。 例: 電子商取引アプリケーションでは、ユーザーのカート アイテムに対応する多くのフィールドをキャッシュしました。このために、タグを作成できます。
以下のコードは、相互に関連するキーを操作するために、「testdata」という名前のタグを作成しました。さまざまなシナリオに適用できるグループ化のタイプに応じて、複数のタグを追加できます。このコードは一目瞭然ですが、混乱がある場合は、コメントで言及してください。
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;
namespace HybridCacheDemoApplication.Controllers
{
[ApiController]
[Route("[controller]")]
public class CacheController : ControllerBase
{
private readonly HybridCache _cache;
const string cacheKey = "ping";
public CacheController(HybridCache cache)
{
_cache = cache;
}
[HttpGet(Name = "GetPingKey")]
public async Task<IActionResult> Get()
{
var keydata = await _cache.GetOrCreateAsync<string>(
cacheKey, // Unique key to the cache entry
async cancel => await Task.FromResult("pong from get"),
tags: ["testdata"]
);
return Ok(new {message = $"{cacheKey} data: {keydata}"});
}
[HttpGet("set",Name = "SetPingKey")]
public async Task<IActionResult> Set()
{
await _cache.SetAsync<string>(cacheKey,
"ping",
tags: ["testdata"]
);
return Ok(new { message = $"{cacheKey} is set" });
}
[HttpGet("del",Name="DeletePingKey")]
public async Task<IActionResult> RemoveKey()
{
await _cache.RemoveAsync(cacheKey);
return Ok(new {message=$"{cacheKey} removed"});
}
[HttpGet("delbytag", Name = "DeleteByTestTags")]
public async Task<IActionResult> RemoveKeyByTags()
{
await _cache.RemoveByTagAsync(["testdata"]);
return Ok(new { message = $"{cacheKey} removed" });
}
}
}
最後まで読んでいただきありがとうございます。このハイブリッド キャッシュには驚くべきメリットがあり、皆さんにもお役に立てれば幸いです。
-
Upstash を使用して強力な RAG チャットボットを作成する:ステップバイステップ ガイド
この投稿では、Upstash Vector、Upstash Redis、Hugging Face Inference API、複製 LLAMA-2-70B チャット モデル、および Vercel を使用して、オープンソースのカスタム コンテンツ RAG チャットボットを構築した方法について説明します。 Upstash Vector は、ベクターの挿入とクエリ、各ユーザー メッセージの関連コンテキストの動的作成または更新に役立ち、Upstash Redis はチャットボットの会話の保存に役立ちました。 前提条件 次のものが必要です。 Node.js 18 以降 Upstash アカウント ハ
-
FastlyComputeでRedisを使用する
この例では、古いバージョンのFastlyCLIを使用しています。最新バージョンについては、この記事を確認してください。 この投稿では、Fastly Compute@Edgeで実行される簡単なアプリケーションを作成します。アプリケーションはUpstashRedisにアクセスして、ページビューを追跡します。 モチベーション エッジコンピューティングは、近年最もエキサイティングなトレンドの1つです。 CloudflareやFastlyなどのCDNサービスは、ユーザーがエッジインフラストラクチャでアプリケーションを実行できるようにするために開始されました。これは、開発者がグローバルに分散された高