Rails Memcache存储和expires_in问题

时间:2013-11-01 10:59:46

标签: ruby-on-rails caching ruby-on-rails-3.2 memcached

[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

1 个答案:

答案 0 :(得分:2)

从下面列出的几个来源看来,这是memcached行为的方式,与rails本身无关。如果像@Beerlington所说的那样,Rails 4.0没有这个,那么在将值传递给memcached之前,可能会检查这些值。

所以,答案,

memcached接受的最长到期时间为1个月。这在其代码中是硬编码的。如果你给出一个超过1个月的持续时间,它看起来就像是写入缓存,但它实际上被删除了。如果由于某种原因需要更长的到期时间,您可以随时选择提供它应该到期的确切时间,即1.year.from_now样式。如果以这种方式给出,这将接受更长的到期时间,并且我没有遇到任何最大值(可能是2038:P,或者不是)。

来源

  1. Memcache maximum key expiration time

  2. eliminating memcached's 30-day limit

  3. https://magento.stackexchange.com/questions/5925/memcached-why-data-is-not-stored/5961?noredirect=1#5961

  4. https://groups.google.com/forum/m/#!topic/memcached/TC30yVElo8U