Каковы некоторые возможные причины того, что объекты, хранящиеся в кэше ASP.NET, не имеют срока действия, несмотря на то, что установлено скользящее время окончания? - PullRequest
1 голос
/ 04 декабря 2008

Я кэшировал значение с помощью ASP.NET Cache со следующим кодом:

Cache.Insert("TEST_VALUE", 150, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(120));

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

Однако, если через 10 минут я запускаю страницу, которая записывает это значение из кеша, она все еще там (и действительно все еще через целый час). Я знаю, что больше нет доступа к нему, потому что это все на локальном сервере на моей машине.

Может кто-нибудь сказать мне, почему эти значения не удаляются из кэша?


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

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

Я предполагаю, что даже чтение из кеша должно продлить срок службы объекта, поэтому я оставляю его за 5-10 минут до обновления страницы «отладки», но значение все еще там!

Ответы [ 8 ]

4 голосов
/ 04 декабря 2008

Просто подсказка отладки: установите значение кэшированного объекта в DateTime. Теперь, когда вы вставляете его, чтобы увидеть, когда он был вставлен. Таким образом, вы можете легко определить, был ли он каким-либо образом вставлен повторно или что-то продолжает получать доступ, и таким образом заставляет его оставаться в кэше.

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

1 голос
/ 04 декабря 2008

Установить точку останова на все экземпляры операций чтения из кэша, чтобы увидеть, не произошло ли их неожиданное попадание (таким образом, продлить срок службы объекта)?

1 голос
/ 03 декабря 2008

Это правильное предположение с вашей стороны. Где вы делаете кеширование?

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

0 голосов
/ 14 марта 2012

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

например.

  • cache("Key") = 10
  • закрыть браузер
  • открыть браузер
  • textbox.text = cache("Key").
0 голосов
/ 05 декабря 2008

Подтвердить

<cache disableExpiration="true"/> 

не установлено в вашем файле web.config?

0 голосов
/ 04 декабря 2008

ОК, думаю, я понял это, но я не совсем уверен, почему это так:

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

После того, как я изначально присвоил значение Cache в коде, был цикл, в котором я назначал новое значение одному и тому же объекту на каждой итерации, используя:

Cache["TEST_VALUE"] = counter;

Однако с этим синтаксисом, как только это произошло, файл журнала показал, что элемент был удален из кэша, хотя он все еще был доступен на отдельной странице, которая только что записала значения кэшированных объектов?

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

Возиться, я изменил код так, чтобы вышеприведенная строка в цикле теперь читалась:

Cache.Insert("TEST_VALUE", newvalue, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(120));

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

Я очень смущен, но спасибо за вашу помощь:)

0 голосов
/ 04 декабря 2008

Вы абсолютно уверены, что не просто вставляете элемент в кеш при каждом обращении к странице?

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

Это единственное, что может объяснить это поведение, насколько я могу судить.

Я предлагаю вам установить точку останова на строке, где происходит Cache.Insert, и посмотреть, будет ли она выполняться при нажатии на страницу. Вы также можете подписаться на обратный вызов удаления Cache и записывать в файл, когда он истекает. Если вы сделаете это, вы можете выполнить страницу один раз; чтобы элемент был вставлен, а затем просто сядьте и посмотрите файл, чтобы увидеть, удаляется ли он.

0 голосов
/ 04 декабря 2008

Dupe вашего оригинального вопроса здесь:

В чем причина того, что мой ASP.NET Cache никогда не истекает, несмотря на то, что установлено скользящее время истечения?

Предлагаем вам предоставить больше информации о контексте кэширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...