Вопрос

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

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

Это было полезно?

Решение

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

  

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top