我有一个相当慢的控制器动作,它在这里和那里做一些报告。我只需要每隔几天刷新一次数据,所以静态缓存结果是很容易的。
问题是,该操作需要几分钟才能完成,我不确定使旧数据过期并用新数据替换它们的最佳方法是什么。
现在,仅通用过期/请求的问题是几分钟(操作运行的时间)这些数据不可用。
是否有任何合理的方法可以仅使用 Rails 中的静态缓存机制来克服这一差距?还是我应该以不同的方式重建整个事物?
我有一个相当慢的控制器动作,它在这里和那里做一些报告。我只需要每隔几天刷新一次数据,所以静态缓存结果是很容易的。
问题是,该操作需要几分钟才能完成,我不确定使旧数据过期并用新数据替换它们的最佳方法是什么。
现在,仅通用过期/请求的问题是几分钟(操作运行的时间)这些数据不可用。
是否有任何合理的方法可以仅使用 Rails 中的静态缓存机制来克服这一差距?还是我应该以不同的方式重建整个事物?
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 %>
结果:
race_condition_ttl
引入是为了防止多个进程同时重新生成缓存,这将导致所有进程一次从数据库中读取数据等。但我认为它应该适合您的情况。
如何选择时间:expires_in
和:race_condition_ttl
是你的选择,我建议这样计算:expires_in + race_condition = expires_in_that_you_would_usually_set
. 这样,缓存会更频繁地重新生成,但也更新鲜,特别是如果动作/视图不经常呈现。