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

9
我正在构建一个简单的应用程序,使用我用Sinatra创建的API返回一些JSON。这是相当多的JSON,我的应用程序的API依赖于对其他API的几百个请求。
我可以将结果缓存5天左右,数据完全没有问题。只是我不确定如何实现缓存。我该如何在Sinatra中实现缓存?
2个回答

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


3
我很喜欢这个解决方案,因为它不依赖于memcached/redis。 - patm

12

个人而言,我更喜欢在这种情况下使用redis而不是memcached。我有一个应用程序,我在其中广泛使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接