2

HttpRuntime.CacheWeb ファームでの使用には適していないと聞きました。何故ですか?この問題の回避策の良い例は何ですか? Memcachedや同様の製品について聞いたことがありますが、基本的な使用法を示す適切な最近のサンプルが見つかりません。

4

2 に答える 2

11

サーバー ファームでの HttpRuntime.Cache に関する問題の 1 つは、キャッシュ内のデータの多くがサーバー間で複製されることです。

たとえば、e コマース サイトがあり、製品カタログをキャッシュに格納し (変更されることはめったにないため)、20M のメモリを消費するとします。5 つの Web サーバーがある場合、それぞれのキャッシュに製品カタログの独自のコピーがあり、合計 100M のメモリ (20M * 5 サーバー) を使用します。memcached のような共有キャッシュを使用すると、キャッシュされた項目の 5 つのコピー (サーバーごとに 1 つ) ではなく 1 つのコピーのみを保存することで、その無駄がなくなります。

もう 1 つの問題は、キャッシュの同期です。繰り返しになりますが、製品カタログをデータベースから取得してから 1 時間キャッシュするとします。各サーバーは、異なる時間に期限切れになるカタログのコピーをキャッシュに保持できます。あるサーバーでキャッシュの有効期限が切れると、他のサーバーがまだ持っていない更新されたデータを取得する可能性があります。

これにより、1 つのカテゴリに 50 個の製品が表示され、次にページを更新し、別のサーバーに送信され、51 個が表示され、再度更新してから 50 個が再び表示されるなど、奇妙なユーザー エクスペリエンスが発生する可能性があります。共有キャッシュを使用すると、それについて心配する必要はありません。

于 2012-05-17T21:06:05.283 に答える
2

HttpRuntime.CacheオブジェクトはSystem.Web.Caching.Cacheのインスタンスです。

Cache オブジェクトの MSDN ドキュメントによると:

このクラスのインスタンスは、アプリケーション ドメインごとに 1 つ作成され、アプリケーション ドメインがアクティブである限り有効です。

ウェブファームでは、サイトの負荷を処理する複数のマシンがあるため、リクエストがマシン A に送信されることもあれば、マシン B に送信されることもあります。マシン A のキャッシュに何かを貼り付けた場合、次のリクエストがマシン B に送られると、それをキャッシュから取り出すことができなくなります。これは InProc for Session managementの制限のようなものです。これを回避するには、スティッキー セッションを調査します。

于 2012-05-17T20:58:36.590 に答える