背景:我正在为一个订购系统开发一个分析系统。每天大约有 100,000 个订单,并且需要在最后 N(例如 100)天的几个月内运行分析。相关数据适合内存。N 天后,所有订单都从内存缓存中逐出,过去一整天都被逐出。可以创建或更新订单。
传统方法将使用
ConcurrentHashMap<Date, Queue<Order>>
. 每天,表示过去 N 天以上日期的键的值将被删除。但是,当然,使用 Guava 的全部目的是避免这种情况。编辑:更改Map
为ConcurrentHashMap
,请参阅问题的结尾以了解基本原理。使用 Guava 集合,a
MultiMap <Date, Order>
会更简单。驱逐是类似的,明确实施。虽然
Cache
实现看起来很吸引人(毕竟,我正在实现缓存),但我不确定驱逐选项。驱逐每天只发生一次,最好从缓存外部启动,我不希望缓存必须检查订单的年龄。我什至不确定缓存是否会使用 MultiMap,我认为在这种情况下它是一个合适的数据结构。
因此,我的问题是:是否可以使用 Cache 使用并公开 MultiMap 的语义并允许从外部控制驱逐,特别是使用我需要的规则(“删除所有早于 N 天的订单”)?
作为一个重要的说明,我对 a 不感兴趣,LoadingCache
但我确实需要批量加载(如果需要重新启动应用程序,则必须从数据库中填充缓存以及最后 N 天的订单)。
编辑:忘了提到地图需要是并发的,因为订单进来时,它们会针对同一客户或位置等的先前订单进行实时评估。
EDIT2:刚刚偶然发现Guava 问题 135。看起来 MultiMap 不是并发的。