1

我正在使用 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的错误?

4

2 回答 2

2

Dalli 确实支持这一点 - 有一种touch方法Dalli::Client可以完全按照它在锡上所说的那样做。Rails.cache返回一个缓存存储而不是底层的 Dalli 对象,所以你需要做

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

将缓存条目的到期时间延长 24 小时(当然,memcache 可能会决定删除该条目)

于 2013-08-06T19:26:18.233 回答
0

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

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

现在的问题:从今天开始,v1.4.14 及更高版本无法使用apt-get.

于 2013-08-08T18:31:20.363 回答