AppEngine Memcache过期策略

我期待以下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操作之前将expiration设置为右,我确实得到了预期的“null,true”。

Memcache是​​否以某种方式解释了过去相对于现在而不是绝对的过期日期? 但是,即使这样也不符合结果,因为距离看跌期权的1ms在到期时仍应该到期?!?

我可以将Expiration设置为什么值,以保证put条目的立即到期(和删除!)? 请记住,简单地使用当前时间戳可能无法可靠地工作,因为AppEngine不提供跨服务器的任何时钟同步保证!

我知道想要做到这一点听起来毫无意义乍一看(为什么不删除呢?),但我想在这里使用它: AppEngine Memcacheprimefaces获取和删除 (句子在“结论”上方)。

哇! 这很模糊,但我弄清楚了:

看看AsyncMemcacheServiceImpl.java中doPut()方法的来源 ,第505行读取:

 itemBuilder.setExpirationTime(expires == null ? 0 : expires.getSecondsValue()); 

Expiration.getSecondsValue()包含以下行:

 return (int) (getMillisecondsValue() / 1000); 

换句话说:到期值“0”相当于没有到期(与null相同),并且到期时间通过除以1000转换为秒。

所以,如果我设置1ms的到期时间,它会变成0秒(当除以1000时向下舍入),这相当于没有到期…… Blah !!!

所以,答案是: Expiration.onDate(new Date(1000))应该立即过期,除非memcache服务器仍然生活在60年代… :)试了一下。 作品。 完成…

(这些测试是在DevServer上完成的。我希望生产服务器的行为一样。)

Interesting Posts