コンテキスト:注文システムの分析システムに取り組んでいます。1日あたり約100,000件の注文があり、分析は過去Nか月(たとえば100日)にわたって実行する必要があります。関連するデータはメモリに収まります。N日後、すべての注文がメモリキャッシュから削除され、過去1日が削除されます。注文は作成または更新できます。
従来のアプローチでは、を使用し
ConcurrentHashMap<Date, Queue<Order>>
ます。毎日、過去N日を超える日付を表すキーの値が削除されます。しかし、もちろん、Guavaを使用することの全体的なポイントはこれを回避することです。編集:に変更さMap
れましたConcurrentHashMap
。理論的根拠については、質問の最後を参照してください。Guavaコレクションを使用する
MultiMap <Date, Order>
と、より簡単になります。エビクションも同様で、明示的に実装されています。実装は魅力的に
Cache
見えますが(結局のところ、私はキャッシュを実装しています)、エビクションオプションについてはよくわかりません。立ち退きは1日に1回だけ発生し、キャッシュの外部から開始するのが最適です。キャッシュで注文の経過時間を確認する必要はありません。キャッシュがMultiMapを使用するかどうかさえわかりません。この場合、これは適切なデータ構造だと思います。
したがって、私の質問は次のとおりです。MultiMapのセマンティクスを使用および公開し、特に必要なルール(「N日より古いすべての注文を削除する」)を使用して、外部から制御されるエビクションを許可するキャッシュを使用することは可能ですか?
重要な説明として、私は興味がありLoadingCache
ませんが、一括ロードが必要です(アプリケーションを再起動する必要がある場合は、データベースから、過去N日間の注文でキャッシュにデータを入力する必要があります)。
編集:地図は同時である必要があることを言及するのを忘れました。注文が入ってくると、同じ顧客や場所などの以前の注文に対してライブで評価されます。
EDIT2:グアバの問題135に出くわしました。MultiMapは同時ではないようです。