背景:我正在研究订购系统的分析系统。每天大约有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