如何在read / fetch上更新Rails.cache TTL

时间:2013-11-30 16:55:09

标签: ruby-on-rails-3 caching

我希望将对象保留在Rails缓存中,只要在某个时间间隔(例如10分钟)内有读取。我可以使用以下命令在缓存对象创建上成功设置TTL:

Rails.cache.fetch('key', expires_in: 10.minutes) do
  some_expensive_operation
end

但是我注意到'key'的后续缓存读取没有达到TTL(至少在我的设置中没有,这是Rails 3.2 + Redis)。

有没有办法让Rails.cache.{fetch,read}重新启动缓存命中的TTL?

我的另一种选择是做以下事情,这似乎有些浪费:

result = Rails.cache.read('key') || some_expensive_operation
Rails.cache.write('key', result, expires_in: 10.minutes)

2 个答案:

答案 0 :(得分:0)

这是我提出的特定于redis的解决方案:

def fetch(key, ttl_seconds)
  cached_value = $redis.get(key)

  if cached_value
    # re-up the TTL
    $redis.expire(key, ttl_seconds)

    result = Marshal.load(cached_value)
  else
    result = yield
    $redis.setex(key, ttl_seconds, Marshal.dump(result))
  end

  result
end

fetch('key', 10.minutes) do
  some_expensive_operation
end

我更喜欢缓存提供商中立的东西,但这似乎不是Rails缓存API的一部分,除非我错过了什么。

答案 1 :(得分:0)

据我所知,你想在fetch上更新TTL只是为了让缓存只存储经常使用的记录。我想原因是缓存大小。

不要那样做!让缓存引擎决定要保留哪些记录。如果你正在使用 Memcached ,它可以开箱即用,你就永远无法删除旧记录。如果您使用 Redis ,则需要configure it as an LRU cache