2011-12-13 62 views
9

我正在使用我用Sinatra制作的API返回一些JSON来构建一个简单的应用程序。这是相当多的JSON,我的应用程序的API依赖于对其他API的几百个请求。在Sinatra中缓存响应的最佳方法是什么?

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

回答

11

就个人而言,我更喜欢使用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) 
11
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

我喜欢这个解决办法,因为不依赖于分布式缓存/ Redis的 –

相关问题