tkr*_*car 6 caching web-services ruby-on-rails-3
在我的应用程序中,在主页操作中,我调用返回JSON的特定Web服务.
parsed = JSON.parse(open("http://myservice").read)
@history = parsed['DATA']
Run Code Online (Sandbox Code Playgroud)
这个数据每60秒不会改变一次以上,并且不会在每个访问者的基础上改变,所以我希望,理想情况下,缓存@history变量本身(因为解析不会产生新的结果)并自动使其无效如果它超过一分钟.
我不确定这样做的最好方法.默认的Rails缓存方法似乎都更倾向于需要手动过期的内容.我确信有一种快速简便的方法可以做到这一点,我只是不知道它是什么!
您可以使用内置的Rails缓存:
@history = Rails.cache.fetch('parsed_myservice_data', :expires_in => 1.minute) do
JSON.parse connector.get_response("http://myservice")
end
Run Code Online (Sandbox Code Playgroud)
这种方法的一个问题是重建要缓存的数据需要相当长的时间.如果在此期间收到许多客户端请求,则每个客户端请求都会出现缓存未命中并调用您的块,从而导致大量重复工作,更不用说响应时间慢.
编辑:在Rails 3.x中,您可以将选项传递:race_condition_ttl给fetch方法以避免此问题.在这里阅读更多相关信息.
在以前版本的Rails中,一个很好的解决方案是设置一个后台/ cron作业,以定期运行,以获取和解析数据并更新缓存.
在您的控制器或型号中:
@history = Rails.cache.fetch('parsed_myservice_data') do
JSON.parse connector.get_response("http://myservice")
end
Run Code Online (Sandbox Code Playgroud)
在你的背景/ cron工作中:
Rails.cache.write('parsed_myservice_data',
JSON.parse connector.get_response("http://myservice"))
Run Code Online (Sandbox Code Playgroud)
这样,您的客户端请求将始终获得新的缓存数据(如果尚未运行后台/ cron作业,则第一个请求除外.)
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |