由于我们的应用程序中的数据库转换越来越耗时,我们已经开始使用memcached来减少传递给MySQL的查询量。
总而言之,它运行良好,真的可以节省大量时间。
但是,由于缓存“无声地出现”作为一种解决方法来为应用程序提供更多功能,我们的许多模型现在都包含这样的代码:
def self.all_cached
Rails.cache.fetch('object_name') {
find(
:all,
:include => [associations])
}
end
随着填充和刷新缓存在应用程序中的几个类中发生,这变得越来越痛苦。
现在,我想知道是否有更好的方法来抽象memcached逻辑,使其更强大,更易于在所有需要的模型中使用?
我正在考虑使用某种memcached模块,它包含在所有需要的模块中。
但在玩之前,我想:让我们先问问专家: - )
由于
马特
答案 0 :(得分:13)
我建议您查看现有的插件,其中两个大插件是cache_fu和cache 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模块,您可以将其包含在您需要的所有模型中,我认为这是最佳解决方案。你的思路很棒:)