我期待以下 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
IE。通过在将条目放入缓存时设置 1970 年的到期日期,我希望它会立即被删除并可供重用。
相反,我得到:
Bar
false
IE。该条目仍然存在。
现在,奇怪的是,如果我将代码更改为Expiration.onDate(new Date())
(没有1
),即在执行 put 操作之前将到期时间设置为正确,我do得到预期的“null,true”。
Memcache 是否以某种方式将过去太久的过期日期解释为相对于现在而不是绝对的???但即使这样也不符合结果,因为当 get 到来时,put 的 1ms 应该仍然已经过期了?!?
我可以将“过期”设置为什么值,以保证看跌条目立即过期(并删除!)?请记住,仅使用当前时间戳可能无法可靠地工作,因为 AppEngine 不提供任何跨服务器的时钟同步保证!
我知道这样做乍一看听起来很荒谬(为什么不直接删除它?),但我想在这里使用它:AppEngine Memcache 原子获取和删除(“结论”上方的句子)。
哇!这很晦涩,但我明白了:
看看AsyncMemcacheServiceImpl.java 中 doPut() 方法的源代码,第 505 行内容如下:
itemBuilder.setExpirationTime(expires == null ? 0 : expires.getSecondsValue());
And Expiration.getSecondsValue()包含以下行:
return (int) (getMillisecondsValue() / 1000);
换句话说:过期值为“0”相当于没有过期(与null),并将过期时间除以 1000 转换为秒。
所以,如果我设置 1 毫秒的过期时间,它就会变成 0 秒(除以 1000 时向下舍入),这相当于没有过期时间...Blah!!!
所以,答案是:Expiration.onDate(new Date(1000))
应该立即过期,除非 memcache 服务器仍然生活在 60 年代......:) 尝试过。作品。完毕...
(这些测试是在 DevServer 上完成的。我希望生产服务器的行为也相同。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)