C # HttpRuntime.Cache.Insert () Не удерживает кешированное значение

Я пытаюсь кэшировать значение цены, используя HttpRuntime.Cache.Insert (), но только кажется, что удерживает значение в течение нескольких часов или что-то еще, прежде чем очистить его. Что я делаю неправильно? Я хочу, чтобы значение оставалось в кеше в течение 3 дней.

HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), TimeSpan.Zero); 

Короткий ответ

Ваш пул приложений или веб-сайт завершается слишком рано. Увеличьте время ожидания простоя на сайте, увеличьте время жизни пула приложений для пула, на котором запущен сайт. Увеличьте пределы распределения памяти и запроса.

Полный ответ

Если вы хотите узнать, когда и почему что-то удаляется из кеша, вам необходимо зарегистрировать удаление элемента с помощью параметра CacheItemRemovedCallback при вставке … Затем вы можете зарегистрировать причину, используя аргумент CacheItemRemovedReason . Таким образом, вы можете зарегистрировать причину в качестве одной из четырех перечисленных причин:

  1. Удалено Элемент удаляется из кеша вызовом метода «Удалить» или вызовом метода «Вставка», который указывает тот же ключ.
  2. Истек. Элемент удален из кеша, поскольку он истек.
  3. Недоиспользуемый Элемент удаляется из кеша, потому что система удаляет его в свободную память.
  4. DependencyChanged Элемент удаляется из кеша, потому что связанная с ним связанная с ним зависимость кеша изменилась.

Как правило, вы обнаружите, что Expired и Underused являются причинами для вещей, которые не имеют объяснений. Удалите вызовы, сделанные против кеша, и не имеют зависимостей.

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

Один из способов может произойти из-за изменения файлов web.config (или bin directory или .aspx и т. Д.). Дополнительные сведения о том, когда это происходит, см. В разделе « Перезапуск приложений » на этой странице . Когда это произойдет, текущие ожидающие запросы изъяты, кеш опустел, а AppDomain выгрузился. Вы можете обнаружить эту ситуацию, проверив AppDomain.IsFinalizingForUnload и протоколируя это во время обратного вызова.

Еще одна причина для утилизации AppDomain – это когда IIS решает переработать AppPool по любой из причин, по которым он был настроен. Примерами этого являются xxx- память, выделенная в течение всего жизненного цикла, yyy секунд времени выполнения для AppPool, время ожидания ttt или время простоя iiii (нет входящих запросов). Для получения дополнительной информации ознакомьтесь с этой статьей для IIS6 или этой статьи для IIS7

Объект Cache не гарантирует, что он будет храниться на кэшированных объектах вообще, а тем более на весь период времени, который вы предлагаете.

Если вы хотите более настоятельно рекомендовать это сделать, вы можете установить CacheItemPriority.High или CacheItemPriority.NotRemovable, когда вы вставляете элемент в кэш. При стандартном приоритете Normal, среда выполнения имеет довольно агрессивную политику отпускания объектов при увеличении давления памяти.

Кроме того, по умолчанию IIS AppPool будет перерабатывать один раз в день или около того, что очистит все в кэше.

В документах http://msdn.microsoft.com/en-us/library/4y13wyk9.aspx указано, что Cache.NoSlidingExpiration должен использоваться, если используется абсолютное истечение.

 HttpRuntime.Cache.Insert(CacheName, Price, null, DateTime.Now.AddDays(3), Cache.NoSlidingExpiration); 

это может быть не ваша проблема, хотя я только что обнаружил, что Cache.NoSlidingExpiration должен быть таким же, как TimeSpan.Zero.

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

также проверьте последний комментарий здесь http://bytes.com/topic/net/answers/717129-c-asp-net-page-cache-getting-removed-too-soon кто-то, похоже, нашел решение вашей проблемы.

Проверьте время повторного использования в вашем пуле приложений.

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

Ознакомьтесь с этой страницей, чтобы увидеть пример того, как вы можете добавить делегата, чтобы вы точно знали, когда ваш элемент будет удален из кеша. Это может помочь вам в поиске и устранении неполадок, если это не ваш пул приложений:

http://msdn.microsoft.com/en-us/library/system.web.caching.cache.add.aspx

~ ~ Md5sum