Лучшие практики для использования memcached в Rails? - PullRequest
14 голосов
/ 09 мая 2009

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

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

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

def self.all_cached

  Rails.cache.fetch('object_name') {

    find(

      :all,
      :include => [associations])

    }

end

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

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

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

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

Спасибо

Мэтт

Ответы [ 2 ]

13 голосов
/ 12 мая 2009

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

5 голосов
/ 09 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...