在Ruby Gem中缓存,可能不使用Rails

时间:2010-05-13 18:22:57

标签: ruby-on-rails caching memcached

我正在重写现有的Ruby Gem以包含缓存。这适用于相对常用的gem,并访问Web服务上的大量静态数据。目前,我有a small number of gem users doing a large number of accesses to the service that under normal conditions would be swamping / downing the service,我们将把gem放在github上供一般消费。

目前,用户可以选择使用rails缓存机制,简单的磁盘缓存还是不使用缓存。

让人们选择使用这样的缓存的最佳做法是什么(能够在rails之外使用这是一个优先事项,所以我不能保释到底层的缓存机制)?我正在寻找配置和界面的建议/示例,尤其是。

感谢您的建议

1 个答案:

答案 0 :(得分:1)

我写了一个名为“cachecataz”的gem,它允许任何嵌入器定义他们想要使用的缓存机制/提供者。您可以轻松使用相同的方法,允许用户在多种不同的缓存机制之间进行选择。

我选择将api定义为“Provider”,然后定义“api”,定义任何提供者需要哪些方法。这就是“Rails.cache”提供程序和api的样子。

Cachecataz.provider = Rails.cache
Cachecataz.api = {:get => :read, :set => :write, :incr => :increment, :exist? => :exist?}

这是一个非常简单的方法让某人选择对象来响应gem编写器所需的方法。 api哈希中的每个值可以是符号或响应的对象:call(如Proc或lambda)。然后我只在我的gem中使用我的内部表示(:get,:set,:incr,:exists?)并查找需要调用的Object /方法以在运行时执行它:

def make_api_call(method, *args)
  if Cachecataz.api[method].respond_to?(:call)
    Cachecataz.api[method].call(*args)
  else
    Cachecataz.provider.send(Cachecataz.api[method], *args)
  end
end

这不是所有代码,但它足以说明您可以在自己的gem中实现可插入缓存api的速度,并支持许多缓存机制/提供程序。 Cachecataz是开源的,如果你想查看代码,可以在github上运行,它非常简短且有文档记录。