Я пытаюсь кэшировать результаты вызовов 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 каждый раз.
Спасибо за помощь, дайте мне знать, если я делаю глупую ошибку или это плохой способ достичь желаемых результатов.