使用Ruby on Rails重建静态缓存的最佳方法是什么?

时间:2012-09-11 12:06:41

标签: ruby-on-rails caching

我有一个非常慢的控制器动作,它在这里和那里进行一些raporting。我只需要每隔几天刷新一次数据,因此静态缓存结果并不是一件容易的事。

问题是,该操作需要几分钟时间才能完成,我不确定这是使旧数据到期并将其替换为新数据的最佳方式。

现在,通用expire / request的问题是几分钟(动作运行的时间)这些数据不可用。

在Rails中使用静态缓存机制是否有任何合理的方法来克服这种差距?或者我应该以不同的方式重建整个事物?

1 个答案:

答案 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 %>

结果:

  • 1)第一个请求:缓存为空,因此将执行块并将结果写入缓存
  • 2)接下来24小时之间的所有请求:将直接从缓存中提供(这是新鲜的)
  • 3a)24小时后的首次请求但在宽限期将从稍微过时的缓存中提供;缓存将在后台重新生成:块一执行就执行并写入缓存
  • 3b)24小时后的首次请求但超出宽限期将被视为1),即不直接提供但将执行阻止,将写入缓存并提供请求。
引入了

race_condition_ttl以防止多个进程同时重新生成缓存,这会导致所有进程在高度请求的资源上立即从数据库中读取数据等,但我认为它应该可以正常工作你的情况。

如何选择:expires_in:race_condition_ttl的时间是您的选择,我建议您这样计算:expires_in + race_condition = expires_in_that_you_would_usually_set。这样,缓存会更频繁地重新生成,但也会更新,特别是如果不经常渲染操作/视图。