我正在使用 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 支持“触摸”命令,该命令允许在不发送值的情况下更新到期日期。而且我看不到如何通过 Dalli gem 使用它。有没有办法在不重新发送结果的情况下更新到期日期?
更新:
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 秒。这可能表明该密钥没有过期时间。事实上,“key”在不久的将来不会被删除。
我做错了什么还是Dalli / MemCached的错误?