如何在ruby中缓存方法?

时间:2016-05-04 05:49:23

标签: ruby caching rubygems

我有一个ruby工作流程,它可以进行一些昂贵的API调用。我知道我们有一种更简单的方法来缓存Ruby on Rails中的东西,但是没有找到ruby脚本的任何常见ruby gem。

对于依赖纯ruby应用程序输入的方法缓存结果的最简单,最简单的方法是什么?

//pseudo code
def get_information (id)
  user_details = expensive_api_call(id)
  return user_details
end

5 个答案:

答案 0 :(得分:4)

最简单的方法是使用哈希:

class ApiWithCache

  def initialize
    @cache = {}
  end

  def do_thing(id)
    expensive_api_call(id)
  end

  def do_thing_with_cache(id)
    @cache[id] ||= do_thing(id)
  end
end

现在这会带来一些您可能想要研究的问题:

  • 缓存数据到期
  • 缓存大小(不删除某些项目)

答案 1 :(得分:1)

纯红宝石已经很容易了:

def foo(id)
  @foo[id] ||= some_expensive_operation
end

就宝石而言 - 请查看memoist

答案 2 :(得分:0)

您可以使用包含哈希的实例变量和||=运算符来执行此操作,如:

def initialize
  @user_cache = {}
  # ...
end

def get_information(id)
  @user_cache[id] ||= expensive_api_call(id)
end

||=表示只有在左值(在这种情况下为@user_cache[id])为假(nil或false)时才执行方法调用并执行赋值。否则,将使用散列中已有的值。

答案 3 :(得分:0)

通过哈希全局变量

来做
def get_information(id)
    @user_details ||= {}
    @user_details[id] ||= expensive_api_call(id)
    return @user_details[id]
end

答案 4 :(得分:0)

尝试zache

require 'zache'
zache = Zache.new
x = zache.get(:x, lifetime: 15) do
  # Something very slow and expensive, which
  # we only want to execute once every 15 seconds.
end

我是作者。