0

我有一个相当慢的控制器动作,它在这里和那里做一些报告。我只需要每隔几天刷新一次数据,所以静态缓存结果是很容易的。

问题是,该操作需要几分钟才能完成,我不确定使旧数据过期并用新数据替换它们的最佳方法是什么。

现在,仅通用过期/请求的问题是几分钟(操作运行的时间)这些数据不可用。

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

4

1 回答 1

3

Rails 有一种内置方法,可以在旧缓存过期时使用更长的时间,同时重新生成新的缓存值。它是与:race_condition_ttl结合使用的设置:expires_in,如Rails Guides on Caching中所述。

使用 Rails 片段缓存,语法应该是:

<% 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)处理,即不直接服务但会执行block,写入缓存并服务请求。

race_condition_ttl引入是为了防止多个进程同时重新生成缓存,这将导致所有进程一次从数据库中读取数据等。但我认为它应该适合您的情况。

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

于 2012-09-22T11:23:11.020 回答