Как правильно очистить кэш в 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 вы начнете.