3

一意のキーを指定しましたが、次のコードは 5 つのリクエストに対して 1 つの値を返し、次に次のカップルに対して別の値を返し、元のリクエストで保存された値に戻り、10 の異なるオブジェクトがすべて存在するまで続行します。同じキーで保存されます。これらの値のどれがキャッシュから返されるかは、ほぼランダムに見えます。

string strDateTime = string.Empty;
string cachename = "datetimeexample";
object cachedobject = HttpRuntime.Cache.Get(cachename);
if (cachedobject != null)
    strDateTime = (string)cachedobject;
else
{
    strDateTime = DateTime.Now.ToString();
    HttpRuntime.Cache.Insert(cachename, strDateTime, null, DateTime.MaxValue, TimeSpan.FromDays(10), CacheItemPriority.NotRemovable, null);
}
Response.Write(strDateTime +"        keys:"+ HttpRuntime.Cache.Count);

非常に混乱しています。これは、スレッド化または何かが原因ですか?

4

2 に答える 2

2

サーバー ファームと負荷分散の可能性を無視すると、この動作はアプリケーション プールがweb-gardenとして実行されていることが原因である可能性があります。MSDN から関連するセクションを引用するには:

Web ガーデンでは複数のプロセスを使用できるため、各プロセスには、アプリケーション状態、インプロセス セッション状態、キャッシュ、および静的データの独自のコピーがあります。特に状態を維持する必要がある場合は、すべてのアプリケーションに Web ガーデンを使用しないでください。Web ガーデン モードが適切かどうかを判断する前に、必ずアプリケーションのパフォーマンスのベンチマークを行ってください。

これにより、キャッシングが同じキーに対して複数の値を格納しているかのように見え、事実上キャッシュ内にエントリが重複します。

IIS 7 でこれを解決するには、アプリケーション プールの詳細設定を開き、ワーカー プロセスの最大数を 1 に設定します。IIS 6 については、MSDN の記事(スクリーンショット付き) を参照してください。

8 か月遅れていますが、この質問に答えているのは、Web-garden の落とし穴に関するこのまともな記事を見つけるずっと前に見つけたからです。願わくば、この回答が今後の検索者の時間を大幅に節約してくれることを願っています。:)

于 2010-06-04T12:46:17.817 に答える
0

キャッシュキーは常に「datetimeexample」であるため、キャッシュには常に 1 つのオブジェクトがあります。いつでもそのオブジェクトを受け取ります。

あなたがここで何を達成しようとしているのかはよくわかりませんが、私に関する限り、これは本来あるべき方法で正確に動作します。

于 2009-09-14T11:52:39.753 に答える