【问题标题】:how to update Rails.cache TTL on read/fetch如何在读取/获取时更新 Rails.cache TTL
【发布时间】:2015-03-26 21:30:38
【问题描述】:

我想将我的对象保留在 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)

【问题讨论】:

    标签: ruby-on-rails-3 caching


    【解决方案1】:

    这是我想出的一个特定于 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 的一部分,除非我错过了什么。

    【讨论】:

    • 为了模仿 Memcache TTL,我认为您需要删除重新启动行。在 Memcache 中,无论如何,缓存都会在 ttl_seconds 后过期。
    【解决方案2】:

    据我了解,您希望在获取时更新 TTL 只是为了使缓存仅存储经常使用的记录。我猜原因是缓存大小。

    不要那样做!让缓存引擎决定要保留哪些记录。如果您使用的是 Memcached,它可以立即完成这项工作,您永远不必担心删除旧记录。如果您使用的是 Redis,则需要configure it as an LRU cache

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 1970-01-01
      • 2017-10-02
      • 2014-03-31
      • 2020-08-22
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多