【问题标题】:ActiveResource Caching活动资​​源缓存
【发布时间】:2013-02-13 07:53:13
【问题描述】:

您将如何缓存 ActiveResource 模型?最好在 memcached 中。现在它正在从我的 REST API 中提取模型,但每次都会提取数十条记录。最好将它们缓存起来。

【问题讨论】:

  • 请原谅我完全愚蠢的问题,但什么是“ActiveResource 模型”?我认为 ActiveRecord 类是模型类,ActiveResource 是控制器类。我到处看到这句话,但并不完全理解。很抱歉捎带你的问题:(
  • 这是否意味着模型由 RESTful 请求/api 而不是数据库支持?
  • ActiveResource 模型只是检索数据的一种不同方式。 ActiveRecord 用于数据库,正如 ActiveResource 用于外部数据(例如 API)。然而,ActiveResource 没有 ActiveRecord 的很多细节。

标签: ruby-on-rails activeresource


【解决方案1】:

我一直在玩同样的事情,我想我找到了一种非常简单的方法来首先检查 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

这有帮助吗?

【讨论】:

    【解决方案2】:

    rails 中的缓存是可配置的。您可以将缓存配置为由 memcached 支持。通常,您可以在检索时缓存。目前尚不清楚您是休息消费者还是服务,但这确实无关紧要。如果您在读取(或检索)时缓存,然后下次读取缓存,一切都会正常工作。如果您从数据库中提取数据,请提供缓存,如果没有可用的缓存,则缓存从数据库中读取的数据。

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

    但是我写的内容真的很简单。只是展示了如何避免使用类似于 ||= 运算符的昂贵操作。举个更好的例子,新遗物有一个缩放轨道插曲。例如,他们展示了如何缓存最新的 10 篇文章:

    def self.recent
      Rails.cache.fetch("recent_posts", :expires_in => 30.minutes) do
        self.find(:all, :limit => 10)
      end
    end
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2014-09-30
        • 2012-05-08
        • 2015-10-03
        • 2021-10-06
        • 2013-11-30
        • 2012-01-20
        相关资源
        最近更新 更多