Mongo DB NoSQL、スケーラブル、オープンソース、高性能、およびドキュメント指向のデータベース。 最高のXNUMXつです NoSQL databases市場で。 Mongo DBでキャッシュを使用すると、データベースへのアクセスが減り、アプリケーションのパフォーマンスが大幅に向上します。 ただし、分散キャッシュ内にMongo DBデータをキャッシュすると、このデータのXNUMXつのコピーが作成されます。 XNUMXつのコピーはMongoDB内にあり、XNUMXつのコピーは分散キャッシュ内にあります。 アプリケーションがMongoDB内のデータを直接変更すると、キャッシュ内のデータは古くなります。
高トランザクション、マルチ環境、およびエンタープライズレベルのアプリケーションの場合、この古いデータは大きな問題です。 このブログでは、Mongo DBと一緒に分散キャッシュを引き続き使用し、同時に古いデータの問題を回避する方法について説明します。
を使用してキャッシュをMongoDBと同期する NCache
NCache のよく知られた分散キャッシュです .NET Framework/ .NET Core、Java、およびNode.js。 NCache 飛躍的にアプリケーションのパフォーマンスを向上させることができる機能の膨大なセットを提供します。 これらの膨大な機能セットの中には、 通知ベースの拡張可能な依存関係。 この機能は、MongoDB(前述)の古いデータの問題に対処します。
NotifyExtensibleDependency
クラスを使用すると、通知を通じてデータベース内で行われている変更について通知されるカスタム依存関係ロジックを記述できます。 NCache これらの通知を処理するには、Mongo DB(バージョン3.6で導入)の機能を利用します。 ストリームの変更。 これらの通知が処理されると、作成したコードに基づいて、キャッシュ内の古いデータが無効になります。
ストリーム変更ロジックは、 NotifyExtensibleDependency
。 この変更ストリームを変更して、データベース内で行われる追加、更新、または削除操作に関する通知を受け取ることができます。 ただし、削除操作は追跡できません。 したがって、削除操作を追跡するために、有効期限付きの更新操作が使用されます。
また、MongoDBはスタンドアロンデータベースの変更ストリームをサポートしていないことにも注意してください。 ストリームの変更機能が機能するように、MongoDBデータベースにレプリカセットがあることを確認する必要があります。
NCache 詳細 NCache NotifyExtensibleDependency NCache ドキュメント
キャッシュをMongoDBと同期する:簡単な例
MongoDBをで使用するには NCache 構成する必要があります カスタム依存関係 in NCache 最初にそれをクライアントアプリケーションにデプロイします。 これについては、以下で説明します。
NCache カスタム依存関係の構成
の通知ベースの拡張可能な依存関係機能を使用するには NCache Mongo DBでは、次のことを行う必要があります カスタム依存関係を構成する on NCache まず、それぞれのDLLファイルをにデプロイします NCache サーバー。
以下のGIFでは、という名前のプロバイダーをデプロイしました MongoDbNotifyExtensibleDependencyProvider
キャッシュへのすべての依存関係とともに。 それは実装します ICustomDependencyProvider
インターフェース。 の依存関係オブジェクトを作成する責任があります キャッシュ項目。 依存関係が適切にトリガーされるためには、 NotifyExtensibleDependency
クラスを実装する必要があります。 このクラスは、MongoDB変更ストリームをリッスンし、MongoDBのデータ変更時に依存関係をトリガーします。
また、この例では、のオープンソース実装を使用しています ICustomDependencyProvider
& NotifyExtensibleDependency
上で利用可能 GitHubの.
NCache 詳細 カスタム依存関係の構成 GitHubリポジトリ
クライアントアプリケーションへの展開
たとえば、Mongo DBをEコマースストアのデータベースとして使用し、頻繁に使用するデータを内部にキャッシュしたいとします。 NCache。 ストアにはXNUMX万を超える製品のデータが含まれ、毎日何百万ものトランザクションが発生します。 NCache Mongo DBデータベースの負荷を軽減するのに役立ちますが、キャッシュ内のデータは古くなる傾向があります。
キャッシュ内に古いデータがあると、あなたとあなたの顧客に問題を引き起こす可能性があります。 幸いなことに、通知ベースの拡張可能な依存関係機能 NCache 古いデータの問題を軽減し、Eコマースストアの最適な機能を確保します。
次の例では、製品はそのIDに基づいてデータベースからロードされます。 それで NotifyExtensibleDependency
フェッチされた製品に対して作成および登録されます。 最後に、製品は、 キャッシュ項目 指定されたキーでキャッシュに挿入されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Product product = LoadProductFromDatabase(productId); //This is the name of your provider deployed on a cache server string providerName = "MongoDbNotifyExtensibleDependencyProvider"; string key = "Product:" + product.Id ; IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("ConString", "mongodb://**.**.**.**:27017"); parameters.Add("DatabaseName", "productscollection"); parameters.Add("CollectionName", "products"); CacheItem item = new CacheItem(product); item.Dependency = new CustomDependency(providerName, parameters); _cache.Insert(key, item); |
NCache 詳細 NotifyExtensibleDependency のキャッシュ操作 NCache
リードスループロバイダーの使用
のもう一つの顕著な特徴 NCache は リードスループロバイダー。 この機能を使用すると、Mongo DB内のデータがキャッシュに見つからない場合に、そのデータを直接検索できます。 アイテムがデータベース内で見つかると、それも自動的にキャッシュ内に保存されます。 したがって、貴重な時間を節約できます。 この機能をMongoDBアプリケーションで使用して、パフォーマンスをさらに向上させることができます。
次のコード例は、リードスルーが有効になっているアイテムを取得します。これは、指定されたキー「Product:1001」に対応し、 Get<>
方法。
1 2 3 4 5 6 7 8 9 |
// Specify the key of the item string key = "Product:1001"; // Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product product = cache.Get(key, readThruOptions); |
NCache 詳細 キャッシングを読む のキャッシュ操作 NCache
まとめ
総括する、 NCache Mongo DBとキャッシュの間でデータを同期するための柔軟なソリューションを提供し、それによってデータの不整合を回避します。 NCacheインメモリ分散キャッシングソリューションである、は、Mongo DBが最新のデータを維持して高速アクセスと処理を行うための、理想的なメディアになります。