【问题标题】:How to update expiration time in MemCached using Dalli?如何使用 Dalli 更新 MemCached 中的过期时间?
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我发现我的 MemCached (v1.4.13) 版本有the bug:binary touch operation没有正确更新过期时间。此错误已在 v1.4.14 (release notes) 中修复:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多