Rails缓存,继续存储过期值

时间:2011-11-24 04:08:45

标签: ruby-on-rails ruby caching

我在我们的某个仪表板系统上有一个很长的数据库查询,我想要缓存,因为结果不需要实时准确,但可以从缓存中提供“足够接近”的值。

我想在没有用户等待的情况下这样做。我正在寻找使用像

这样的东西
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在缓存过期后会从缓存中删除。有没有办法访问这个过期的值,或者可能是另一种能够启用此功能的内置机制?

感谢。

2 个答案:

答案 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提到的模式抽象为类似的选项会更好,但我还没有看到它。