2016-03-04 65 views
1

我的用例是我需要在服務之上實現一個緩存,應該在一段時間後(從創建時起)使條目到期。是否有第三方Java緩存提供對過期事件的控制?

如果該條目已過期,則應該查找服務以獲取最新條目。讓電話服務更新。

但是,可以說如果服務刷新失敗,那麼我應該能夠使用緩存中陳舊的數據。

但由於緩存已過期,因此我沒有該條目。

所以,我想控制緩存的到期和緩存條目只有在服務可用來獲取最新數據時纔會過期,否則不要刪除該條目。

我正在查看Google Guava緩存,但它只提供了一個只會通知事件的removeListener,但我無法用此控制到期事件。

是否有任何第三方緩存實現可以達到我的目的?

+0

這聽起來像你不想過期,但'refreshAfterWrite',因爲你不想刪除一個條目(只更新它的值)。 –

+0

** refreshAfterWrite **在給定的持續時間或整個緩存之後只更新一個條目嗎? 如果刷新時拋出任何異常,那麼以前的條目會保留原樣還是會拋出異常? 而我檢查,它需要重寫reload()方法異步。你能解釋我爲什麼異步嗎? –

+0

它是每個條目,重新加載時返回上一個值,並在第一個調用者的線程上執行,或者可以完全異步。如果你想要一個完整的週期性刷新,最簡單的方法就是使用'ScheduledExecutorService'來代替。 –

回答

1

這種韌性和健壯性語義在cache2k中實現。我們在生產中使用它已經有一段時間了。該設置是這樣

CacheBuilder.newCache(Key.class, Value.class) 
    .name("myCache") 
    .source(new YourSourceImplementation()) 
    .backgroundRefresh(true) 
    .suppressExceptions(true) 
    .expiryDuration(60, TimeUnit.SECONDS) 
    .build(); 

隨着exceptionExpiryDuration實際上你可以設置重試較短的時間間隔。在SO上有類似的問題,我也回答了這個問題,請看:Is it possible to configure Guava Cache (or other library) behaviour to be: If time to reload, return previous entry, reload in background (see specs)在那裏你會找到更多關於它的細節。

無論你使用什麼緩存,你都會遇到很多問題,因爲一般的異常處理和構建健壯和有彈性的應用程序都需要細節中的一些想法。

這就是說,我對這個解決方案並不滿意,因爲我認爲我們需要更多的控制,例如,多長時間的數據應該被提供。此外,如果緩存中存在陳舊的數據,緩存需要有一些提示。我在這裏提出一些想法:https://github.com/cache2k/cache2k/issues/26

反饋非常受歡迎。