0

重複の可能性:
インメモリ コレクションの Linq パフォーマンス

約 100 万人のユーザーを持つ Web アプリケーションがあります。そのアプリケーションのほぼすべての Web ページが GetUser() メソッドを呼び出します (アクティビティ ストリームのファースト ネームやその他のユーザーの詳細をロードするため)。現在、呼び出しごとにデータベースにアクセスしています。すべてのユーザーをメモリにキャッシュし、Linq を使用してそこから検索結果または GetUser() をフェッチすることを考えています。

私の唯一の問題は、すべてのユーザーを (メモリ内に) キャッシュすることが良い考えかどうかです。RAMを無駄にしていますか?個人的には、RAM からのフェッチは DB からのフェッチよりもはるかに高速だと思います (DB が最適化され、インデックス化されている場合でも)。

キャッシュの検証/更新などを既に処理していることに注意してください。

stackoverflow はすべてのユーザーをキャッシュしますか?

4

2 に答える 2

1

GetUserがほとんどの場合同じユーザーのセットを返し、ほとんどのユーザーがめったに取得されない場合は、辞書(または他のコレクション)をセットアップしてそのコレクションを最初にチェックするハイブリッドアプローチを試すことができます。存在しない場合は、データベースから取得してコレクションに保存します。

このアプローチを使用すると、キャッシュを使用することもできます。これは、キャッシュが古くなり、それ自体をクリーンアップするためのメカニズムがすでに組み込まれているためです。

そうは言っても、私は過去にユーザーに対して同じことを行ったプロジェクトに取り組みました(ただし、ユーザーは約100人しかいませんでした)。すべての調査とテストで、毎回データベースにアクセスする方が速いことがわかりました。

于 2012-06-20T18:09:02.143 に答える
1

同様のことを行いましたが、Linq を使用する代わりに、各 Web サーバーに SQL Server Express のコピーをインストールしただけです。ユーザー データの変更を各 Web サーバーにプッシュし、ローカル アプリは中間層を使用し、定期的にローカル データベースからデータをプルするだけでした (ただし、全員がデータベースにアクセスするのではなく、少なくともローカルでした)。

キャッシュに使用するテクノロジと、アプリ (または Linq) がローカル コピーを更新するタイミングを知る方法は、キャッシュされたデータがどの程度古くなってもよいかによって異なります。

于 2012-06-20T18:02:10.980 に答える