Rails缓存过期

时间:2012-01-13 05:35:27

标签: ruby-on-rails

我有一个rails应用程序,因为我使用简单的rails缓存。我的测试如下:

Rails.cache.write('temp',Date.today,:expires_in => 60.seconds)

我可以通过Rails.cache.read('temp')Rails.cache.fetch('temp')阅读。

问题是它没有过期。它会在60秒后仍然存在。任何人都可以告诉我这里缺少什么。

仅供参考:我已在我的development.rb中声明如下:

config.action_controller.perform_caching = true

config.cache_store = :memory_store

我错过了什么吗?我想让我的缓存过期。

3 个答案:

答案 0 :(得分:11)

经过一番搜索后,我发现了60秒后未清除缓存的一个可能原因。

  1. 您致电Rails.cache.write,其中记录了here
  2. 它会调用write_entry(namespaced_key(name, options), entry, options),其中您的选项:expires_inoptions参数的一部分。
  3. implementation of write_entry具有以下条件:

    if expires_in > 0 && !options[:raw]
        # Set the memcache expire a few minutes in the future to support race condition ttls on read
        expires_in += 5.minutes
    end
    
  4. 所以你的60秒加入了5分钟。 2种可能的解决方案:

    • 忍受它: - )
    • 尝试包含选项:raw => true,也许这会跳过这个条件,以便您的到期时间可疑。

答案 1 :(得分:5)

:expires_in选项仅适用于兼容商店(例如memcached) - 而非内存。

来自http://guides.rubyonrails.org/caching_with_rails.html

  

最后,如果您使用的是memcached或Ehcache,您也可以通过   :过期日期在。实际上,caches_action没有使用的所有参数都是   发送到底层缓存存储区。

答案 2 :(得分:0)

您应该将fetch方法与do块一起使用,而不是Rails.cache.write。即使名称是“ fetch”,但如果将其放在do块中,它也会写入缓存。您也不需要手动清除缓存条目,只需将带有“ expires_in”和“ race_condition_ttl”的“ fetch”一起使用。将ttl值保持在有效期内,并使其尽可能小。

docker-compose down