2016-03-22 11 views
0

に一時的なデータを格納するのはおそらく簡単な質問ですが、少し研究した後、私のケースは非常に特殊だと思うので、私はまだ始まりよりも混乱しています。まず、私はMVCで新しくなったので、まだ.net mvcアーキテクチャについて学んでいます。ASP.NET MVCコントローラ

私の使用例を教えてください。

私は、ユーザが約10〜15個のフィルタの可能性のある製品検索を実行できるページを持っています。 1つのクエリは1秒未満または10秒を超えることができ、すべてフィルタの複雑さに依存します。検索は、500万件を超えるレコードを持つデータベースで実行されます。

検索が完了した後、ユーザーは複数の属性で注文するか、特定の文字列を検索するかなどを選択できます。だから、私の最後の検索が10秒かかると想像してみてください。それは良い考えではありません。

今のところ、セッションスコープを使用して、データベースから返された結果のIEnumerableを格納しています。次に、返されたデータをフィルタリングするいくつかの王を実行したい場合は、そのリストで作業します。それは本当に速く、私が望むことをやります。

しかし、私はいくつかの良心の問題を抱えています。セッションコンテキストは、私にはそのような種類の情報を一時的に保存する適切な場所ではないようです。主な理由は、私が特定のページ(コントローラ)にいるときだけ、その情報にアクセスしたいということです。私がそのページを終了したら、私の目標はその情報を削除することです。

私の質問はこれについて、セッションのコンテキストは、このアクションを行うには最適ですか?そのコントローラを終了すると情報が削除されることをどのように保証することができますか?

私は明確にしていました。

+0

おそらく、Redisストレージなどの検索結果をキャッシュしてそこに有効期限を設定する必要があります(この機能はボックスからも入手できます) –

+0

Redisを必要とせず、ASP.NETは1日目以降のキャッシュを提供します。 –

+0

私はこのようなデータをJsonにシリアル化してフォームに格納することをお勧めします。これは、検索に関連しており、オーバーヘッドや余分な技術などがなくても揮発性であることを意味します。もしあなたがそれを改ざんしていることを心配するなら、いつでもそれを難読化/暗号化することができます。または、クライアント側でJavascriptを使用してソートするか、Angularまたはノックアウトを使用してデータをバインドすることをお勧めします。そうすれば、注文を行うためにサーバを使用する必要は全くありません。 – Liam

答えて

1

Definitively Session.Contextは、このような情報を格納する正当な場所のようではありません。

私のプロジェクトでは、通常はすべてのユーザーフィルタに関する情報を照会しますが、データベースはかなり少なくて済みますが、クエリはかなり高速に実行され、AJAX呼び出しを使用してユーザーエクスペリエンスを向上させます。あなたのenvironmentI'dで

取る2 approachsの1:

1)データの結果セットは、あなたのモデルクラスにフィットしやすく、通常は数の要素から構成されている場合:次に、あなたが通過しようとすることができ

フィルターされた検索を管理するコントローラーに結果セットを戻します。以前の結果セットがない場合、ビジネスクラスで前のデータセットまたはクエリデータベースをフィルタリングできるようにします。

2)結果セットのデータ構造は複雑で、モデルバインダはコントローラに直接ロードすることはできません。または結果セットの結果が大量であるため、クライアントからサーバへの多くの結果が間違っているようですアイデア:

この場合、私はおそらくjavascriptを使ってクライアントソリューションに行くだろう。私は、どのユーザーがデータベースにクエリを作成するか、以前のクエリをリファインするときに違いがあります。最初のケースでは結果セットを返すコントローラを呼び出し、2番目のメソッドではクライアントコードにフィルタエンジンを作成します。

結果セットを、JavaScriptで簡単に管理できるデータ構造に変換するには、JSONを使用します。

1

まず第一に5 000 000のレコードは大したことではありません。

  1. クエリでスタートあなたは、SQL管理スタジオにクエリをロードし、さらに多くのSMSはまた、あなたのインデックスを提案しますそれらをプロファイルすることができ、いくつかのインデックスを追加する必要がありますプロファイリング。
  2. キャッシュを格納する場所は常に依存します。あなたがそれを行うことができる多くの方法があります。まず、自分でcache providerを書いてシリアル化されたオブジェクトをデータベースに格納してから、特定のキー(sesssion id、ユーザーID)を取得し、デシリアライズしてデータを処理できます。下側では、メモリへのデータの膨大な量をロードしている場合は、それもシステム
  3. で速度を遅くする助けにはなりません。ネットあなたがredis、またはmemcached

を使用することができ、キャッシング

  • ためclassesがあるということですキャッシュは実際にはクエリの設定に依存しますが、SQLクエリを最適化してインデックスを使用していることを確認することから始めます

  • 関連する問題