2

現在、エンティティとエンティティのコレクションの両方をビジネス層で (.NET キャッシュを使用して) 自動的にキャッシュするアプリケーション フレームワークがあります。したがって、メソッド GetWidget(int id) はデータベースにアクセスする前にキー GetWidget_Id_{0} を使用してキャッシュをチェックし、メソッド GetWidgetsByStatusId(int statusId) は GetWidgets_Collections_ByStatusId_{0} を使用してキャッシュをチェックします。オブジェクトがキャッシュにない場合は、データベースから取得され、キャッシュに追加されます。

このアプローチは読み取りシナリオでは明らかに迅速であり、ブランケット アプローチは実装が迅速ですが、エンティティに対して CRUD 操作が実行されるときに大量のキャッシュ キーを削除する必要があります。追加のメソッドが追加されると、これは明らかにパフォーマンスに影響を与え、キャッシュの利点は減少します。

コレクションのキャッシュを処理するための代替アプローチに興味があります。NHibernate は、実際のエンティティではなく、コレクション内の識別子のリストをキャッシュすることを知っています。これは他の人が試したアプローチですか - 長所と短所は何ですか?

特に、パフォーマンスを最適化し、ボイラープレートで生成されたコードを介して自動的に実装できるオプションを探しています (独自のコード生成ツールがあります)。特定の状況のニーズを満たすために毎回手動でキャッシングを行う必要があると言う人もいると思いますが、ほとんどの場合自動的にキャッシングできるものを探しています。

4

1 に答える 1

0

あなたの質問が本当に何であるかわかりません。

しかし、redis を見てみましょう。これは、使用できるデータ構造キャッシュです。

あなたの定義に基づいて、 GetWidget_Id_{0} を格納していますが、なぜそれを行うのですか? まず、独自のキャッシュを持つことができ、インメモリ キャッシュ コンテナーを簡単に作成できます。

interface ICache<K,V>{
   put(K,V)
   V get(K)
   delete(K)
}

class CacheContainer<K,V> : ICache<K,V>
{

   ConcurrentHashMap<K,V> _cache = new ....

   put impl..
   get impl..
   delete impl..

   purge..


}

これを拡張して、サブクラスに LRU、LFU、あらゆる種類のキャッシング アルゴリズムを含めることができます。

コレクションの保存に関しては、アイテムをリストまたはセットとして保存するのと同じ考え方です。

redis を実際に見て、メモリ/キャッシュされたコレクションを理解してください。概念を理解したら、キャッシュ アルゴリズムを見てください。

お役に立てれば。

于 2012-06-19T16:38:45.283 に答える