首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveResource缓存

ActiveResource缓存
EN

Stack Overflow用户
提问于 2011-10-07 02:07:20
回答 3查看 2.2K关注 0票数 2

如何缓存ActiveResource模型?最好是在memcached中。现在它可以很好地从我的REST API中提取一个模型,但它每次都会提取几十条记录。最好是缓存它们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-13 17:40:34

我一直在尝试同样的事情,我想我已经找到了一种非常简单的方法来首先检查缓存对象的redis。这只在使用find方法时有效,但对于我的需要,我认为这已经足够了。

通过覆盖find,我可以检查参数的校验和,看看我是否已经将响应保存在redis中。如果我这样做了,我就可以从redis中提取JSON响应并在那里创建一个新对象。如果没有,我将把find传递给ActiveResource::Base的find,正常的操作就会发生。

我还没有用ActiveResource实现将响应保存到redis中,但我的计划是在其他地方填充这些缓存。这样,通常我可以依赖于我的缓存在那里,但如果它们不在那里,我可以回退到API。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

这有帮助吗?

票数 4
EN

Stack Overflow用户

发布于 2011-10-08 10:35:37

rails中的缓存是可配置的。您可以将缓存配置为由memcached备份。通常,您可以在检索时缓存。不清楚你是rest使用者还是服务者,但这真的无关紧要。如果您在读取(或检索)时缓存,然后在下一次读取缓存,那么一切都将正常工作。如果您从数据库中提取数据,则提供缓存,如果没有可用的缓存,则缓存从数据库读取的数据。

我在这里写了一篇博文:http://squarism.com/2011/08/30/memcached-with-rails-3/

然而,我写的东西真的很简单。只是展示了如何使用类似于||=运算符的东西来避免昂贵的操作。举个更好的例子,new relic有一个scaling rails插曲。例如,它们展示了如何缓存最新的10个帖子:

代码语言:javascript
复制
def self.recent
  Rails.cache.fetch("recent_posts", :expires_in => 30.minutes) do
    self.find(:all, :limit => 10)
  end
end

Rails.cache已经被配置为memcached缓存,这就是我所说的可配置部分。

票数 1
EN

Stack Overflow用户

发布于 2013-02-13 07:53:13

我建议研究一下https://github.com/Ahsizara/cached_resource,几乎所有的工作都是通过gem为您完成的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7678591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档