在Sinatra,是否可以将全局数据保存在内存中?

时间:2015-11-24 10:02:09

标签: ruby sinatra

我正在向API服务器添加API。 API服务器是由其他人基于Sinatra框架构建的。基本上它看起来像:

class ApiMain < Sinatra::Base
   get "/api/xx" {...}
   get "/api/yy" {...}
end

现在我添加了一个新的API,它返回从db加载的数据。对我的新API的调用预计非常频繁,但是数据不经常更新,以减少数据库的工作量,我想将数据缓存在内存中,并且每分钟只从db加载一次。假设每分钟有1000次调用我的API,这样就减少了999次db访问。

当我阅读Sinatra doc时,我看到&#34;对于每个传入的请求,都会创建一个新的应用程序类实例,并且所有处理程序块都在该范围内运行。&#34;

我是Sinatra的纯新手,我想知道是否可以将数据缓存在可与所有请求范围共享的全局变量中?如果是,如何实现全局变量?我们将非常感谢您的简短样本。

1 个答案:

答案 0 :(得分:2)

其中一个选择是使用set方法,它将数据存储在类变量中。

require 'sinatra/base'

class App < Sinatra::Base
  set :cache, {}

  get "/?:word?" do
    word = params[:word]
    App.cache[word] ||= 0
    App.cache[word] += 1
    count = App.cache[word]
    "`#{word}` was called #{count} times"
  end
end

你应该记住,这种方法有很多陷阱。您应该关心将此数据与其原始源同步。在Ruby Hash可能发生变异的情况下,你应该不小心改变它。您将获得每个流程的数据副本等。