在Sinatra中缓存响应的最佳方法?

时间:2011-12-13 09:05:34

标签: ruby caching sinatra

我正在使用我用Sinatra制作的API来构建一个简单的应用程序,它返回一些JSON。它是相当多的JSON,我的应用程序的API依赖于对其他API的几百个请求。

我可以将结果缓存5天左右,根本没有问题。我只是不是100%确定如何实现缓存。我如何与Sinatra一起做这件事?

2 个答案:

答案 0 :(得分:12)

get '/my_data/:id' do
  # security check for file-based caching
  raise "invalid id" if params[:id] =~ /[^a-z0-9]/i
  cache_file = File.join("cache",params[:id])
  if !File.exist?(cache_file) || (File.mtime(cache_file) < (Time.now - 3600*24*5))
    data = do_my_few_hundred_internal_requests(params[:id])
    File.open(cache_file,"w"){ |f| f << data }
  end
  send_file cache_file, :type => 'application/json'
end

不要忘记mkdir cache

或者您可以使用memcache-client,但需要您在系统范围内安装memcached

答案 1 :(得分:12)

就个人而言,我更喜欢在memcached上使用redis来处理这类事情。我有一个应用程序,我使用redis非常广泛,使用它与你描述的类似的方式。如果我拨打一个未缓存的电话,页面加载时间超过5秒,使用redis,加载时间下降到0.3秒左右。您也可以设置过期时间,这可以很容易地更改。我会做这样的事情来从缓存中检索数据。

require 'redis'
get '/my_data/:id' do
  redis = Redis.new
  if redis[params[:id]]
    send_file redis[params[:id]], :type => 'application/json'
  end
end

然后,当您想将数据保存到缓存时,可能是这样的:

require 'redis'
redis = Redis.new
<make API calls here and build your JSON>
redis[id] = json
redis.expire(id, 3600*24*5)