如何缓存API调用的结果?

时间:2014-02-24 07:30:42

标签: ruby-on-rails ruby caching

我正在从服务器调用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随时间变化我该怎么办?

2 个答案:

答案 0 :(得分:1)

如果已更改,则密钥应更改。理想情况下,您希望您的密钥在某些方面反映其所代表的数据的独特之处。

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

在请求总是相同的情况下,应该有一种方法来确定api是否已经改变,可能是通过较便宜的api调用。如果此调用表明新数据可用,则应清除该键的缓存并请求新数据。

在发出请求之前检查数据是否已更改的一种方法是使用ETag和条件获取。详情请参见http://fideloper.com/api-etag-conditional-get

答案 1 :(得分:-1)

如果get_some_data_from_server的结果改变而不是通话

Rails.cache.delete(get_cache_key)

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