我在我们的某个仪表板系统上有一个很长的数据库查询,我想要缓存,因为结果不需要实时准确,但可以从缓存中提供“足够接近”的值。
我想在没有用户等待的情况下这样做。我正在寻找使用像
这样的东西Rails.cache.write('my_val', 'val', :expires_in => 60.minutes)
存储此值,但我不相信它提供了我想要的确切功能。我想打电话给
Rails.fetch('my_val') { create a background task to update my_val; return expired my_val}
似乎my_val在缓存过期后会从缓存中删除。有没有办法访问这个过期的值,或者可能是另一种能够启用此功能的内置机制?
感谢。
答案 0 :(得分:2)
这样做:
Rails.cache.write('my_val', 'val')
永不过期
现在运行你的后台工作:
SomeLongJob.process
在SomeLongJob.process工作中执行以下操作:
def SomeLongJob.process
some_long_calculation = Blah.calc
Rails.cache.write('my_val', some_long_calculation)
end
现在用
读取数据def get_value
val = Rails.cache.read('my_val', 'val')
end
答案 1 :(得分:1)
:race_condition_ttl
的{{1}}选项非常接近您所寻找的内容:http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch
但据我所知,第一个请求仍然被阻止(只是后续的请求在更新时获得旧值)。不知道为什么他们没有一路走下去。如果将@drhenner提到的模式抽象为类似的选项会更好,但我还没有看到它。