シリアライズされたオブジェクトのキャッシュ
複雑なオブジェクトを保存して取得します。
「シリアライズされたオブジェクトのキャッシュ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
文字列以外のデータをキャッシュする
実際のアプリでは、文字列だけでなくオブジェクトもキャッシュします。IDistributedCache はバイト列を保存するため、オブジェクトをバイト列または文字列表現にシリアライズし、取り出すときにデシリアライズする必要があります。通常は JSON を使用します。
System.Text.Json によるシリアライズ
System.Text.Json を使用してオブジェクトを JSON 文字列に変換し、SetStringAsync で保存します。
using System.Text.Json;
var product = new Product { Id = 1, Name = "Coffee", Price = 4.5m };
string json = JsonSerializer.Serialize(product);
await _cache.SetStringAsync("product:1", json);読み取り時のデシリアライズ
読み取り時には JSON 文字列を取得し、元の型にデシリアライズします。キャッシュミス時の null も忘れずに処理してください。
string json = await _cache.GetStringAsync("product:1");
if (json is null) return null;
Product product = JsonSerializer.Deserialize<Product>(json);再利用可能なジェネリックヘルパー
シリアライズとデシリアライズの処理を拡張メソッドにまとめると、呼び出し側で任意の型を簡単にキャッシュできます。
public static async Task SetAsync<T>(
this IDistributedCache cache, string key, T value,
DistributedCacheEntryOptions options)
{
string json = JsonSerializer.Serialize(value);
await cache.SetStringAsync(key, json, options);
}ジェネリック Get ヘルパー
対応する getter は T にデシリアライズし、キャッシュミス時には default を返します。
public static async Task<T> GetAsync<T>(
this IDistributedCache cache, string key)
{
string json = await cache.GetStringAsync(key);
return json is null ? default : JsonSerializer.Deserialize<T>(json);
}GetOrCreate パターン
cache-aside とシリアライズを1つのヘルパーにまとめます。キャッシュされたオブジェクトがあればそれを返し、なければファクトリを実行して結果をキャッシュし、その結果を返します。
public static async Task<T> GetOrCreateAsync<T>(
this IDistributedCache cache, string key,
Func<Task<T>> factory, DistributedCacheEntryOptions options)
{
var existing = await cache.GetAsync<T>(key);
if (existing is not null) return existing;
var created = await factory();
await cache.SetAsync(key, created, options);
return created;
}GetOrCreate の使用
呼び出し側は1行で済み、キャッシュ処理の仕組みをすべて隠蔽できます。
var product = await _cache.GetOrCreateAsync(
"product:1",
() => _repository.LoadProductAsync(1),
new DistributedCacheEntryOptions
{
AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)
});シリアライザーのオプション
単一の JsonSerializerOptions インスタンス(たとえば camelCase や null の無視)を再利用してください。キャッシュするペイロードを一貫して小さく保ち、オプションの繰り返し割り当ても避けられます。
private static readonly JsonSerializerOptions JsonOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition =
System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
};キャッシュするデータ形状のバージョン管理
キャッシュする型の形状が変わると、古い JSON のデシリアライズに失敗する可能性があります。キーにバージョンの区切りを含め(例: product:v2:1)、デプロイ時に互換性のないエントリが自然に使われなくなるようにしてください。
ペイロードを軽量に保つ
必要なフィールドだけをキャッシュしてください。ペイロードが小さいほど、Redis のネットワーク使用量とメモリ使用量を抑えられ、読み書きのたびに行うシリアライズも高速になります。
シリアライズのコストに注意する
シリアライズにはコストがかかります。非常に頻繁に実行される処理では、よりコンパクトな形式の使用や、事前にレンダリングした結果のキャッシュを検討してください。キャッシュによって全体として効果が得られていることを、必ず計測して確認します。
クイックチェック
シリアライズしたオブジェクトのキャッシュをテストしてみましょう。
まとめ
オブジェクトをキャッシュするには、書き込み時に(通常は System.Text.Json で JSON として)シリアライズし、読み取り時にデシリアライズします。ジェネリックな SetAsync<T>/GetAsync<T> と GetOrCreateAsync ヘルパーを使うと、処理の詳細を隠しながら cache-aside を簡潔に実装できます。JsonSerializerOptions を再利用し、データ形状が変わったときはキャッシュキーをバージョン管理してください。ペイロードを軽量に保ち、頻繁に実行される処理ではシリアライズのコストを計測します。
よくある質問
「シリアライズされたオブジェクトのキャッシュ」レッスンは無料ですか?
はい。「シリアライズされたオブジェクトのキャッシュ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「シリアライズされたオブジェクトのキャッシュ」で何を学びますか?
複雑なオブジェクトを保存して取得します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「シリアライズされたオブジェクトのキャッシュ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- IDistributedCache抽象化
- Redisへの接続
- キャッシュパターンと有効期限
- シリアライズされたオブジェクトのキャッシュ