2010-07-13 58 views
1

我不确定这是否可能。我在一个memcache服务器中存储了一些信息。我存储的memcache条目被假设为30分钟到期。在那30分钟内,我可以通过同一个密钥更新该内存缓存条目引用的值。但是,当我更新的价值,我不想改变过期时间。例如:PHP Memcache密钥到期

  • 钥匙创建并设置在30分钟内
  • 10分钟,过期的推移和被请求的关键字的价值,我们更改值
  • 我更换使用它们键的值memcache替换(我不提供新的过期时间,因为它是可选的),我希望过期时间为30-10 = 20,因为密钥是在10分钟前创建的,并且设置为在30分钟内过期。
  • 现在,因为我没有设置过期时间,所以它默认为0,并且密钥永不过期。

现在,有没有设置在内存缓存中的项目,设定到期时间,然后获取/更换项目,同时保持了到期时间x分钟后,我设置缓存中的项目的方式?

我可能可以使用unix时间戳而不是秒设置到memcache中时过期,也可以将该时间戳存储在memcache中,当我将其设置回memcache时,我只需将其设置为存储在同一个时间戳中值。或者有更好的方法来做到这一点?

顺便说一句,使用memcache而不是memcached。

回答

1

本质上,Memcache确实做到了你想要的。它很好地完成了工作,获得并设置了值......我认为您寻找的答案超出了memcache的默认功能。我想你可以把更多的控制权放在你的代码库上来检查你存储在blob中的时间戳,并使用它来设置未来更新的过期时间?

我不知道你的非memcache一致存储使用了什么,但我会在此存储一个失效日期 - 然后使用该值更新你的memcache。

+0

是的,我只是要在memecache中存储到期的时间戳,所以我可以设置到期价值,当我更换价值。 我不想使用其他类型的存储(如sql db或nosql db)只是过期。我可以在memcache中完成所有操作,只需通过一些简单的操作即可。 但你是对的,memecache做它应该做的。 谢谢! – gprime 2010-07-13 18:13:52

3

我知道这个问题已经过时了,但我认为我应该对gprime的解决方案加以警告。

这听起来像gprime的“小丑丑”是将过期作为一个单独的值存储在内存缓存中。问题是,memcache最终可能会在需要时清除过期值。即使分配给memcached的内存不足,也会发生这种情况。

(进一步解释见http://sparklewise.com/?p=506

这可能是一个问题,如果你的代码不占可能性先前存储的到期不见了。即使你这样做了,你最终可能会在高速缓存中的值超过预期。

在99.999%的情况下,这可能不是什么大问题,但这是一个棘手的问题,当它发生时会引起大量的头发拉伤和头部划伤。希望这篇文章能帮助别人避免这种痛苦。 :-)