我有一个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
我错过了什么吗?我想让我的缓存过期。
答案 0 :(得分:11)
经过一番搜索后,我发现了60秒后未清除缓存的一个可能原因。
Rails.cache.write
,其中记录了here。write_entry(namespaced_key(name, options), entry, options)
,其中您的选项:expires_in
是options
参数的一部分。 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
所以你的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