4

「ConcurrentHashMap」と「ConcurrentLinkedQueue」のハイブリッドのように。

これが私の要件です
。非同期更新キャッシュ システムが必要です。つまり、memcache に設定する前にすべてのエンティティをラップします。コンテンツがいつ期限切れになるかを示すタイムスタンプがワーパに含まれています。フロントサイドからの各リクエストは memcache からデータをフェッチし、ワーパーが期限切れを示した場合、更新イベントが生成され、concurrentLinkedQueue に入れられ、非同期で更新されるのを待ちます。
問題は、エンティティを何度も無駄に更新したくないということです。イベントをキューに追加する前に、キューに同じエンティティのイベントが存在しないことを確認する方法を見つけたいと考えています。

このような方法で行ってもよろしいでしょうか?

1,warpper クラスを作成します。このクラスには、hashMap とlinkedList が含まれています。そのメソッドはすべて同期されます。

public synchronized boolean add(String key,Object value){
    if(hashMap.containsKey(key)){
        return false;
    }else{
        hashMap.put(key,value);
        return linkedList.offer(value);
    }
}  

このソリューションは非常に遅くなると思います。
Collections.synchronizedMap(new LinkedHashMap()) のようなものかもしれません。

2,concurrentHashMap を使用するだけです。「ポーリング」アクションが必要な場合は、そこから要素をイテレータします。

public Object poll(){
    Collection valueColl = concurrentHashMap.values();
    if(valueColl.isEmpty()){
        retrun null;
    }
    return valueColl.get(0);
}  

アクションconcurrentHashMap.values().get(0)が遅いかどうか?

3,「ConcurrentHashMap」と「ConcurrentLinkedQueue」のソースコードを調べて、可能であれば「ConcurrentUniqueLinkedQueue」を書く。
今のところ、これは私には少し難しいようです。

それで、あなたたちはどう言いますか?

4

2 に答える 2

5

最新の更新を破棄したいとは思いません。必要以上に複雑にしている可能性があります。

public void add(K key, V value) {
    concurrentMap.put(key, value);
    queue.add(key);
}

public V poll() {
    for(K key; (key = queue.take()) != null;) {
        V value = concurrentMap.remove(key);
        if (value != null)
           return value;
        // value will be null if it's a duplicate so ignore and look for more.
    }
    return null;
}

これにより、キューの順番でキーの最新の値が得られます。ロックする必要はありません。

于 2013-02-01T09:16:33.373 に答える