【问题标题】:Rails fragment caching "expires_in" value is always recalculatedRails 片段缓存“expires_in”值总是重新计算
【发布时间】:2014-04-01 15:52:13
【问题描述】:

有谁知道为什么每次读取缓存片段时,rails 似乎都会重新计算“expires_in”的值?

示例

cache("usecase_#{usecase.id}", :expires_in => "#{usecase.minutesToNextRun}".to_i.minutes) do
    some code
end

如果我检查日志,我发现每次读取缓存片段时都会调用 usecase.minutesToNextRun 方法(这非常昂贵并且会降低应用程序的速度)。

理论

通常我希望 rails 只计算一次 :expires_in 值,然后将该值(例如 5 分钟)与当前时间(在伪代码中)进行比较。

if time_the_fragment_was_stored + expires_in > now
    do nothing
else
    re-render fragment
end

问题

有没有人有任何提示/想法如何防止 Rails 在每次读取片段时重新计算到期时间?

【问题讨论】:

    标签: ruby-on-rails caching fragment cache-expiration


    【解决方案1】:

    在这部分代码之前(或在您的控制器或演示者中):

    cache("usecase_#{usecase.id}", :expires_in => "#{usecase.minutesToNextRun}".to_i.minutes) do
      some code
    end
    

    试试这个:

    @minutes_to_next_run ||= usecase.minutesToNextRun
    

    在上面的例子中,如果@minutes_to_next_runnil,那么它被设置为等于usecase.minutesToNextRun。如果它有一个值,它就会使用它。如果你按语义阅读它,它是有道理的:

    @minutes_to_next_run 或 @minutes_to_next_run = usecase.minutesToNextRun

    here 是一个(非常)明确的答案

    【讨论】:

    • 嗨,...感谢您的快速回答...它有效:-)!!!你能告诉我代码实际上发生了什么变化吗?似乎无论如何都调用了该函数(因为未设置@minutes_to_next_run)
    • 嗨,再次感谢您的评论和链接。仍然声明似乎说“如果没有设置@minutes_to_next_run(它不是)分配usecase.minutesToNextRun”->这仍然应该调用usecase.minutesToNextRun这是我想规避的昂贵调用:-)
    • 对,不同的是,昂贵的调用只被调用一次
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多