14

随着我们应用程序中的数据库事务变得越来越耗时,我们开始使用 memcached 来减少传递给 MySQL 的查询量。

总而言之,它运行良好,确实节省了大量时间。

但由于缓存作为一种解决方法“悄无声息地出现”,为应用程序提供更多动力,我们的许多模型现在都包含如下代码:

def self.all_cached

  Rails.cache.fetch('object_name') {

    find(

      :all,
      :include => [associations])

    }

end

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

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

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

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

谢谢

马特

4

2 回答 2

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 个错误,并且通常是您不希望遇到的噩梦。

于 2009-05-12T16:55:08.063 回答
5

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

于 2009-05-09T10:32:22.700 回答