gpt4 book ai didi

java - 用于基于天的缓存过期的缓存或 MultiMap?

转载 作者:行者123 更新时间:2023-11-29 05:51:57 25 4
gpt4 key购买 nike

上下文:我正在为订购系统开发分析系统。每天大约有 100,000 个订单,分析需要在最后 N(比如 100)天的月份中运行。相关数据适合内存。 N 天后,所有订单都从内存缓存中逐出,过去的一整天都被逐出。可以创建或更新订单。

  1. 传统方法会使用 ConcurrentHashMap<Date, Queue<Order>> .每天,表示过去 N 天以上日期的键的值将被删除。但是,当然,使用 Guava 的全部意义在于避免这种情况。编辑:更改MapConcurrentHashMap ,请参阅问题的结尾以了解基本原理。

  2. 使用 Guava 集合,一个 MultiMap <Date, Order>会更简单。驱逐类似,明确实现。

  3. 虽然 Cache实现看起来很吸引人(毕竟,我正在实现缓存),但我不确定驱逐选项。逐出每天只发生一次,最好从缓存外部启动,我不希望缓存必须检查订单的年龄。我什至不确定缓存是否会使用 MultiMap,我认为在这种情况下它是一种合适的数据结构。

因此,我的问题是:是否可以使用缓存,它使用并公开 MultiMap 的语义并允许从自身外部控制逐出,特别是使用我需要的规则(“删除所有早于 N 天的订单” )?

作为重要说明,我对 LoadingCache 不感兴趣但我确实需要批量加载(如果需要重新启动应用程序,则必须使用最后 N 天的订单从数据库中填充缓存)。

编辑:忘记提及 map 需要是并发的,当订单进来时,它们会根据相同客户或位置等的先前订单进行实时评估。

EDIT2:刚刚偶然发现 Guava issue 135 .看起来 MultiMap 不是并发的。

最佳答案

我不会使用 Cache也不是 Multimap这里。虽然我喜欢并使用它们两者,但这里并没有太多收获。

  • 您想手动逐出您的条目,所以 Cache 的功能不要真的习惯这里。
  • 您正在考虑 ConcurrentHashMap<Date, Queue<Order>> ,这在某种意义上比 Multimap<Date, Order> 更强大.

我会使用 Cache ,如果我考虑不同的驱逐标准,并且如果我想随时丢失其中的任何条目,1 没问题。

您可能会发现您需要一个 ConcurrentMap<Date, Dequeue<Order>>或者也许 ConcurrentMap<Date, YouOwnQueueFastSearchList<Order>>管他呢。这可能可以通过 Multimap 以某种方式进行管理,但恕我直言,它变得更复杂而不是更简单。

我会问自己“我在这里使用 CacheMultimap 有什么好处?”。对我来说,它看起来像普通的旧 ConcurrentMap提供您需要的一切。


1 我绝不是说 Guava 会发生这种情况。相反,如果没有驱逐原因(容量、到期...),它的工作方式就像 ConcurrentMap。 .只是你所描述的感觉更像是一个 Map而不是 Cache .

关于java - 用于基于天的缓存过期的缓存或 MultiMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13565079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com