【发布时间】:2013-08-07 22:28:28
【问题描述】:
我正在使用 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 的错误?
【问题讨论】:
标签: ruby-on-rails ruby memcached dalli