HttpRuntimeキャッシュキーは一意ではありませんか?
質問
一意のキーを指定しましたが、次のコードは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);
非常に混乱していますが、これはスレッドのせいですか?
解決
サーバーファームと負荷分散の可能性を無視すると、この動作はアプリケーションプールが web-garden 。関連するセクションをMSDNから引用するには:
Webガーデンでは、 複数のプロセス、各プロセスは 独自のアプリケーションのコピーを持っている 状態、インプロセスセッション状態、 キャッシュ、および静的データ。 Webガーデン すべてに使用すべきではありません アプリケーション、特に必要な場合 状態を維持します。必ず 性能のベンチマーク 決定する前にアプリケーション Webガーデンモードが適切です。
これにより、キャッシュが同じキーの複数の値を格納しているかのように表示され、キャッシュ内に事実上重複エントリが存在します。
IIS 7でこれを解決するには、アプリケーションプールの詳細設定を開き、最大ワーカープロセスを1に設定します。IIS6については、 MSDNの記事(ありかわいいスクリーンショット)。
8か月遅れていますが、この質問に答えているのは、 Webガーデンの落とし穴に関するこのまともな記事。この回答が将来の検索者の時間を大幅に節約することを願っています。 :)
他のヒント
キャッシュキーは常に「datetimeexample」です。したがって、キャッシュには常に1つのオブジェクトがあります。常にそのオブジェクトを受け取ります。
ここであなたが何を達成しようとしているのかよくわかりません。私が懸念している限り、これは意図したとおりに動作します。