如何使用Dalli更新MemCached中的到期时间?

我正在使用Ruby on Rails(v3.2.13),Dalli(v2.6.4)和MemCached(v1.4.13)。

我像这样缓存:

result = Rails.cache.fetch("test_key", :expires_in => 1.week) do get_data() # slow call, result of which should be cached end 

我想根据数据更新缓存过期日期,因为我的一些数据可以保存更长时间。

现在,以下代码完成了这项工作:

  if keep_longer(result) Rails.cache.write("test_key", result, :expires_in => 6.months) end 

我知道MemCached支持“touch”命令,允许更新到期日期而不发送值。 我不知道如何通过Dalligem使用它。 有没有办法更新到期日期而不重新发送结果?

更新:

  Rails.cache.dalli.touch('some_key', 24.hours) 

这应该有效,但对我来说却没有。 对你起作用吗?

这是您可以尝试的小例子。 在IRB中执行以下代码之后

  dc = Dalli::Client.new("localhost:11211") dc.set("test_key", "test_value", 5.minutes) dc.set( "key", "value", 5.minutes) dc.touch( "key", 10.minutes) 

我正在使用telnet检查到期日期:

 telnet localhost 11211 

然后给出正确的slab_id并使用“stats cachedump”命令,我获得以秒为单位的到期时间:

 stats cachedump 1 0 ITEM key [9 b; 1375733492 s] ITEM test_key [14 b; 1375905957 s] 

请注意,键“key”的到期时间指向过去。 当我预计它比“test_key”到期时间晚300秒。 此外,我注意到MemCached服务器启动之前的“密钥”到期时间约为1秒。 这可能表示此密钥没有到期时间。 事实上,“密钥”在不久的将来不会被删除。

我做错了什么或者是Dalli / MemCached的错误?

Dalli确实支持这一点 – 在Dalli::Client上有一种touch方法,它完全按照它在锡上的说法完成。 Rails.cache返回缓存存储而不是底层的Dalli对象,因此您需要这样做

 Rails.cache.dalli.touch('some_key', 24.hours) 

将缓存条目的到期时间提高24小时(当然memcache可能决定放弃条目)

我发现我的MemCached版本(v1.4.13)有错误 :二进制触摸操作没有正确更新到期时间。 此错误已在v1.4.14( 发行说明 )中修复:

修复了无效二进制协议触摸命令到期时间的问题

现在的问题是:截至今天版本v1.4.14及更高版本无法使用apt-get安装。