MongoDBは人気のある NoSQL データベース、特に現代の .NET アプリケーション。しかし、依然としてディスクベースであるため、柔軟性があるにもかかわらず、大量のトラフィックが発生する状況ではパフォーマンスの問題が発生する可能性があります。 スケーラビリティ、そして強力 照会する 機能。これが NCache分散型インメモリ キャッシュ ソリューションである が登場します。
UnitXの NCache MongoDBのキャッシュ層として、.NETアプリケーションはデータベースクエリを大幅に削減し、応答時間を改善し、大量のトランザクションを効率的に管理できます。この記事では、MongoDBを統合する方法について説明します。 NCache MongoDB を使用する場合、クエリ結果をキャッシュするためのベスト プラクティスと、キャッシュとデータベースの同期を維持するための戦略について説明します。
このガイドでは、MongoDBのデータをいつキャッシュすべきか、どのデータをキャッシュすべきでないか、そして.NETアプリケーションがキャッシュとデータベースを安全に同期させる方法について説明します。これは、読み取り負荷の高いAPI、ダッシュボード、高トラフィックのマイクロサービスに特に役立ちます。つまり、MongoDBは記録システムであり、 NCache 高速なメモリ内読み取り層として機能します。
主要なポイント(要点)
- MongoDBはディスクベースであり、 これは、高トラフィックの.NETアプリケーションではパフォーマンスのボトルネックとなることがよくあります。そこで、インメモリキャッシュ層を導入することで、データベースの負荷を大幅に軽減できます。
- NCache MongoDBのメモリ内分散キャッシュとして機能します。 頻繁にアクセスされるデータをデータベースではなくキャッシュから提供できるようになり、パフォーマンスが向上し、スケーラビリティが向上します。
- クライアントキャッシュ NCache InProc速度を提供 アプリケーションにとっては、アプリケーション プロセス内に存在しながらも分散キャッシュと同期された状態を維持するためです。
- キャッシュアサイドパターンは一般的に使用される MongoDBでは、アプリケーションが最初にチェックする NCache データがキャッシュ内に見つからない場合のみ MongoDB に送られます。
- MongoDBの変更ストリームはキャッシュデータの同期を保つために使用できます。 MongoDB でドキュメントが挿入、更新、または削除されるたびに、リアルタイムのキャッシュ更新を有効にします。
- NCache キャッシュされたMongoDBデータに対してSQLスタイルのクエリを実行できます。 MongoDB に直接クエリを実行せずに、キャッシュされたオブジェクトをよりインテリジェントにフィルタリングおよび検索できるようになります。
- コレクション全体または個々のドキュメントをキャッシュするかどうかは、アクセス パターンによって異なります。 一括キャッシュによりバッチ読み取りが改善され、タグを使用したアイテムレベルのキャッシュによりきめ細かな制御と選択的な無効化が可能になります。
- NCache MongoDBを使用する.NETアプリケーションに適しています。 ネイティブ .NET オブジェクト キャッシュと、Read-Through や Write-Behind などのサーバー側キャッシュ機能を提供します。

