Когда целесообразно использовать CacheItemRemovedCallback? - PullRequest
6 голосов
/ 18 сентября 2010

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

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

Являются ли эти проблемы актуальными, и если использование CacheItemRemovedCallback для перезагрузки кеша является плохой идеей, тогда когдаэто полезно?

Ответы [ 4 ]

4 голосов
/ 03 октября 2010
  1. Если вы собираетесь перезагрузить компьютер, обязательно проверьте CacheItemRemovedReason. Недавно мне пришлось отладить проблему, из-за которой разработчик решил, что они должны немедленно заново заполнить кеш в этом методе, и в условиях нехватки памяти он в основном жевал процессор, пока он застрял в цикле построения объектов кеша, добавляя их в кеш, истекающий, повторите.

  2. Обратный вызов срабатывает после элемент удален.

2 голосов
/ 01 октября 2010

Из всех ответов и дальнейшего чтения я пришел к следующему выводу:

Мои опасения действительны. Использование CacheItemRemovedCallback для обновления кэшированных элементов не является хорошей идеей. Единственное практическое использование для этого обратного вызова - это регистрация информации о том, когда ваш кеш удален.

Кажется, что CacheItemUpdateCallback является более подходящим способом обновления вашего кэша через регулярные промежутки времени.

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

1 голос
/ 18 сентября 2010

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

Я бы рекомендовал загружать статическую коллекцию при запуске и заменять ее каждые 24 часа, устанавливая таймер.Идея заключается в том, чтобы создать новую коллекцию и атомарно назначить ее, поскольку старая может все еще использоваться, и мы хотим, чтобы она оставалась самосогласованной.

1 голос
/ 18 сентября 2010
  1. Да, есть изменение, что метод может быть запущен по многим различным причинам. Однако загрузка или ожидание загрузки кеша будет зависеть от того, что лучше всего подходит для вашего типичного варианта использования в вашем приложении.

  2. CacheItemRemovedCallback действительно запускает после , когда элемент удаляется из кэша. Справа от до элемента должен быть удален, вы можете использовать метод CacheItemUpateCallback, чтобы определить, хотите ли вы очистить кэш в это время. Могут быть веские причины для ожидания очистки кеша, например, если у вас есть пользователи в вашем приложении, и для создания кеша требуется много времени.

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

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