您可以使用内置的Rails的缓存此:
@history = Rails.cache.fetch('parsed_myservice_data', :expires_in => 1.minute) do
JSON.parse connector.get_response("http://myservice")
end
的一个问题用这种方法时,被缓存的数据重建需要 相当长的时间。如果您在此期间收到很多客户端请求,它们中的每一个都会在 之间发生缓存未命中并调用您的块,导致大量重复工作,更不用说响应时间慢了。
编辑:在Rails 3.x中,您可以将选项:race_condition_ttl
传递给fetch
方法以避免此问题。详细了解它here。
在之前版本的Rails中,一个很好的解决方案是设置一个background/cron作业,以定期运行的方式来获取和解析数据并更新缓存。
在您的控制器或模型:
@history = Rails.cache.fetch('parsed_myservice_data') do
JSON.parse connector.get_response("http://myservice")
end
在你的背景/ cron作业:
Rails.cache.write('parsed_myservice_data',
JSON.parse connector.get_response("http://myservice"))
这样,您的客户端请求总是会得到新的缓存数据(除了第一 请求如果background/cron作业尚未运行)。
非常好,这个效果很好。请注意,它是:expires_in,而不是:expire_in。这个编辑不够重要,所以让我做出来(非常怪异的系统)。 – tkrajcar
错字修正,谢谢。 –