図: MongoDB を使用した分散キャッシュ
MongoDB のパフォーマンスにとってキャッシュが重要な理由
.NET アプリケーションにとって、次の理由から有益です。
- 柔軟なドキュメントベースのストレージ: スキーマレス設計により、データ編成が簡素化されます。
- 分散アーキテクチャ: 有効にする レプリケーション (NAIST) と 分割 スケーラビリティのために。
- インデックス &集約フレームワーク: 複雑になる クエリ 効率的。
- 変更ストリーム: 変更ストリームを介してリアルタイムのデータ変更をキャプチャします。
MongoDB パフォーマンスのボトルネック
次のようなパフォーマンスの問題があります。
- 読み取り/書き込みレイテンシとディスク I/O オーバーヘッド: MongoDB はディスクベースのデータベースであるため、頻繁な読み取りおよび書き込み操作は、インメモリ ソリューションと比較してレイテンシの増加につながります。データ量が増加するとディスク I/O オーバーヘッドが増加し、応答時間と全体的なシステム パフォーマンスに影響します。
- 大規模データセットクエリ: データセットのサイズが大きくなると、より多くのドキュメントをスキャンして処理するのに時間がかかるため、クエリの実行時間が長くなります。 インデックス この点では便利ですが、特に大量のデータをフィルタリングまたは集約する場合は必ずしも十分ではありません。
- 拡張性 課題: シャーディングを使用した水平スケーリングのサポートが組み込まれていますが、巨大なクラスターを扱うとレプリケーションの問題が発生する可能性があります。 負荷分散、ネットワークの複雑さなど、さまざまな要因が関係します。トラフィック量が増加すると、パフォーマンスの最適化が重要になります。
- 頻繁にアクセスされるデータの高レイテンシ: 頻繁にアクセスされるデータに対するクエリは、より高速なストレージ レイヤーから提供されるのではなく、データベースに繰り返しアクセスすると、パフォーマンスの低下につながる可能性があります。これにより、リソース使用率が増加し、応答時間が遅くなります。
使用することの利点 NCache MongoDB を使用した場合
NCache、 インメモリ分散キャッシュは、MongoDB アプリケーションに最適なオプションです。
- インメモリパフォーマンス: NCache 100% インメモリ キャッシュ ソリューションであり、ディスク I/O を排除し、超低レイテンシを実現してデータ取得を高速化します。
- クライアントキャッシュ(InProc Speed): アプリケーション プロセス内のアプリケーション サーバーに常駐し、ネットワーク呼び出しを最小限に抑え、迅速なアクセスを保証します。
- 線形スケーラビリティ: データ負荷の増加に応じてキャッシュ サーバーを追加することで動的にスケールアウトし、ボトルネックを防ぎ、高いパフォーマンスを確保します。
- 高可用性: 自動レプリケーションとフェイルオーバーにより中断のないアクセスが保証され、サーバー障害時でもキャッシュが動作し続けます。
アーキテクチャ: MongoDBでのキャッシュの仕組み NCache
NCache 動的なアーキテクチャにより、アプリケーションにシームレスに適合します。
- お客様サポート リードスルー (NAIST) と ライトスルー 直接的なデータベースクエリを削減するためのキャッシュ。
- .NET 8とシームレスに統合し、 クラウド環境 (Azure, AWS, Kubernetes).
ステップバイステップ: MongoDBキャッシュの実装 NCache
MongoDBのキャッシュを簡単に実装するには NCache 以下に示します。
MongoDB でのクエリ結果のキャッシュ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
ICache cache = CacheManager.GetCache("MongoDBCache"); string cacheKey = "Customer:EINSTEIN"; Customer customer = cache.Get<Customer>(cacheKey); if (customer == null) { var collection = new MongoClient("mongodb://your-mongodb-url") .GetDatabase("ECommerceDB") .GetCollection<Customer>("Customers"); customer = await collection.Find(x => x.Id == "EINSTEIN").FirstOrDefaultAsync(); if (customer != null) { cache.Insert(cacheKey, new CacheItem(customer) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)) }); } } |
MongoDB コレクションを単一アイテムとしてキャッシュする
MongoDBコレクションは簡単にキャッシュできます。コレクション全体を単一のキャッシュアイテムとして保存することで、1回の操作で素早く取得できるため、キャッシュ検索の回数が減り、バッチ処理やUIレンダリングのパフォーマンスが向上します。
|
1 2 3 4 5 6 7 8 9 10 |
var customersInGermany = await collection.Find(x => x.Country == "Germany").ToListAsync(); if (customersInGermany.Count > 0) { ICache cache = CacheManager.GetCache("MongoDBCache"); var cacheItem = new CacheItem(customersInGermany) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }; cache.Insert("Customers:Germany", cacheItem); } |
MongoDB コレクションアイテムを個別にキャッシュする
MongoDBコレクションは簡単にキャッシュできます。各アイテムを個別に保存することで個別のアクセスを確保しながら、タグを使用して関連アイテムをグループ化することで、一括取得を高速化し、クエリパフォーマンスを向上させます。
|
1 2 3 4 5 6 7 8 9 |
foreach (var customer in customersInGermany) { var cacheItem = new CacheItem(customer) { Tags = new Tag[] { new Tag("Customer:Country:Germany") }, Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }; cache.Insert($"Customer:CustomerID:{customer.Id}", cacheItem); } |
変更ストリームを使用してキャッシュとデータベースの同期を維持する
MongoDBとキャッシュ間のデータの一貫性を確保するために、変更ストリームは、変更を検出してリアルタイムの同期を可能にします。 インサート, アップデート, 削除するデータが変更されるたびに、 NCache 対応するキャッシュ エントリを削除または更新して、古いデータの問題を防ぐことができます。
|
1 2 3 4 5 6 7 8 9 |
var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<Customer>>() .Match("{ operationType: { $in: ['insert', 'update', 'replace', 'delete'] } }"); var cursor = collection.Watch(pipeline); await cursor.ForEachAsync(change => { string cacheKey = $"Customer:CustomerID:{change.FullDocument.Id}"; cache.Remove(cacheKey); }); |
キャッシュされたデータのクエリ NCache
NCache ユーザーは SQL クエリを使用してキャッシュされたデータをクエリできるため、データベースの負荷が軽減され、アプリケーションのパフォーマンスが向上します。インデックス付きクエリにより、キャッシュされたオブジェクトの検索とフィルタリングが高速化されます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Connect to NCache ICache cache = CacheManager.GetCache("MongoDBCache"); // Define NCache search query string query = "SELECT * FROM Models.Customer WHERE Country = ?"; var queryCommand = new QueryCommand(query); queryCommand.Parameters.Add("Country", "Germany"); // Execute query on cache ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); while (reader.Read()) { string contactName = reader.GetValue<string>("ContactName"); Console.WriteLine($"Contact Name: {contactName}"); } |
設定方法 NCache MongoDB 用ですか?
設定するには NCache MongoDB の場合は、以下の手順に従ってください。
A. インストール NCache クライアント
インストールするには NCache .NET アプリケーションのクライアントでは、NuGet を使用して必要なパッケージを追加します。
|
1 |
Install-Package Alachisoft.NCache.SDK |
インストールしたら、アプリケーションを設定して NCache データをキャッシュするため。
B. インストール NCache サーバー
インストールするには NCache Linux上のサーバー:
|
1 2 3 |
docker pull alachisoft/ncache:latest docker run -d --name ncache-server --network host alachisoft/ncache:latest docker exec -it ncache-server ncache service start |
C. 設定 NCache MongoDB用
MongoDBを統合するには NCache、 次の手順を実行します:
- キャッシュの作成と構成:
|
1 2 |
New-Cache -Name MongoDBCache -Size 1024 -Topology PartitionReplica -Server 192.168.1.2 Add-Node -CacheName MongoDBCache -Server 192.168.1.3 |
- 使用する.NETアプリケーションを変更する NCache:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
ICache cache = CacheManager.GetCache("MongoDBCache"); var collection = new MongoClient("mongodb://your-mongodb-url") .GetDatabase("ECommerceDB") .GetCollection<Customer>("Customers"); var customer = await collection.Find(x => x.Id == "EINSTEIN").FirstOrDefaultAsync(); if (customer != null) { cache.Insert("Customer:EINSTEIN", new CacheItem(customer) { Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(10)) }); } |
結論
使い方 NCache MongoDB を使用すると、データベースの負荷が軽減され、応答時間が短縮され、リアルタイムのデータ一貫性が確保されるため、アプリケーションのパフォーマンスが向上します。メモリ内キャッシュを活用することで、アプリケーションはデータ アクセスの高速化、レイテンシの低減、シームレスなスケーラビリティのメリットを享受できます。 NCacheの分散アーキテクチャは、高可用性を提供し、フォールト トレランスを保証するため、MongoDB を利用する最新の高トラフィック .NET アプリケーションに最適です。
よくある質問(FAQ)
Q: なぜ使うのか NCache MongoDB はすでにスケーラブルですか?
A: MongoDB は拡張性に優れていますが、最終的にはディスク I/O がボトルネックになります。 NCache 読み取り負荷の高いトラフィックをメモリにオフロードすることで大幅に高速化し、データベースが書き込み操作と複雑なクエリに集中できるようになります。
Q: キャッシュはどのようにしてデータベースと同期を保つのですか?
A: 第6節で詳述されているように、 NCache MongoDB 変更ストリームを活用してデータベース内のリアルタイムの更新をリッスンし、それに応じてキャッシュされたアイテムを無効化または更新して、データの一貫性を確保できます。
Q: MongoDB データで SQL を使用できますか?
A: MongoDBで直接SQLを実行することはできませんが、オブジェクトが内部に格納されると NCacheは、使用することができます NCache標準の SQL 構文を使用してデータを検索およびフィルタリングする SQL クエリ機能。
Q:です NCache より良い Redis .NET MongoDB アプリケーション用ですか?
A: NCache 100%ネイティブ.NETであるため、.NET環境では好まれることが多いが、 Redis Linuxベースです。つまり NCache Visual Studioエコシステムにシームレスに適合し、複雑な.NETオブジェクトのシリアル化を改善し、サーバー側の.NETコード(リードスルー/ライトビハインドプロバイダなど)をキャッシュノード上で直接実行できるようにします。 Redis ネイティブではできません。
Q: キャッシュする前に MongoDB BSON ドキュメントを変換する必要がありますか?
A: Yes.
NCache ネイティブの.NETオブジェクトを格納し、BSONドキュメントは格納しません。MongoDBのBSONデータをキャッシュに挿入する前に、標準の.NETクラス(POCO)にデシリアライズする必要があります。これにより、 NCacheの SQL クエリおよびインデックス作成機能は、生の BSON バイトではなくオブジェクト属性に対して機能します。
Q:できます NCache MongoDB にデータを自動的に書き込みますか?
A: はい。このガイドでは「キャッシュアサイド」パターン(アプリが手動でDBを更新する)に焦点を当てていましたが、 NCache サポート ライトスルー (NAIST) と 後書き プロバイダ。これにより、書き込み操作を NCacheこれにより、バックグラウンドで MongoDB が同期的 (Write-Through) または非同期的 (Write-Behind) に更新され、アプリケーションのレイテンシがさらに改善されます。
Q: もし NCache クラスターはダウンしますか?
A: アプリケーションは正常に機能低下しますが、動作は継続します。標準の「キャッシュアサイド」パターンにはフォールバックロジック(キャッシュがnullの場合→DBから取得)が含まれているため、アプリケーションはMongoDBに直接アクセスするようになります。パフォーマンスはキャッシュされていないレベルまで低下しますが、データは失われず、アプリケーションはオンライン状態を維持します。






