Как правильно очистить кэш в Rails без подметальных машин

наблюдатели и Метельщики извлекаются от рельсов 4. Прохладный. Но как тогда кэшировать и очищать кэш ?

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

например:

<% cache @product do %>
  Some HTML code here
<% end %>

вам все еще нужно сделать @product из БД, чтобы получить ее cache_key. Поэтому кэширование страниц или действий может быть полезно для предотвращения ненужной загрузки.

I иногда можно использовать тайм-аут для очистки кэша, но зачем, если записи не изменились ?

по крайней мере, с sweepers у вас есть контроль над этим аспектом. Что такое / будет право способ сделать кэш и очистить его ?

спасибо ! :)

1 ответов


Добро пожаловать в одну из двух сложных проблем в области информатики, недействительность кэша :)

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

вы goto метод для этого является Rails.cache.fetch метод. Rails.cache.fetch принимает 3 аргумента; ключ кэша, хэш параметров и блок. Сначала он пытается прочитать допустимая запись кэша на основе ключа; если этот ключ существует и не истек, он вернет значение из кэша. Если он не может найти допустимую запись, он вместо этого берет возвращаемое значение из блока и сохраняет его в кэше с указанным ключом.

например:

@models = Rails.cache.fetch my_cache_key do
  Model.where(condition: true).all
end

это будет кэшировать блок и повторно использовать результат, пока что-то (tm) не аннулирует ключ, заставляя блок быть переоцененным. Также обратите внимание на .all в конце цепочки методов. Обычно Rails возвращает объект отношения ActiveRecord, который будет кэшироваться, и это будет оцениваться при попытке использовать @models в первый раз, аккуратно обходя кэш. The .all вызов заставляет Rails нетерпеливо загружать записи и гарантировать, что это результат, который мы кэшируем, а не вопрос.

Итак, теперь, когда вы получаете весь свой кэш и никогда не говорите с базой данных снова, мы должны убедиться, что мы покрываем другой конец, аннулируя кэш. Это сделано с the Rails.cache.delete метод, который просто берет ключ кэша и удаляет его, вызывая промах при следующей попытке получить его. Вы также можете использовать force: trueопция с fetch для принудительной переоценки блока. Как вам будет угодно.

наука обо всем этом есть куда позвонить Rails.cache.delete, в наивном случае это будет при обновлении и удалении для одного экземпляра и обновлении, удалении, создании на любом члене для коллекции. Всегда будут случаи bee corner, и они всегда являются приложением конкретно, так что я ничем не могу вам помочь.

Я предполагаю, что в этом ответе вы создадите какое-то нормальное хранилище кэша, например memcached или Redis.

также не забудьте добавить это в config/environments / development.rb:

config.cache_store = :null_store

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

для получения дополнительной информации Читать:все должны использовать кэширование низкого уровня в Rails и рельсы API docs

также стоит отметить, что функциональность не удаляется из Rails 4, а просто извлекается в драгоценный камень. Если вам нужно или хотелось бы, чтобы полные функции метельщиков просто добавить его обратно в приложение с gem 'rails-observers' строка в вашем файле. Этот камень содержит подметальные и наблюдателей, что сняли рельсы 4 ядра.

Я надеюсь, что helpt вы начнете.