我有一个非常慢的控制器动作,它在这里和那里进行一些raporting。我只需要每隔几天刷新一次数据,因此静态缓存结果并不是一件容易的事。
问题是,该操作需要几分钟时间才能完成,我不确定这是使旧数据到期并将其替换为新数据的最佳方式。
现在,通用expire / request的问题是几分钟(动作运行的时间)这些数据不可用。
在Rails中使用静态缓存机制是否有任何合理的方法来克服这种差距?或者我应该以不同的方式重建整个事物?
答案 0 :(得分:3)
Rails有一种内置的方法,可以在新的缓存值重新生成时过期使用陈旧缓存。这是与:race_condition_ttl
结合使用的:expires_in
设置,如Rails Guides on Caching中所述。
使用Rails Fragment缓存语法应为:
<% cache 'my_awesome_cache_key', :expires_in => 12.hours.to_i, :race_condition_ttl => 12.hours.to_i %>
# This block will be cached
<% end %>
结果:
race_condition_ttl
以防止多个进程同时重新生成缓存,这会导致所有进程在高度请求的资源上立即从数据库中读取数据等,但我认为它应该可以正常工作你的情况。
如何选择:expires_in
和:race_condition_ttl
的时间是您的选择,我建议您这样计算:expires_in + race_condition = expires_in_that_you_would_usually_set
。这样,缓存会更频繁地重新生成,但也会更新,特别是如果不经常渲染操作/视图。