【问题标题】:Best way to cache a response in Sinatra?在 Sinatra 中缓存响应的最佳方法?
【发布时间】:2011-12-13 21:23:45
【问题描述】:

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

我大概可以将结果缓存 5 天左右,数据完全没有问题。我只是不是 100% 确定如何实现缓存。我将如何使用 Sinatra 来做这件事?

【问题讨论】:

    标签: ruby caching sinatra


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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

      【讨论】:

      • 我喜欢这个解决方案,因为它不依赖于 memcached/redis
      猜你喜欢
      • 2018-03-16
      • 2023-03-17
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      相关资源
      最近更新 更多