Как бы вы истекли время хранения фрагментов в модели или в Resque?

Я взял цитату ниже, в которой я вижу некоторый смысл:

"Кэшированные страницы и фрагменты обычно зависят от состояний модели. Кэш не заботится о том, какие действия создают, изменяют или разрушают соответствующие модели. Поэтому использование обычного наблюдателя представляется мне лучшим выбором для устаревших кэшей".

Например. У меня есть работник Resque, который обновляет модель. Мне нужен кэш фрагментов, чтобы истечь, когда модель обновляется / создается. Это не может быть сделано с подметальной машиной.

Однако использование наблюдателя будет означать, что мне нужно что-то вроде, либо в модели, либо в задании Resque:

ActionController::Base.new.expire_fragment('foobar')

Сама модель не должна знать о кешировании. Что также нарушит принципы MVC, которые приведут к безобразным уродливым результатам в будущем.

4 ответа

Используйте ActiveRecord::Observer для отслеживания изменений модели. Это может истечь кеш.

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

<% cache @model do %>
  # your code here
<% end %>

За кулисами происходит кэш с именем [model]/[id]-[updated_at]. У моделей есть метод cache_key, которая возвращает строку, содержащую идентификатор модели и отметку времени updated_at. При изменении модели отметка времени updated_at фрагмента не будет совпадать, и кэш будет сгенерирован заново.

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

У Райана Бейтса также есть платный Railscast на тему: Кэширование фрагментов.

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

<% cache "post-#{@post.id}", @post.updated_at.to_i do %>

Когда этот пост обновляется или удаляется, и вы извлекаете его снова, он пропустит кеш, поскольку хеш отличается, поэтому он как бы истекает и кеширует новое значение. Я думаю, что у вас могут возникнуть некоторые проблемы, например, если вы используете кеш Rails по умолчанию, который создает html-файлы в качестве кеша, так что через некоторое время в вашем публичном каталоге окажется много файлов, так что вам лучше установить ваше приложение использует что-то вроде memcached, который управляет памятью, удаляя старые кэшированные записи / страницы / parcials, если необходимо кэшировать другие или что-то в этом роде.

Я бы рекомендовал просмотреть этот раздел на sweepers в Руководстве по Rails - Кэширование с Rails: обзор

http://guides.rubyonrails.org/caching_with_rails.html

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

Другие вопросы по тегам