質問

私たちは消費者がキーワードを入力して製品を検索することができますEコマースサイトを構築していると仮定します。最も20万の製品であると言う、およびシステムを利用して消費者の何百万があります。のは、製品のテーブルはかなり頻繁に更新されるとしましょう。製品の数はそれほど高くなく、以来、私たちは、おそらくメモリ内の全製品テーブルを格納し、代わりに、データベースを打つ、それに対して検索することができます。私たちは、同じデータを格納しますが(高可用性とパフォーマンスの理由で)異なるサーバーに常駐する分散キャッシュを作成するために期待していると我々はこれらのキャッシュ間でデータを同期させ、製品のテーブルが変更されたときにキャッシュを無効にできるようにする必要があります。

私たちのアプリケーションは、ASP.NET MVCとNHibernateはを使用して構築されています。私はNHibernateはのレベル2キャッシュが私の状況で役立つかどうかを理解しようとしています。君たちはこれにいくつかの光を当てることができれば、私は本当に感謝しています。

私は2人の異なるユーザーが同じキーワードを使って検索する場合、L2キャッシュはキャッシュからではなく、データベースから結果を提供しますので、レベル2キャッシュは、キャッシュのクエリ結果を助けることを理解しています。しかし、製品のテーブルが頻繁に更新されるので、それははるかに私たちを助けていないと、キャッシュされた結果が古くなります。 私の質問は、私が正しくL2キャッシュを理解し、キャッシュに私がやりたい道管理に役立つものが存在しているのですされた(複数のキャッシュは、同じデータが、キャッシュ間で同期してキャッシュを無効)。任意の考えが高く評価されます。

役に立ちましたか?

解決

(memcachedのプロバイダを使用して)二次キャッシュの両方を使用してNHibernate.Searchアドオンそれたことは、あなたが両方から利益を得ることができるように思えます。

NHibernate.SearchコンポーネントはLucene.Netに依存し、キーワード検索は、データベースそれ自身から切り離されます。別のインデックスファイルがマップされたクラスごとに作成され、最適化はあなたに粒度の余分なレベルを与えて、属性を使用してプロパティレベルで設定することができます。また、あなたは最高の試合と提案を(アクションで活動するのLuceneおよび/または休止状態の検索を確認してください)を実装することができます。注意点として、あなたは(あなたが明示的にインデックスの再構築を要求しない限り)インデックスを維持する必要はありません。あなたがそうすることを希望する場合は、インデックスを操作することができますが、実装は舞台裏ですべてを管理します。だから、製品を更新/追加/削除すると、自動的に応じてインデックスを更新します。

二次キャッシュのためには、インスタントパフォーマンスの向上を取得します。約2ミルの行のデータセットを使用してテスト環境では、私も非常に低い要求カウントに20%以上改善しました。パフォーマンスの向上が要求数の増加に伴って徐々に大きくなっている - アプリケーションは、最初の2番目のレベルのキャッシュにヒットし、それが見つからない場合には、必要な行をフェッチするためにDBをヒットし、将来のクエリのキャッシュにそれらを挿入します。再び、あなたがそうしたい場合など、明示的に(それのすべて、それの一部、または特定のエントリ)のキャッシュをクリアするだけでなく、キャッシュ期間およびその他の構成設定のようなものを管理することができます。状態が更新/削除/保存中にアプリケーションによって管理されているキャッシュを注意します。

scallabilityのために *第2レベルのキャッシュが(つまりmemcachedのは非常に高性能でスケーラブルであり、分散型のインスタンスをサポートしています)、プロバイダに依存します。 * Lucene.Net/NHibernate.Searchのためにあなたは、インデックスが存在し、その場所は、すべてのWebアプリケーションインスタンスによって読み取り/書き込みのためにアクセス可能でなければならない特定の場所を設定する必要があります。そう起こってからそれを防ぐことができます光ファイルシステムよりも速く(私は秒あたりの検索要求の多くの何千ものシナリオのために話している)。 それはLIKEクエリよりも非常に高速で、(私が行っている)アプリケーション内でSQL-Serverのフルテキスト検索を実装するよりも簡単に使用できますので、

注意点として、私は非常にNHibernate.Searchをお勧めします。

他のヒント

セカンドレベルキャッシュが役立つかどうかは、お使いの製品のテーブルがキャッシュヒットに関連して更新されます正確にどのように頻繁に依存します。あなたは万個のクエリ時間を100時間の新製品を追加しますが、受信した場合でも10%のキャッシュヒット率は大きな違いを生むだろう。金利が逆転している場合は、2番目のレベルのキャッシュはほとんど価値があるでしょう。

私はあなたが密接に本番環境に近いストレステスト環境を設定し、様々な二次キャッシュ・プロバイダーでベンチマークを実行示唆ます。

また、あなたのDBを更新重いシナリオに対して適切に設定されていることを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top