2014-01-17 64 views
1

我要處理緩存條目到期前,這是我的使用情況:
如何處理緩存條目到期前?

我使用的是Cache<ClientID,DataForClient>(含10分鐘過期和無緩存存儲)把數據在我的應用程序服務器, 所以遠程客戶端可以在數據過期之前從應用服務器檢索這些數據。

在緩存中的數據到期前我想提醒誰沒有取回自己的數據的少數懶惰遠程客戶端,以便他們能夠快點之前它就會過期檢索數據。

我怎樣才能做到這一點?


  • 減少到期時間,並增加對CacheEntryRemovedEvent一個Listener重新添加刪除的內容是不正確的:客戶端可以嘗試獲取其數據 而聽者重新添加它,刪除和重新添加只是看起來不太好,而實施邏輯重新添加一次會使這變得更加複雜。

  • 假設它是可能得到的過期順序緩存條目(鍵就足夠了)(例如那些它們接近其到期時間是開頭) 而不改變其last_accessed_time(所以這止跌不會干擾緩存機制來清理過期的條目),我會發送警告給懶惰的客戶端來快速獲取他們的數據。

  • 我想過啓用鈍化,鈍化處理和激活的事件,和配置數據存儲,但....這將解決了複雜化。

回答

0

您可以創建另一個緩存緩存< ClientID的,太虛>其中的條目將有壽命較短。然後,您可以使用CacheEntryRemovedEvent上的偵聽器來通知客戶端。 你甚至可以通過另一個偵聽CacheEntryCreatedEvent/CacheEntryModifiedEvent自動化這個紀錄的創造。

+0

感謝您有用的答案。我更在尋找一種方式來做到這一點,沒有任何其他的數據結構(在你的答案高速緩存),但是,用事件來處理這個其他緩存是聰明的,我要去試試看 – user454322

+0

從當條目被逐出/刪除主緩存也應該從 懶惰客戶端的緩存中刪除。由於[有在Infinispam過期事件的任何通知(https://community.jboss.org/thread/175533)我使用的是番石榴緩存, 'RemovalCause.EXPIRED'懶惰的客戶,以這種方式僅過期(不刪除或驅逐)條目觸發客戶端警告。 – user454322

+0

正確,到期通知未實現(但JIRA已重新開放,因爲現在可以實施)。對不起,我忘了。 –