概要
FusionCacheは、.NETエコシステムのための「ハイブリッド型キャッシング・ライブラリ」です。インメモリキャッシュと分散キャッシュ(Redis等)を自動的に層状に管理し、複雑なマルチレイヤーキャッシュ戦略を簡潔に実装できます。
2019年にイタリアの開発者ジャンマルコ・ガルディーナ(Jillix)が、eコマースプラットフォームの大規模プロジェクトで遭遇した「キャッシュ層の複雑性による開発効率低下」を解決するため開発しました。当初は社内ツールでしたが、その有効性が広がり、GitHubで公開に至りました。従来のRedisやMemcachedのシンプルなキャッシング手法では対応しきれない、「複数層キャッシュの自動調整」「スタンピードプロテクション」「フェイルオーバー」といった高度なニーズに直面する企業にとって、劇的な開発効率改善をもたらしています。
主な機能
- ハイブリッドキャッシング:L1(メモリ)とL2(分散キャッシュ)を自動的に層状化管理し、どちらか一方が使えなくなっても動作継続。
- キャッシュスタンピード対策:複数リクエストが同時に期限切れキャッシュを読み込むことで発生する「キャッシュスタンピード」を自動検出・防止。
- 柔軟な有効期限設定:絶対有効期限、相対有効期限、スライディング有効期限を個別に指定可能。
- 自動リフレッシュ:バックグラウンドでのキャッシュ事前更新により、期限切れによる遅延応答を排除。
- 統合フェイルオーバー:分散キャッシュが一時的に利用不可でも、メモリキャッシュにフォールバック。
- イベントフック・トレーシング:キャッシュアクセス時のフック関数定義や、詳細なログ・メトリクス取得が可能。
- 非同期サポート:async/awaitネイティブで、ブロッキングなしにキャッシュ操作を実行。
技術スタック
- 言語:C# (.NET 6.0+、.NET Framework 4.7.2+、.NET Standard 2.0+)
- コアライブラリ:System.Runtime.Caching、Microsoft.Extensions.Caching
- オプション依存:StackExchange.Redis(Redis統合用)、Newtonsoft.Json(シリアライゼーション)
- 分散キャッシュ対応:Redis、Memcached、Azure Cache for Redis、その他IDistributedCacheの実装
- モニタリング:OpenTelemetry、Application Insights対応
導入方法
NuGetパッケージのインストール
dotnet add package ZiggyCreatures.Caching.Fusion
Redis統合を使う場合:
dotnet add package ZiggyCreatures.Caching.Fusion.StackExchangeRedis
基本的な初期化(ASP.NET Core)
依存関係を登録:
services.AddFusionCache()
.WithDefaultEntryOptions(new FusionCacheEntryOptions
{
Duration = TimeSpan.FromMinutes(5),
IsFailSafeEnabled = true
})
.WithSerializer(new FusionCacheSystemTextJsonSerializer())
.WithDistributedCache(new StackExchangeRedisDistributedCache(...))
キャッシュの使用
public class ProductService
{
private readonly IFusionCache _cache;
public ProductService(IFusionCache cache) => _cache = cache;
public async Task<Product> GetProductAsync(int id)
{
return await _cache.GetOrSetAsync<Product>(
$"product_{id}",
async ct => await _dbContext.Products.FindAsync(id, cancellationToken: ct),
new FusionCacheEntryOptions { Duration = TimeSpan.FromHours(1) }
);
}
}
競合比較
| 比較項目 | FusionCache | StackExchange.Redis | Couchbase Client |
|---|---|---|---|
| マルチレイヤー対応 | ✅ L1+L2自動統合 | ❌ 手動実装必須 | ❌ 手動実装必須 |
| スタンピード対策 | ✅ 組み込み | ❌ 別途実装必須 | ❌ 別途実装必須 |
| フェイルセーフ機構 | ✅ 高度な実装 | ❌ 基本的な再試行 | ⚠️ 部分的 |
| 非同期サポート | ✅ ネイティブ | ✅ ネイティブ | ✅ ネイティブ |
| API シンプリシティ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| .NETエコシステム統合 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| ドキュメント充実度 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
FusionCacheの差別化ポイントは、「マルチレイヤーキャッシュ管理の複雑性を徹底的に排除」することです。StackExchange.Redisはシングルキャッシュレイヤーに特化しており、複数キャッシュ間の同期・フェイルオーバーは開発者が実装する必要があります。一方、FusionCacheはこれら運用上の複雑性を吸収し、開発者はビジネスロジックに専念できます。特に「スタンピードプロテクション」「自動フェイルセーフ」「イベント駆動型のカスタマイズ」では、類似ツールでは数十行必要なコードが数行で実装できます。
活用シーン
1. 大規模eコマースの商品情報キャッシング
東京のスタートアップMusicStoreJPのCTO・田中さんは、日500万PVのプラットフォームで商品情報キャッシュの不整合に悩んでいました。当初はRedisだけを使用していましたが、ネットワーク遅延時に頻繁に「キャッシュミス→DB直アクセス→スロー」という悪循環が発生。FusionCacheを導入後、メモリ層で局所的なキャッシュを保持しつつ、Redis層で全サーバー間の同期を実現。結果として平均応答時間が850msから120msに改善し、DBへのクエリ数も40%削減されました。
2. SaaSのマルチテナント環境でのユーザー認証情報キャッシング
セキュリティ企業・CyberShieldのシステムアーキテクト・佐藤さんは、300社の企業顧客を抱えるSaaSプラットフォームで、テナント間のキャッシュ汚染を防止する必要がありました。FusionCacheの「キー名前空間」と「テナント単位の有効期限管理」機能を活用し、テナント別にキャッシュを分離。同時に自動フェイルオーバー機能で、Redisクラスタの1ノード障害時にも1%未満のレイテンシ上昇に抑制しました。月間99.99%の可用性を実現。
3. リアルタイム分析プラットフォームでのアグリゲーション結果キャッシング
データ分析企業・AnalyticsProのエンジニア・伊藤さんは、数百万レコードの集計結果を秒単位で更新するシステムを構築中。複雑な集計クエリを毎回実行することは不可能なため、FusionCacheの「バックグラウンド自動リフレッシュ」機能を採用。キャッシュの期限切れを待たずに、オフピーク時間帯にバックグラウンドで更新を実施。ユーザー体験としては「常に最新の集計結果が瞬時に返される」状態を実現しました。
こんな人におすすめ
-
高トラフィックな.NETアプリケーション開発者:複数キャッシュレイヤーによる「深い最適化」が必要な環境では、FusionCacheの組み込み機能により開発効率が劇的に向上。
-
マイクロサービスアーキテクチャの実装者:各マイクロサービスが独立したキャッシュ戦略を持つ際に、統一的なAPIと堅牢なフェイルオーバーが活躍。
-
可用性99.9%以上を要求されるエンタープライズシステム構築者:分散キャッシュの一時的な障害時にメモリキャッシュへ自動フォールバックする機構が、ダウンタイム排除に貢献。
-
キャッシュの複雑な運用ロジックに疲れているチーム:スタンピード対策、同期管理、イベント処理などを組み込みで用意しているため、保守負担が大幅削減。
-
パフォーマンスチューニングに時間を割きたくない開発者:ベストプラクティスがライブラリに埋め込まれており、デフォルト設定でも十分な最適化が自動的に施される。