我使用Ruby on Rails的(v3.2.13),达利(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的支持“触摸”命令,允许不发送的值更新过期日期。 而且我没有看到如何通过达利宝石使用它。 有没有办法不重新发送该结果更新期限吗?
更新:
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并使用“统计cachedump”指令I获得的到期时间以秒为:
stats cachedump 1 0
ITEM key [9 b; 1375733492 s]
ITEM test_key [14 b; 1375905957 s]
需要注意的是关键“钥匙”指向过去的到期时间。 当我希望它在300秒后比“test_key”过期时间。 此外,我注意到,“钥匙”过期时间为1秒左右的memcached服务器开始前。 这可能表明,这个键有没有过期时间。 而事实上,“钥匙”没有得到在不久的将来被删除。
我是不是做错了什么,或者是达利/ Memcached的的错误吗?