如何使用达利更新过期时间在Memcached的?(How to update expiration

2019-10-18 11:03发布

我使用Ruby on Rails的(v3.2.13),达利(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的支持“触摸”命令,允许不发送的值更新过期日期。 而且我没有看到如何通过达利宝石使用它。 有没有办法不重新发送该结果更新期限吗?

更新:

    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并使用“统计cachedump”指令I获得的到期时间以秒为:

stats cachedump 1 0

ITEM key [9 b; 1375733492 s]
ITEM test_key [14 b; 1375905957 s]

需要注意的是关键“钥匙”指向过去的到期时间。 当我希望它在300秒后比“test_key”过期时间。 此外,我注意到,“钥匙”过期时间为1秒左右的memcached服务器开始前。 这可能表明,这个键有没有过期时间。 而事实上,“钥匙”没有得到在不久的将来被删除。

我是不是做错了什么,或者是达利/ Memcached的的错误吗?

Answer 1:

达利不支持这一点-有一个touch的方法Dalli::Client是不正是它在锡说。 Rails.cache返回高速缓存存储而不是底层达利对象,所以你需要做的

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

颠簸的缓存条目的在24小时到期时间(当然内存缓存可以决定无论如何要删除的条目)



Answer 2:

我发现我的Memcached(v1.4.13)的版本有错误 :二进制触摸操作不正确更新过期时间。 此bug已被固定在v1.4.14( 发行说明 ):

无效的二进制协议触摸命令到期时间固定的问题

现在的问题:今天的版本v1.4.14,后来不能使用安装apt-get



文章来源: How to update expiration time in MemCached using Dalli?