Лучшие практики использования memcached в Rails?

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

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

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

def self.all_cached

  Rails.cache.fetch('object_name') {

    find(

      :all,
      :include => [associations])

    }

end

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

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

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

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

Спасибо

Мэтт


person Matt    schedule 09.05.2009    source источник


Ответы (2)


Я бы порекомендовал проверить существующие плагины, два больших: 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 ошибкам и, как правило, является кошмаром, который вам не нужен.

person Sam    schedule 12.05.2009

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

person Ryan Bigg    schedule 09.05.2009
comment
Вы можете порекомендовать один или вы говорите написать его с нуля? этот ответ не кажется полным - person Brian Armstrong; 23.06.2009