如何缓存ActiveResource模型?最好是在memcached中。现在它可以很好地从我的REST API中提取一个模型,但它每次都会提取几十条记录。最好是缓存它们。
发布于 2011-10-13 17:40:34
我一直在尝试同样的事情,我想我已经找到了一种非常简单的方法来首先检查缓存对象的redis。这只在使用find方法时有效,但对于我的需要,我认为这已经足够了。
通过覆盖find,我可以检查参数的校验和,看看我是否已经将响应保存在redis中。如果我这样做了,我就可以从redis中提取JSON响应并在那里创建一个新对象。如果没有,我将把find传递给ActiveResource::Base的find,正常的操作就会发生。
我还没有用ActiveResource实现将响应保存到redis中,但我的计划是在其他地方填充这些缓存。这样,通常我可以依赖于我的缓存在那里,但如果它们不在那里,我可以回退到API。
class MyResource < ActiveResource::Base
class << self
def find(*arguments)
checksum = Digest::MD5.hexdigest(arguments.md5key)
cached = $redis.get "cache:#{self.element_name}:#{checksum}"
if cached
return self.new JSON.parse(cached)
end
scope = arguments.slice!(0)
options = arguments.slice!(0) || {}
super scope, options
end
end
end还有一个小补丁,这样我们就可以获得数组的md5key:
require 'digest/md5'
class Object
def md5key
to_s
end
end
class Array
def md5key
map(&:md5key).join
end
end
class Hash
def md5key
sort.map(&:md5key).join
end
end这有帮助吗?
发布于 2011-10-08 10:35:37
rails中的缓存是可配置的。您可以将缓存配置为由memcached备份。通常,您可以在检索时缓存。不清楚你是rest使用者还是服务者,但这真的无关紧要。如果您在读取(或检索)时缓存,然后在下一次读取缓存,那么一切都将正常工作。如果您从数据库中提取数据,则提供缓存,如果没有可用的缓存,则缓存从数据库读取的数据。
我在这里写了一篇博文:http://squarism.com/2011/08/30/memcached-with-rails-3/
然而,我写的东西真的很简单。只是展示了如何使用类似于||=运算符的东西来避免昂贵的操作。举个更好的例子,new relic有一个scaling rails插曲。例如,它们展示了如何缓存最新的10个帖子:
def self.recent
Rails.cache.fetch("recent_posts", :expires_in => 30.minutes) do
self.find(:all, :limit => 10)
end
endRails.cache已经被配置为memcached缓存,这就是我所说的可配置部分。
发布于 2013-02-13 07:53:13
我建议研究一下https://github.com/Ahsizara/cached_resource,几乎所有的工作都是通过gem为您完成的。
https://stackoverflow.com/questions/7678591
复制相似问题