0

Tomcat Java Web アプリケーションのコレクションに一定期間だけいくつかの値を保存したいと考えています。

シナリオは次のとおりです。

  • value1最初に追加されます
  • value21分後に追加value1
  • value3が追加された直後にvalue2追加されます
  • value4が追加されます が追加されてから 2 分後value1に追加されます

この値は、追加してから 5 分間しか使用できないはずです。5 分後にリストから削除する必要があります。最終アクセス時間に関係なく、すべての値は (追加した後) 5 分後に期限切れになります。

ConcurrentHashMapとを使用して、すでにこれを実装し始めていScheduledExecutorます。

この要件を満たす適切な組み込みのキャッシュ メカニズムが見つかりませんでした。キャッシュが使用されている場合、値がより頻繁にアクセスされても、リストから値が削除または期限切れになることはありません。

誰かが私に方向性や既存の実装への参照を与えることができれば感謝します。

4

4 に答える 4

3

グーグルグアバはそれを行うことができます(非常に簡単です)

com.google.common.cache.Cache<Integer, String> values = CacheBuilder.newBuilder().concurrencyLevel(4).expireAfterWrite(5, TimeUnit.MINUTES).maximumSize(20).build();        

values.put(someKey, "string val");
于 2012-07-31T07:55:31.447 に答える
1

手動で行う場合は、次の簡単なアイデアがあります。

  1. 保存したい型を日付でラップするクラスを作成します。
  2. ExtendHashMapは、メソッドをオーバーライドしてget()、日付をチェックし、null日付が古すぎる場合は戻り、それ以外の場合は格納されているオブジェクトを返します。

編集:

メモリに問題がある場合は、マップを反復して、X 分ごとに期限切れの値を削除できます。これを行うには、オーバーライドされたget()メソッドで最後のクリーンアップ日付を確認し、それが X 分以上前の場合は今すぐクリーンアップを行います。ただし、メモリの問題がない場合は、これをスキップすることもできます。

于 2012-07-31T08:02:10.730 に答える
1

java.util.* で提供されるそのようなコレクションはありません。

1 つのオプションは、guava のCacheです。インスタンスはCacheBuilderを介して作成できます。あなたの場合、最も興味深い方法はexpireAfterWriteです。

于 2012-07-31T06:33:33.530 に答える
0

各クライアント Cookie の値を保存することについて話している場合は、これに使用できます。

于 2012-07-31T06:44:09.473 に答える