【发布时间】:2014-06-22 02:46:47
【问题描述】:
我期待以下 AppEngine 代码:
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
memcache.put("Foo", "Bar", Expiration.onDate(new Date(1)));
System.out.println(memcache.get("Foo"));
System.out.println(memcache.put("Foo", "Baz", null, SetPolicy.ADD_ONLY_IF_NOT_PRESENT));
产生以下输出:
null
true
即通过在将条目放入缓存时将过期日期设置为 1970 年,我希望它会立即被删除并可供重复使用。
相反,我得到:
Bar
false
即条目还在。
现在,奇怪的是,如果我将代码更改为Expiration.onDate(new Date())(没有1),即在执行put操作之前将到期时间设置为正确,我确实得到了预期“空,真”。
Memcache 是否会以某种方式将过去太远的过期日期解释为相对于现在而不是绝对日期?但即使这样也不符合结果,因为从 put 开始的 1ms 在 get 到来时应该已经过期了?!?
我可以将 Expiration 设置为什么值,以保证 put 条目立即到期(并删除!)?请记住,仅使用当前时间戳可能无法可靠地工作,因为 AppEngine 不提供跨服务器的任何时钟同步保证!
我知道乍一看想要这样做听起来很荒谬(为什么不直接删除它?),但我想在这里使用它:AppEngine Memcache atomic get-and-delete(“结论”上方的句子)。
【问题讨论】:
标签: java google-app-engine memcached cache-expiration