Httpruntime кеш ключей не уникален? - PullRequest
3 голосов
/ 14 сентября 2009

Несмотря на то, что я указал уникальный ключ, кажется, что следующий код вернет одно значение для 5 запросов, затем другое для следующей пары, затем вернется к значению, сохраненному в исходном запросе, и продолжит, пока не будет 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);

Очень смущен, это из-за многопоточности или что-то?

Ответы [ 2 ]

2 голосов
/ 04 июня 2010

Игнорирование возможности фермы серверов и балансировки нагрузки может быть вызвано тем, что пул приложений работает как web-garden . Цитировать соответствующий раздел из MSDN:

Поскольку веб-сады позволяют использовать несколько процессов, каждый процесс будет иметь собственную копию заявления состояние, состояние сеанса в процессе, кеши и статические данные. Веб-сады не должен использоваться для всех приложения, особенно если они нужны поддерживать состояние. Обязательно сравнительный анализ производительности приложение, прежде чем решить, Режим веб-сада подходит.

Это заставит его выглядеть так, как если бы кеширование хранило несколько значений для одного и того же ключа, фактически имея дублированные записи в кеше.

Чтобы устранить эту проблему в IIS 7, откройте пул приложений Расширенные настройки и установите для Максимальное количество рабочих процессов значение 1. Для IIS 6 см. Статью MSDN (С красивыми скриншотами).

Хотя я и опоздал на 8 месяцев, я отвечаю на этот вопрос, потому что нашел его задолго до того, как нашел эту приличную статью о веб-гадче . Надеюсь, этот ответ сэкономит будущим поисковикам массу времени. :)

0 голосов
/ 14 сентября 2009

Ваш кеш-ключ всегда 'datetimeexample', поэтому у вас всегда будет один объект в кеше; и вы всегда получите этот объект обратно.

Я не совсем уверен, чего вы пытаетесь достичь, насколько я понимаю, это ведет себя именно так, как и должно.

...