Есть ли такая возможность, как сочетание возможностей Guava Cache
и Multimap
? По сути, мне нужна коллекция, где записи истекают по истечении заданного времени, например, доступны в Cache
, но у меня есть уникальные ключи, и мне нужны записи, которые истекают независимо.Java Guava комбинация Multimap и Cache
ответ
Я думаю, что Луи Вассерман дал ответ в одном из комментариев выше, то есть нет готового комбо Multimap
и Cache
. Я решил свои проблемы/требования с решением, изложенным в псевдокоде ниже:
private Cache<Integer,Object> cache = CacheBuilder.newBuilder().SomeConfig.build();
private Multimap<Integer,Object> multimap = HashMultimap<Integer, Object>.create();
private AtomicInteger atomicid = new AtomicInteger(0);
public void putInMultimap(int id, Object obj) {
int mapid = atomicid.addAndGet(1);
cache.put(mapid,obj);
multimap.put(id,mapid);
}
public List<Object> getFromMultimap(int id) {
Set<Integer> mapids = multimap.get(id);
List<Object> list = new ArrayList<Object>();
for (int i : mapids) {
list.add(cache.getIfPresent(i));
}
return list;
}
Это простое «решение» имеет некоторые ограничения, но он хорошо работает для меня.
С помощью кэша Guava нет метода, кеш предназначен для самозаполнения. Значения, возвращаемые из ключевого поиска, вычисляются во время выполнения. Аналогичный подход используется Commons Collections Transformer Factories.
Я думаю, что вы можете реализовать то, что ищете довольно легко. Если вы посмотрите на простой пример с поддержкой карты, например Kitty-Cache, вы можете увидеть, что вы можете заменить карту на Multimap и переписать другие методы соответственно. Таким образом, в KittyCache.java внутренне вы могли бы иметь что-то вроде:
Multimap<K, CacheEntry<V>> cache;
Хитрость для такого рода кэш является то, что на самом деле ничего не заканчивается, пока кто-то не затребовал.
«С кэшем Guava нет метода put, кеш предназначен для самозаполнения» - это не так. Верно, что 'Cache' не имеет метода« put »и что« LoadingCache »предназначен для самозаполнения, но вы всегда можете использовать кеш без загрузки и вызывать' cache.asMap(). Put (.. .) ', чтобы добавить свои собственные записи. Конечно, это не дает вам мультимапа. Просто исправление этого первого заявления. – Ray
Поскольку Guava 11.0 существует [метод put] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/Cache.html#put (K, V)) в 'Cache'. Пример, который вы предоставили, интересен, но я не могу полагаться на истечение срока на запросы, я реализую 'RemovalListener' для получения уведомления об истечении срока действия в' Cache'. – hgus1294
Спасибо, что поставил этот прямой Рэй. Я цитировал: http://java.dzone.com/articles/google-guava-cache –
Пока вы говорите о Cache
и не LoadingCache
вы могли бы пройти Cache.asMap()
вид в Multimaps.newMultimap
.
Интересно. Я провел некоторое тестирование, но я не могу заставить записи истекать независимо. Я передал 'Cache.asMap()' в 'Multimaps.newMultimap' в соответствии с вашим предложением и сделал небольшое тестирование с параметром 'expireAfterWrite', установленным на 1000 мс, и выполнил следующий сценарий: ' map.put (1, Object1); '' Thread.Sleep (700) '' map.put (1, Object2), '' Thread.Sleep (500) '. На этом этапе я ожидаю, что первая запись будет выселена, а вторая останется, но я считаю, что обе записи будут выселены. Возможно, я делаю что-то неправильно, но если я не могу изменить поведение, это не сработает для меня. – hgus1294
- 1. Java - ошибка Google Guava Multimap
- 2. Таблица MultiMap с Guava
- 3. Spring MVC mapping Guava Multimap
- 4. Guava Cache get Устаревание
- 5. Guava cache expireAfterAccess выпуск
- 6. Guava cache asMap метод
- 7. Ключ возврата от значения в Guava Multimap
- 8. Как перезагрузить google guava cache
- 9. Как хранить записи Guava Multimap в Java Util List?
- 10. Как выводить уникальные ключи с помощью MultiMap из Guava? (Java)
- 11. spring - using google guava cache
- 12. guava: Multimap получить объекты из коллекции
- 13. Как сортировать guava multimap? (KEY = ДАТА)
- 14. Spark Cassandra NoClassDefFoundError guava/cache/CacheLoader
- 15. Google Guava Cache On App Engine
- 16. Java Guava Cache: Как очистить все записи кэша?
- 17. Как перебрать guava MultiMap, когда ключ получен из списка
- 18. Guava - Google Cache - loadSuccessCount всегда 0
- 19. Принудительное обновление в определенное время Guava Cache
- 20. Multimap of Multimap Java - классифицировать расписание
- 21. Изящный выход из Guava Cache call()
- 22. Java MultiMap Not Recognizing Key
- 23. Java Guava: удалять и возвращать элементы из Multimap во время итерации
- 24. Multimap и gson performance
- 25. Java - Ищет сортировку MultiMap, которая реализует Navigable
- 26. Как отсортировать Guava MultiMap по количеству значений для каждой клавиши
- 27. Почему Guava (14.0.1) MultiMap putAll не компилируется с Groovy @TypeChecked?
- 28. Явный эквивалент C++ multimap
- 29. Как устранить дубликаты в значениях MultiMap в Guava?
- 30. Guava: Действительно ли листинг Multimap для универсальных супертипов?
Как вы справляетесь с постоянно растущим мультимапом? – neu242
@ neu242 для части 'SomeConfig' в текущем ответе вы можете добавить там вызов' .removalListener', который будет вызываться всякий раз, когда что-то выдается из кеша, так что вы также можете удалить его из multimap – Philipp