AppEngine Memcache过期策略

时间:2014-05-05 17:50:30

标签: java google-app-engine memcached cache-expiration

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

Memcache是​​否以某种方式解释了过去相对于现在而非绝对的过期日期?但是,即使这样也不符合结果,因为当看到它的时候,掉落的1ms仍然会过期?!

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

我知道想要做到这一点听起来毫无意义乍一看(为什么不删除呢?),但我想在这里使用它:AppEngine Memcache atomic get-and-delete(句子在“结论”之上)。

1 个答案:

答案 0 :(得分:4)

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

看一下source for the doPut()-method in AsyncMemcacheServiceImpl.java,第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上完成的。我希望生产服务器的行为相同。)