我正在尝试缓存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。
感谢您的帮助,如果我犯了一个愚蠢的错误,或者这不是达到期望结果的糟糕方法,请告诉我。