为什么Rails.cache不存储API响应?

时间:2019-01-25 20:54:54

标签: ruby-on-rails ruby caching ruby-on-rails-5

我正在尝试缓存API调用的结果。我的应用程序以相同的结果进行了多次调用,我希望它使用缓存来节省时间。当我使用Rails.cache.fetch时,即使键相同,也会每次执行代码块(带有API请求)。我已经使用rails dev:cache在开发环境中启用了缓存。

我试图在Rails控制台中进行测试,但是我的本地Rails控制台也不会在缓存中存储任何密钥。在heroku上,控制台可用于缓存,但应用程序仍会发送每个API请求。

我尝试在本地使用内存和基于文件的缓存。

这是application_record.rb中的方法

我要删除对于我的目的而言不一致或重要的参数,然后使用参数和路径作为缓存键。

if

日志显示每次都发出请求。这两个广告系列的第一次和第二次请求完全相同。

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def send_request(params,path)
    key = params.except(:token, :start_date, :end_date)
    key[:path] = path
    puts key.to_s
    Rails.cache.fetch(key, expires_in: 5.minutes) do
      if (!$token || $token == '') then self.authenticate end
      params[:token] = $token
      url = URI("https://<api-domain>/"+path+"/?"+params.to_query)
      puts '**** sending request *****'
      begin
        Net::HTTP.start(url.host, url.port, :use_ssl => url.scheme == 'https') do |http|
          request = Net::HTTP::Get.new(url)
          request["cache-control"] = 'no-cache'
          response = http.request(request)
          if response.code == "200"
            return response
          elsif response.code[0] == "4"
            puts "recursive = "+response.code
            puts response.read_body
            $token = nil
            send_request(params,path)
          else
            puts "request_report server error"
            puts response.code
            puts JSON.parse(response.read_body)
            response
          end
        end
      rescue
        response = "SocketError: check that the server allows outbound https and that the bucksense API is live"
      end
    end
  end

我希望仅在5分钟内未发出相同请求时才进行API调用。相反,它每次都会调用API。

感谢您的帮助,如果我犯了一个愚蠢的错误,或者这不是达到期望结果的糟糕方法,请告诉我。

0 个答案:

没有答案