0

私の要件は、Java ベースの Web アプリケーションで複数のコンシューマーと単一のプロデューサーをサポートする固定サイズのキャッシュを維持することです。私のデータは次のようなものです:

キー 1、キー 2、値

123、abc、リスト1

123、定義、リスト 2

234、xyz、リスト3

クライアントまたはコンシューマーは、key1 と key2 に基づいてこのキャッシュを照会します。そのため、複数のコンシューマが同じキー 1 と 2 に対して同時にキャッシュにアクセスしようとすると、すべてのコンシューマが応答としてキャッシュから同じデータを取得する必要があります。

使用するのに最適なデータ構造を探しています。また、キャッシュ サイズは固定されているため、キャッシュがいっぱいの場合、レコードを挿入する前にプロデューサが最初の要素を削除する必要があることに注意してください。

現在、マップ内のマップを使用しています。つまり、キー 1 は外側のマップ用で、キー 2 は内側のマップ用です。しかし、効率が悪いと感じる情報を得るには、それを調べる必要があります。

なにか提案を?

4

4 に答える 4

0

いくつかの優れたキャッシュ機能を含む、Googleの便利なユーティリティライブラリであるGuavaをチェックしてください。特に、最大サイズをサポートし、自動的に立ち退きを処理します。

2つのキーの問題については、Guavaキャッシュ(または任意の実装)を、2つのキーを受け取り、その組み合わせから1つのキーを生成する別のクラスでラップしてみませんか。

public class MyCache<Key, Value> {
    private final Cache<CacheKey, Value> guavaCache = CacheBuilder.build()

    public void put(Key keyOne, Key keyTwo, Value value) {
        cache.put(new CacheKey(keyOne, keyTwo), value);
    }

    public Value get(Key keyOne, Key keyTwo) {
        return cache.getIfPresent(new CacheKey(keyOne, keyTwo));
    }

    private static final class CacheKey {
        private final Key keyOne;
        private final Key keyTwo;

        CacheKey(Key keyOne, Key keyTwo) {
             this.keyOne = keyOne;
             this.keyTwo = keyTwo;
        }

        @Override
        public int hashCode() {
            int hash = keyOne == null ? 0 : keyOne.hashCode();
            return hash + 31 * keyTwo == null ? 0 : keyTwo.hashCode();
        }

        @Override
        public boolean equals(Object o) {
            // implementation omitted
        }
    }
}
于 2012-12-14T17:15:29.870 に答える
0

you could maintain two ConcurrentHashMaps for the two keys, or one if there is no chance of a conflict. To remember the oldest keys you can maintain a queue with the two oldest keys to remove when cache size limit is reached.

于 2012-12-14T21:01:30.240 に答える
0

カスタムMap実装を負荷係数 1 で目的のサイズにバックアップし、ConcurrentHashMap内部にカウンターを配置して、ラップに必要ConcurrentHashMap以上のものが含まれていないことを確認することをお勧めします。

于 2012-12-14T17:26:38.453 に答える