2014-05-05 74 views
1

我期待以下的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會以某種方式解釋過去相對於現在而言過於遙遠的過期日期而不是絕對的嗎?但即使這樣也不符合結果,因爲1ms的投入仍然應該在獲勝的時候過期?!?

我可以將過期設置爲什麼值,以確保放入條目立即到期(和刪除!)?請記住,簡單地使用當前時間戳可能無法可靠地工作,因爲AppEngine不提供跨服務器的任何時鐘同步保證!

我知道想要做到這一點乍一看聽起來毫無意義(爲什麼不只是刪除它?),但我想在這裏使用它:AppEngine Memcache atomic get-and-delete(在「結論」上方的句子)。

回答

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上完成的,我希望生產服務器的行爲相同。)