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

Ruby 在Sinatra中缓存响应的最佳方法?,ruby,caching,sinatra,Ruby,Caching,Sinatra,我正在使用我用Sinatra制作的API构建一个简单的应用程序,该API返回一些JSON。这是相当多的JSON,我的应用程序的API依赖于对其他API的数百个请求 我可能可以将结果缓存5天左右,数据没有任何问题。我只是不能100%确定如何实现缓存。我将如何使用Sinatra实现这一点?get'/my_data/:id'do get '/my_data/:id' do # security check for file-based caching raise "invalid id" if

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

我可能可以将结果缓存5天左右,数据没有任何问题。我只是不能100%确定如何实现缓存。我将如何使用Sinatra实现这一点?

get'/my_data/:id'do
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
#基于文件的缓存的安全检查 如果参数[:id]=~/[^a-z0-9]/i,则引发“无效id” cache_file=file.join(“cache”,参数[:id]) 如果!File.exist?(cache_File)|(File.mtime(cache_File)<(Time.now-3600*24*5)) 数据=执行我的几百个内部请求(参数[:id]) open(cache_File,“w”){| f | f'application/json' 结束
不要忘记
mkdir缓存


或者,你可以使用
memcache客户端
,但这需要你在系统范围内安装
memcached

就个人而言,我更喜欢在memcached上使用redis来完成这类事情。我有一个应用程序,我非常广泛地使用redis,使用方式与你描述的类似。如果我打了一个不是cac的电话hed,页面加载时间超过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)
需要“redis”
redis=redis.new
redis[id]=json
redis.expire(id,3600*24*5)

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