背景:我正在研究訂購系統的分析系統。每天大約有100,000個訂單,分析需要在最近N(例如100天)的月份內運行。相關數據適合內存。 N天后,所有訂單都從內存緩存中逐出,過去一整天都被驅逐出境。訂單可以創建或更新。基於日期緩存過期的緩存或MultiMap?
傳統方法將使用
ConcurrentHashMap<Date, Queue<Order>>
。每天,表示過去N天以上的日期的鍵值將被刪除。但是,當然,使用番石榴的重點在於避免這種情況。編輯:將Map
更改爲ConcurrentHashMap
,查看問題的結尾以獲得理由。隨着番石榴收藏,
MultiMap <Date, Order>
會更簡單。驅逐類似,明確實施。雖然
Cache
實現看起來很吸引人(畢竟,我正在實現一個緩存),但我不確定驅逐選項。驅逐只會每天發生一次,並且最好從緩存外發起,我不希望緩存必須檢查訂單的年齡。我甚至不確定緩存是否會使用MultiMap,我認爲在這種情況下它是一個合適的數據結構。
因此,我的問題是:是否有可能使用與我所需要的規則使用並公開多重映射的語義,並允許外界本身從控制拆遷,特別是高速緩存(「刪除所有訂單較老比N天「)?
作爲一個重要的說明,我對LoadingCache
不感興趣,但我確實需要批量加載(如果應用程序需要重新啓動,必須從數據庫中填充緩存,並在最後N天的訂單)。
編輯:忘了提,必須同時,由於訂單進來他們對以前的訂單實時評估爲同一客戶或地點等
EDIT2地圖:只要絆倒Guava issue 135。它看起來像MultiMap不是併發的。
請參閱[番石榴問題#142](https://code.google.com/p/guava-libraries/issues/detail?id=142)('Cache'是'MapMaker'生成的'ConcurrentMap'的後繼者)和[這個問題](http://stackoverflow.com/questions/737060/create-weak-multimap-with-google-collections)。 – Xaerxess
關於編輯#2:您可以使用['Multimaps#synchronizedMultimap'](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimaps.html#synchronizedMultimap( com.google.common.collect.Multimap))擁有一個由指定的multimap_支持的同步(線程安全)multimap。 – Xaerxess
@Xaerxess謝謝,我將不得不測試它是如何執行的;我擔心它不會像ConcurrentHashMap那麼好,在這種情況下,我將不得不回到使用JDK類(即問題中的方法#1)。 – wishihadabettername