Вопрос по ruby-on-rails-4, caching, ruby-on-rails – Как правильно очищать кеш в Rails без подметальных машин?

9

Наблюдатели и подметальные машины удалены из Rails 4. Круто. Но как кешировать и очищать кеш тогда?

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

Например:


  Some HTML code here

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

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

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

Спасибо ! :)

Ваш Ответ

1   ответ
8

наук, аннулирование кэша :)

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

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

Например:

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

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

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

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

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

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

config.cache_store = :null_store

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

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

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

Я надеюсь, что поможет вам начать.

Я согласен, удалив, я хотел сказать не по умолчанию в Gemfile. Не всем нужен jbuilder, но это будет по умолчанию ... Вопрос мнений, я думаю, ^^ Happynoff
Отредактированный ответ включает эту информацию. Jonas Schubert Erlandsson
Что касается аннулирования кэша, я думаю, это возвращает нас к роли уборщиков. Вместо звонкаRails.cache.delete в моем контроллере я мог использовать щетки из внешнего камня. Я думаю, что в этом случае имеет смысл, неты? Спасибо за ваш ответ :) Happynoff
Да, от роли подметателя трудно уйти, поскольку это одна из предпосылок для стратегии работающего кэша;) У меня обычно есть класс жизненного цикла для таких вещей, как аннулирование кэша, обмен сообщениями и взаимодействие с внешними моделями. Таким образом, вы получаете чистый контроллер, небольшой базовый класс и добавляете свое постороннее поведение в другой класс, который слушает базовый класс. По сути, уборочная машина - это всего лишь специализированный случай одного из этих классов жизненного цикла, и в них нет ничего плохого по своей сути как стратегии. Jonas Schubert Erlandsson

Похожие вопросы