Доступ к элементам кэша, сгруппированным по ключу - PullRequest
0 голосов
/ 31 января 2019

Я хочу кэшировать большое количество объектов Java (String, byte []) с помощью составного ключа (String, int) в кеше, например JCS или Infinispan.

Ключи могут быть сгруппированы построковая часть (назовем это ID) этого:

KEY = VALUE
-------------
A 1 = valueA1
A 4 = valueA4
A 5 = valueA5
B 9 = valueB9
C 3 = valueC3
C 7 = valueC7

Мне нужно удалить элементы, сгруппированные по части идентификатора ключа, поэтому, например, A должен удалить A 1, A 4 и A 5.

Сначала я попробовал что-то вроде этого:

   final List<String> keys = cache.keySet()
            .stream().filter(k -> k.getId().equals(id)).collect(Collectors.toList());
    keys.forEach(cache::remove);

Хотя это работает, это - не удивительно - очень дорого и, следовательно, медленно.

Поэтому я попробовал другой подход, используятолько идентификатор в качестве ключа и группируйте значения на карте:

KEY = VALUE
---------------------------------------------
  A = {1 = valueA1, 4 = valueA4, 5 = valueA5}
  B = {9 = valueB9}
  C = {3 = valueC3, 7 = valueC7}

Удаление группы очень эффективно:

cache.remove(id);

Но для помещения требуется получить:

    Map<Integer, Value> map = cache.get(key.getId());
    if (map == null) {
        map = new HashMap<>();
    }
    map.put(key.getInt(), value);

    cache.put(key.getId(), map);

Теперь в кеше меньше элементов с более простым ключом, но значения больше и сложнее.Тестирование с сотнями тысяч элементов в кэше, удаление выполняется быстро, а размещение и получение не кажутся заметно медленнее.

Это правильное решение или есть лучшие подходы?

1 Ответ

0 голосов
/ 31 января 2019

Я предлагаю вам использовать computeIfAbsent и сохранить вызов put и get следующим образом:

cache.computeIfAbsent(key.getId(), k -> new HashMap<Integer,Value>()).put(key.getInt(),value);

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

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...