Рекомендации по использованию memcached в Rails?

поскольку транзакции базы данных в нашем приложении становятся все более и более трудоемкими, мы начали использовать memcached для уменьшения количества запросов, переданных MySQL.

В целом, он отлично работает и действительно экономит много времени.

Но поскольку кеширование "молчаливо появлялось" в качестве обходного пути, чтобы придать приложению больше сока, многие наши модели теперь содержат такой код:

def self.all_cached

  Rails.cache.fetch('object_name') {

    find(

      :all,
      :include => [associations])

    }

end

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

Теперь мне было интересно, есть ли лучший способ абстрагировать логику memcached, чтобы сделать ее более мощной и простой в использовании во всех необходимых моделях?

Я думал о наличии какого-то memcached-модуля, который включен во все необходимые модули.

Но прежде чем играть, я подумал: сначала спросите экспертов: -)

Спасибо

Matt

Ответы

Ответ 1

Я бы рекомендовал проверить существующие плагины, два больших - cache_fu и кеш-деньги. Для вашего случая использования, когда вы хотите загрузить модель со своими ассоциациями из кеша, я настоятельно рекомендую вам попробовать Cache Money, что делает это почти автоматически:

def parent < ActiveRecord::Base
  has_many children
end

def child < ActiveRecord::Base
  index :parent_id
end

#now you can do the following without ever hitting the DB
parents = Parent.find :all
parents.each{ |p| p.children }

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

Ответ 2

Да, с модулем memcached, который вы включаете во все модели, которые вам нужны, я считаю лучшим решением. Ваша линия мышления превосходна:)