我正在使用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”命令,该命令允许更新到期日期而不发送值。我不知道如何通过Dalli宝石使用它。有没有办法更新到期日期而不重新发送结果?
更新:
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的错误?
答案 0 :(得分:2)
Dalli确实支持这一点 - touch
上的Dalli::Client
方法与锡上的内容完全相同。 Rails.cache
返回缓存存储而不是底层Dalli对象,因此您需要执行
Rails.cache.dalli.touch('some_key', 24.hours)
将缓存条目的到期时间提高24小时(当然memcache可能决定放弃条目)
答案 1 :(得分:0)
我发现我的MemCached版本(v1.4.13)有the bug:二进制触摸操作没有正确更新到期时间。此错误已在v1.4.14(release notes)中修复:
修复了无效二进制协议触摸命令到期时间的问题
现在的问题:截至今天版本v1.4.14及更高版本无法使用apt-get
安装。