我有一个类方法(放在/app/lib/
中),它执行一些繁重的计算和子http请求,直到收到结果。
结果不是太动态,并且是多个用户访问应用中特定视图的请求。
所以,我想安排定期运行该方法(使用cron和Whenever gem),使用JSON格式将结果存储在服务器中的某个位置,并按需要将结果单独读取到视图中。
如何实现这一目标? 正确这样做的方式是什么?
我现在有什么:
def heavyMethod
response = {}
# some calculations, eventually building the response
File.open(File.expand_path('../../../tmp/cache/tests_queue.json', __FILE__), "w") do |f|
f.write(response.to_json)
end
end
以及读取此文件的相应方法。
我搜索但无法找到使用Rails缓存约定(而不是我编写的某些私有代码)实现此目的的示例,以及与ActiveRecord无关的数据。
谢谢!
答案 0 :(得分:1)
您的解决方案应该可以正常工作,但使用Rails.cache
应该更干净,速度更快。 Rails guides提供了有关Rails.cache
以及如何使其与memcached
一起使用的足够信息,让我总结一下如何在您的案例中使用它
重法
def heavyMethod
response = {}
# some calculations, eventually building the response
Rails.cache.write("heavy_method_response", response)
end
请求强>
response = Rails.cache.fetch("heavy_method_response")
这里唯一的问题是当你的服务器第一次启动时,缓存将为空。如果/当memcache重启时。
一个优点是,在流程的某个地方,传入的数据被编组到存储中,然后在出路时无法使用。意思是你可以传递复杂的数据结构,而不需要手动序列化为json。
编辑:如果内存不足,memcached将清除您的项目。因为它使用LRU(我认为)算法来使事情过期,所以非常罕见,我猜你会经常使用它。 为了防止这种情况,
expires_in
设置为大于您的cron时段heavy_method
(例如Rails.cache.fetch("heavy_method_response") {heavy_method}
,并更改heavy_method
以返回该对象。redis
之类的内容。