Есть ли в java одновременная, саморазвивающаяся и упорядоченная хеш-карта - PullRequest
3 голосов
/ 27 мая 2011

Я использую ConcurrentHashMap из Google Guava (через MapMaker), но эта реализация не упорядочена. В Google Guava есть ConcurrentSkipListMap, но эта структура не может устареть.

Есть ли какая-либо структура, которая может сделать оба?

Ответы [ 7 ]

2 голосов
/ 27 мая 2011

Я бы использовал ConcurrentSkipListMap и периодически повторял бы карту, чтобы удалить устаревшие данные. Так как список пропусков неограничен, это открывает возможность утечки памяти, когда поток выселения не может наверстать упущенное, но на практике это кажется очень, очень маловероятным, если вы не сделаете что-то экстремальное. Я также сделал что-то подобное, когда я этого не делал хочу использовать фоновый поток:

static AtomicInteger cnt = new AtomicInteger();

Val put(K key, V val){
    //Do the usual stuff
    if(cnt.getAndIncrement() % 100 == 0){
        //iterate map and evict stuff
    }
}

if(cnt.getAndIncrement() % 100 == 0), возможно, был "умной оптимизацией", так что, возможно, вы могли бы просто повторять и выселять каждый раз, как предполагает Мэтт b.

О, только одна оговорка, когда вы делаете это ... Обязательно нарушайте равенство между различными объектами, когда отметки времени совпадают:

class Entity implaments Comparable<Entity>{
    static AtomicInteger SEQ = new AtomicInteger();
    int id = SEQ.getAndIncrement();
    long timeStamp = System.currentTimeMillis();

    int compareTo(Entity other){
        // compare by timestamp
        // If timestamps are equal, don't just return 0 yet!!
        // Compare by id and return 0 ONLY IF the id equals.
        // Otherwise entities disappear from your ordered map and 
        // it's really annoying to debug.
}
1 голос
/ 27 мая 2011

Расширьте java.util.LinkedHashMap и переопределите removeEldestEntry (), чтобы сделать все, что вы хотите.

0 голосов
/ 19 июня 2011

Трудно найти хорошие реализации карт с истекающим сроком действия.Помимо Гуавы, вы можете взглянуть на ExpiringMap .Это должно быть довольно просто поменять местами реализацию сортированной карты, чтобы удовлетворить ваши потребности.

0 голосов
/ 27 мая 2011

Звучит так, будто вы хотите упорядоченный просмотр одновременно истекающей карты. Вы можете построить один из ForwardingMap

0 голосов
/ 27 мая 2011

Почему бы просто не использовать две упорядоченные карты?Один определяется меткой времени и используется для поиска событий с истекшим сроком действия.Другой вводится с помощью UUID и используется для поиска событий.При удалении событий с истекшим сроком используйте UUID события для удаления со второй карты.

0 голосов
/ 27 мая 2011

Если у вас есть упорядоченная Карта (я предполагаю, что порядок основан на отметке времени), то всякий раз, когда вы добавляете или получаете элементы с Карты, вы можете просто сканировать от наименее упорядоченного значения на Карте до текущей отметки времени - 60 секунд и удалите все, что не хватает. Упорядоченное свойство карты означает, что вам не нужно сканировать полный список при каждой операции.

0 голосов
/ 27 мая 2011

Похоже, у вас очень специфические и необычные требования. Возможно, вам придется написать это самостоятельно.

...