我期待以下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(句子在“结论”之上)。
答案 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上完成的。我希望生产服务器的行为相同。)