2011-01-26 11 views
1

AppFabricキャッシュについての多くのドキュメントを読みましたが、そのほとんどは単純なシナリオをカバーしています。 たとえば、都市リストデータまたはショッピングカードデータをキャッシュに追加します。 しかし、製品カタログデータをキャッシュに追加する必要があります。AppFabricキャッシュを使用したページング、リスティング、およびグループ化

I 4つのテーブルを有する:Iがページング検索結果が照会表示

製品(1万行)、ProductProperty(25万行)、施設(100行)、PropertyOption(300行)

  • をProductおよびProductPropertyテーブル用のフィルタがいくつかあります。
  • 検索結果セットに条件を設定しています。たとえば、(4 Items New Product、34 Items Phone、26 Items Bookなど)
  • ProductテーブルをIsNew、CategoryId、PriceTypeなどの列でグループ化するクエリを作成します。
    ProductPropertyテーブルをグループ化するための別のクエリPropertyIdとPropertyOptionId列は、したがって、私は(カウント付き)基準リストを作成するための1つの検索結果のためのクエリと2を行い、検索結果を表示するために

    検索結果のクエリは0を取ったどのように多くの項目

持っているプロパティを取得します7秒間と2回のグループ化クエリーの合計は1,5秒でした。 負荷テストを実行すると、1秒あたり7リクエストに達し、%dbはレスポンスを返せないためIISによって低下しました。

これは、商品とプロパティのレコードをキャッシュする理由です。

以下の項目(AppFabricの場合)に従うと、

  • データとグループ化を照会するためのアイテムをタグ付け
  • 製品カタログデータ(25万行を持っている100万行とプロパティテーブルを持っているテーブル)領域を作成名前付きキャッシュ
  • を作成します。

いくつかのタグを使用してクエリを実行し、結果の第1ページまたは第2ページを取得できますか? いくつかのタグを使用してクエリを実行し、いくつかのグループ化結果の数を取得できますか。 (カウントでフィルタオプションを表示) 3台のサーバが必要ですか?私は唯一のappfabricサーバーを持つソリューションを提供できますか(もちろん私はリスクを知っています)。 これらのシナリオを説明している記事やドキュメントがありますか?

ありがとうございました。

注:

いくつかの追加のテスト: 私はキャッシュにおよそ30.000の項目を追加し、そのサイズは900メガバイトです。 getObjectsInRegionメソッドを実行すると、約2分かかりました。 "IList> dataList = this.DataCache.GetObjectsInRegion(region).ToList();" 問題はIListに変換されています。私はIEnumerableを使用する場合、それは非常にquicly動作します。しかし、私のタイプに変換せずに、ページングやグループ化の結果を得るにはどうすればいいですか?

別のテスト:

私は30で、カウントをグループ化取得しようとしました。000製品アイテムとグループ化の結果を得るのに4秒かかりました。たとえば、GetObjectByTag( "IsNew")。Count()などの50近くのクエリ。

+0

あなたはいくつかの素晴らしい追加情報を追加しました:-)私はこれに答えを書いていますが、私はまだそれを行うための強固な方法を考えています! – PhilPursglove

+0

@PhilPursglove、私はこの問題の解決策としてSolrを使用するつもりだと思います。そして、非常に高価なアプリケーションであるMsのFast以外の.netの世界には方法がありません。残念だ ! – mehmetilker

+0

Solr @jandarkはどういう意味ですか?あなたの答えには –

答えて

2

残念ながら、V1のAppFabric用のページングAPIはありません。 GetObjectsByTagのようなバルクAPIはいずれも、サーバー上でクエリを実行し、すべてのクライアントに一致するキャッシュエントリをストリームバックします。そこから、IEnumerable(たとえばSkip/Take/Count)で必要なLINQ演算子を使用することはできますが、常にという結果がサーバーから戻ってくることに注意してください。

私は個人的にはAppFabricのV2は、サーバーへのリモート完全な要求がはるかにLINQ2SQLまたはADOのようなクライアントに返す前に、そこのページの結果ことができるようにする能力を与えるであろうIQueryable代わりにIEnumerableを経由してサポートを提供することを願っています。 NET EF。

今のところ、アプリケーションの機能によっては、項目をキャッシュに挿入するときに実際に何らかの種類のページングを計算できるという可能性があります。各ページを表すエンティティ・キーの順序付きリストを作成し、それらを単一のエントリとしてキャッシュに格納することができます。これらのエントリは、1つのリクエストで引き出して個別に(並列に)取り出したり、リスト内の項目をキャッシュから一括取り出ししてインメモリLINQクエリを使用します。メモリのためにCPUをトレードオフしたいのであれば、IDではなくフルエンティティの実際のリストをキャッシュし、エンティティのための結合を行う必要があります。

到着する検索条件に基づいて、これらのオブジェクトのリストをキャッシュからすばやく取得するには、何らかの種類のキーイングメカニズムが必要です。このようにキーイングのいくつかの種類の仕事があります

private static string BuildPageListCacheKey(string entityTypeName, int pageSize, int pageNumber, string sortByPropertyName, string sortDirection) 
{ 
    return string.Format("PageList<{0}>[pageSize={1};pageNumber={2};sortedBy={3};sortDirection={4}]", entityTypeName, pageSize, pageNumber, sortByPropertyName, sortDirection); 
} 

あなたは最新のキャッシュを維持するのではなく、オンデマンドでそれをやっている別のプロセスまたはワーカースレッドでこの種のものをやって、ユーザーを強制的に検討する必要がありますキャッシュエントリにまだ値が設定されていない場合は待機します。

このアプローチが最終的に機能するかどうかは、アプリケーションとデータのいくつかの要因によって異なります。それがあなたのシナリオにちょうど合っていない場合は、おそらく、あなたの心を、問題を解決する別の考え方に変えるのに役立ちます。

+0

ありがとう。私はSolrを検索、ページング、グルーピング、その他の検索関連の問題に使うことを考えています。悪いことは、非常に高価なソリューションであるFASTを除いて、.netの世界に関連する検索には解決策がないことです。 – mehmetilker

関連する問題