Подтвердить что ты не робот

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

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

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

Ответ 1

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

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

Полный ответ

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

  • Удалено. Элемент удаляется из кэша вызовом метода "Удалить" или вызовом метода "Вставка", который указывает тот же ключ.
  • Истек срок действия Элемент удален из кеша, поскольку он истек.
  • Недоиспользованный Элемент удален из кеша, потому что система удалила его в свободную память.
  • DependencyChanged Элемент удален из кеша, потому что связанная с ним зависимость кэша изменилась.

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

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

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

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

Ответ 2

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

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

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

Ответ 3

Документы 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 кто-то, похоже, нашел решение вашей проблемы.

Ответ 4

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

Ответ 5

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

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

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

~ md5sum ~