Я хочу кэшировать большое количество объектов 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);
Теперь в кеше меньше элементов с более простым ключом, но значения больше и сложнее.Тестирование с сотнями тысяч элементов в кэше, удаление выполняется быстро, а размещение и получение не кажутся заметно медленнее.
Это правильное решение или есть лучшие подходы?