2009-07-10 8 views
1

私は自分のサイトにすべてのページからアクセス可能な検索機能を持っています。マスターページのテキストボックスとボタンの典型的なトップ。私は、System.Web.Caching.Cacheを使用して、最も一般的な検索文字列とその結果をキャッシュするためのより良い方法を探しています。頻繁な検索文字列とその結果をASP.Netキャッシュに保存する

私は検索文字列を適用可能なユーザーグループの許可データと連結し、その値をリストとするキャッシュキーとして使用することを考えていました。

例キャッシュキー:

Microsoft Visual Studio 2008 Service Pack 1--usergroup2,3,6,17,89

しかし、それは私がキャッシュキーの最大長さは何を考えていました。キーができる最大長はありますか?このように物事を保存しようとすると、非常に長いキー名の値で終わる可能性があります。また、最も一般的な検索と最近使用されたものを保持することについては何もしません。

私がやろうとしていることを達成するためによく使われる方法はありますか?私の質問は理にかなっていますか?助けてくれてありがとう。

+0

何かと同様に、メモリの制約に遭遇していないことをテストしてテストします。 –

答えて

1

しかし、キャッシュキーの最大長は何か考えました。キーができる最大長はありますか?このように物事を保存しようとすると、非常に長いキー名の値で終わる可能性があります。また、最も一般的な検索と最近使用されたものを保持することについては何もしません。

キーの長さは、 "文字列"自体の最大長です。

ここの文書によれば、http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspxによれば、キーはオブジェクトタイプの値を持つ文字列で定義できます。

カスタムオブジェクトに一意のキーでタグを付けることをお勧めします。そのため、キャッシュからクエリを実行すると、カスタムオブジェクトにタグ付けされた複雑な情報を持つカスタムオブジェクトにオブジェクトを追加できます。

EDIT 11072009_1154

私は慎重に再びあなたの条件を読んだ後、私はあなたの目的は、頻繁に文字列を検索しキャッシュすることであることに気づきました。

この例では、頻繁に検索する文字列が「Microsoft Visual Studio 2008 Service Pack 1」である可能性があります。あなたの他の必要な属性を保持するための追加のプロパティを持つカスタムオブジェクトは、私の意見では、これが鍵になるはずです。 キー: "マイクロソフトのVisual Studio 2008のService Pack 1" 値:CustomObjectInstance:CustomObjectInstance.UserLanguage = "英語" とCustomObjectInstance.UserLocalization: "USA"、CustomObjectInstance.UserKeyboardLayout要約する

が、これは一例であるかもしれません= "UK"など。

AFAIK、The Cacheは辞書型のデータ構造を実装しているため、キーは一意のものでなければなりません。あなたのキーが "Microsoft Visual Studio 2008 Service Pack 1 - usergroup2,3,6,17,89"の場合、どのようにしてASp.NET Webアプリケーションからこの特定のキーを一意に識別できますか?私の検索テキストボックスで、私は挿入しませんusergroup2,3,6,17,89

StackOverflowサイトの検索機能のようにも考えてみましょう:ユーザーは共通の検索文字列を挿入します "jqueryの資料を学ぶ"、私の意見では、あなたのキャッシュキーには「jqueryの内容を学ぶ」というエントリが必要です。追加情報については、

EDIT 11072009_1250

感謝。私は、複数のレイヤを強制することによって、追加のソリューションを提供することもできます。なぜなら、すべての情報を1つのキャッシュレイヤに詰め込むのではなく、なぜ追加のレイヤを保存しないのかです。

キャッシュにはキー(文字列)と辞書を再度指す値があることを意味します。

もう1つの解決策は、SQL Serverフルテキストインデックス検索を使用してこれらの機能をプッシュすることです。SQL Serverのフルテキストインデックス検索にはあまり慣れていませんが、この機能を既存のインフラストラクチャ可能なら。

+0

"...一意のキーでカスタムオブジェクトにタグを付けるので、キャッシュからクエリを実行するときに、カスタムオブジェクトにタグ付けされたより複雑な情報でカスタムオブジェクトをオブジェクト化することができます。 これにいくつかの疑似例を教えてもらえますか? 検索の詳細をプロパティとして保持し、結果リストの小道具を保持するカスタムobjをキャッシュするとしますか? 元々私がやろうとしていたことは、リストのキャッシュキーとして使用する検索の詳細の文字列を作成することでした。 Billyhole

+0

@Billyhole、上記の私の更新答えを参照してください。 –

+0

ありがとう、あなたのご意見ありがとうございます。あなたの質問に答えるだけで、私は現在ログインしているユーザーの情報からユーザーグループのデータを取得し、そのユーザーは検索を行います。つまり、検索では、同じ検索文字列が必ずしもすべてのユーザーに同じデータを返すわけではありません。異なるユーザーグループは異なるデータにアクセスできます。だから私の元の計画はうまくいくはずです、人々がこの共通の要件を扱っている認識された共通の方法があるかどうかは確かではありませんでした。ありがとう。 – Billyhole

0

キャッシュの検索結果は、かなり一般的な手法です。 ASP.NETキャッシュは、キャッシュされたすべてのデータをメモリに保存してより高速にアクセスできるようにします。それはどれくらいのメモリがキャッシングのために利用できるかによって異なります。 ASP.NET Cacheアプローチから逸脱したい場合は、これを実装する別の方法があります。検索から取得したデータをキャッシュする方法は、データベーステーブルに格納する方法です。

数十億のレコードを持つテーブルを検索するのは非常にコストがかかります。そのため、最も検索されたキーワードのデータをテーブルに保存して、より高速にアクセスすることができます。かなり簡単なアルゴリズムに基づいて、テーブルを定期的にリフレッシュするジョブを作成することもできます。 Least Recently Usedアルゴリズム。最近使用されていない検索結果を削除することができます。

EDIT:そして、あなたの質問はキャッシュキーの長さです。それは文字列であり、文字列の長さはそれを格納するために使用可能なメモリに依存します。

関連する問題