首页 > 解决方案 > Rails:使用 Typhoeus 缓存 API 请求

问题描述

如何在 Rails 中使用 Typhoeus gem 缓存 api 请求?在尝试了 2 小时后,我放弃了自己尝试做这件事。

我有以下代码:

            hydra = Typhoeus::Hydra.new
            requests = urls.map do |url|
                request = Typhoeus::Request.new(url, followlocation: true)
                hydra.queue(request)
                request
            end
            hydra.run

他们的文档说“Typhoeus 包含对缓存的内置支持。在以下示例中,如果缓存命中,缓存对象将传递给请求对象的 on_complete 处理程序。”

class Cache
  def initialize
    @memory = {}
  end

  def get(request)
    @memory[request]
  end

  def set(request, response)
    @memory[request] = response
  end
end

Typhoeus::Config.cache = Cache.new

Typhoeus.get("www.example.com").cached?
#=> false
Typhoeus.get("www.example.com").cached?
#=> true

但我不明白该把这段代码放在哪里。

标签: ruby-on-railsapicachingrequest

解决方案


创建一个初始化程序来设置缓存。类似于:(config/initializers/typhoeus.rb)

redis = Redis.new(url: "your redis url")
Typhoeus::Config.cache = Typhoeus::Cache::Redis.new(redis, default_ttl: 60)

然后在您的请求中,您可以添加缓存相关选项。

request = Typhoeus::Request.new(url,
                                method: method,
                                params: params,
                                body: body,
                                headers: request_headers,
                                cache_ttl: 10, 
                                cache_key: "unique_key")

request.run

ttl 以秒为单位。Typhoeus cache_key 默认为:

Digest::SHA1.hexdigest "#{self.class.name}#{base_url}#{hashable_string_for(options)}"

他们没有记录。您必须查看源才能弄清楚。
可能没问题,但是如果您愿意,我将演示如何设置您自己的。

如果您想在不使用缓存传递缓存的情况下发出请求:选项中的 false 因为缓存将默认为所有请求启用。


推荐阅读