【问题标题】:How do I cache the result of API call?如何缓存 API 调用的结果?
【发布时间】:2014-02-24 17:59:23
【问题描述】:

我正在从服务器调用 API 方法:

def get_data
  #.........
  get_some_data_from_server
end

显然,我想缓存这个调用的结果。所以我在表中创建了一个字段并将get_data 更改为如下所示:

  def fetch_data
    key = get_cache_key
    Rails.cache.fetch key, expires_in: 500.minutes do 
      get_some_data_from_server   
    end
  end

get_some_data_from_server 的结果不会经常变化,几乎一直都是一样的。但它可能会随着时间的推移而改变,甚至在 500 分钟过去时早。因此,用户可能会从缓存中接收到过时的数据。

这种策略明智吗? get_some_data_from_server 随时间变化怎么办?

【问题讨论】:

    标签: ruby-on-rails ruby caching


    【解决方案1】:

    如果它已经改变,那么密钥应该改变。理想情况下,您希望您的密钥在某种程度上反映它所代表的数据的独特之处。

    以请求为例。如果您提出的请求包含两个日期,则接收两点之间的数据。我的密钥将包括这两个日期,因此每次我从不同的日期范围请求数据时,它都不会使用相同的缓存密钥。

    在请求始终相同的情况下,应该有一种方法可以确定 api 是否已更改,也许通过更便宜的 api 调用。如果此调用表明有新数据可用,那么您应该清除该键处的缓存并请求新数据。

    在发出请求之前检查数据是否更改的一种方法是使用 ETag 和条件获取。详细说明可以看这里http://fideloper.com/api-etag-conditional-get

    【讨论】:

    • 如果它已经改变,那么密钥应该改变。 - 没有为什么?它是持久的。
    • 您的密钥决定了您是否应该提出请求。因此,如果请求参数更改,您的密钥应该更改。我不知道 get_some_data 正在做什么类型的请求。
    • 你怎么知道我的密钥决定了什么?它不依赖于 api 或其他任何东西的结果。 request get_some_data 进行 api 调用。键看起来像“my_api_call_#{current_user.id}”。
    • get_some_data 使用哪些参数?它们是变化的,还是静止的?
    • 如果 API 使用 etags,你会想走那条路。如果您发出 curl -i -H "If-None-Match: c0947-b1-4d0258df1f625" example.com/api/todo/4 之类的请求并且没有得到结果,那么数据没有改变,如果你得到一个结果,你重置你的 etag 并更新相关的数据。在这种情况下,API 会为您进行缓存,您可以绕过 Rails.cache。您只需要将 etag 存储在某个地方。
    【解决方案2】:

    如果get_some_data_from_server的结果比调用改变了

    Rails.cache.delete(get_cache_key)
    

    https://stackoverflow.com/a/19603852/1289704

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多