在Rails中使用memcached的最佳实践?

时间:2009-05-09 07:36:27

标签: ruby-on-rails ruby memcached

由于我们的应用程序中的数据库转换越来越耗时,我们已经开始使用memcached来减少传递给MySQL的查询量。

总而言之,它运行良好,真的可以节省大量时间。

但是,由于缓存“无声地出现”作为一种解决方法来为应用程序提供更多功能,我们的许多模型现在都包含这样的代码:

def self.all_cached

  Rails.cache.fetch('object_name') {

    find(

      :all,
      :include => [associations])

    }

end

随着填充和刷新缓存在应用程序中的几个类中发生,这变得越来越痛苦。

现在,我想知道是否有更好的方法来抽象memcached逻辑,使其更强大,更易于在所有需要的模型中使用?

我正在考虑使用某种memcached模块,它包含在所有需要的模块中。

但在玩之前,我想:让我们先问问专家: - )

由于

马特

2 个答案:

答案 0 :(得分:13)

我建议您查看现有的插件,其中两个大插件是cache_fucache money。对于你想用缓存中的关联加载模型的用例,我强烈建议你尝试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个错误,而且通常是您不想拥有的噩梦。

答案 1 :(得分:5)

是的,拥有一个memcached模块,您可以将其包含在您需要的所有模型中,我认为这是最佳解决方案。你的思路很棒:)