Почему Rails.cache не хранит ответы API? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь кэшировать результаты вызовов API.Мое приложение выполняет несколько вызовов с одинаковым результатом, и я хотел бы использовать кеш для экономии времени.Когда я использую Rails.cache.fetch, блок кода (с запросом API) выполняется каждый раз, даже если ключи совпадают.Я включил кэширование в среде разработки с помощью rails dev: cache.

Я попытался протестировать в консоли rails, но моя локальная консоль rails также не будет хранить какие-либо ключи в кэше.На heroku консоль работает для кэширования, но приложение по-прежнему отправляет каждый запрос API.

Я попытался использовать локальное кэширование как в памяти, так и в файлах.

Вот метод в application_record.rb

Я удаляю параметры, которые не соответствуют или важны для моей цели, а затем использую параметры и путь в качестве ключа кэша.

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

В журнале показано, что запросы выполняются каждыевремя.Первый и второй запросы для обеих этих кампаний абсолютно одинаковы.

Entering new campaign: Show********************************
{:metrics=>"wins,win_rate,ctr,clicks_global", :timezone=>"UTC", :type=>"1", :method=>"getdata", :groupby=>"P1D", :dimensions=>"advertiser_name,campaign_name", :path=>"3.0/report/thirdpart"}
**** sending request *****
{:metrics=>"wins,win_rate,ctr,clicks_global", :timezone=>"UTC", :type=>"1", :method=>"getdata", :groupby=>"P1M", :dimensions=>"advertiser_name,campaign_name", :path=>"3.0/report/thirdpart"}
**** sending request *****
Campaign finished: ********************************



Entering new campaign: ********************************
{:metrics=>"wins,win_rate,ctr,clicks_global", :timezone=>"UTC", :type=>"1", :method=>"getdata", :groupby=>"P1D", :dimensions=>"advertiser_name,campaign_name", :path=>"3.0/report/thirdpart"}
**** sending request *****
{:metrics=>"wins,win_rate,ctr,clicks_global", :timezone=>"UTC", :type=>"1", :method=>"getdata", :groupby=>"P1M", :dimensions=>"advertiser_name,campaign_name", :path=>"3.0/report/thirdpart"}
**** sending request *****
Campaign finished: ********************************

Я ожидаю, что вызовы API будут выполняться только в том случае, если один и тот же запрос не был выполнен в течение 5 минут.Вместо этого он вызывает API каждый раз.

Спасибо за помощь, дайте мне знать, если я делаю глупую ошибку или это плохой способ достичь желаемых результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...