[25] pry(main)> Rails.cache.fetch("my_key", :expires_in => 1.year) do
[25] pry(main)* (Time.now.to_date).to_s
[25] pry(main)* end
=> "2013-11-01"
[28] pry(main)> Rails.cache.fetch("my_key")
=> nil
我无法理解上述行为。缓存在此之前没有此密钥,或者更确切地说是nil
。
如果我删除expires_in
选项,这可以正常工作。
这是我的应用的生产版本,使用memcached
# Use a different cache store in production
config.cache_store = :mem_cache_store, <DNS NAME>
这也适用于我的本地,我希望它是基于文件系统的缓存。
编辑:啊,1.year
可能太长了......它适用于1.day
。这是一个错误还是记录在某个地方?
编辑:似乎1.month
是持续时间表格中的最大值。但这仍然是不可接受的行为
Memcache maximum key expiration time
答案 0 :(得分:2)
从下面列出的几个来源看来,这是memcached
行为的方式,与rails本身无关。如果像@Beerlington所说的那样,Rails 4.0没有这个,那么在将值传递给memcached之前,可能会检查这些值。
所以,答案,
memcached
接受的最长到期时间为1个月。这在其代码中是硬编码的。如果你给出一个超过1个月的持续时间,它看起来就像是写入缓存,但它实际上被删除了。如果由于某种原因需要更长的到期时间,您可以随时选择提供它应该到期的确切时间,即1.year.from_now
样式。如果以这种方式给出,这将接受更长的到期时间,并且我没有遇到任何最大值(可能是2038:P,或者不是)。
来源