Питання Комбінація Java-гуава з Multimap і кешем


Чи є така штука, як комбінація Гуави Cache і Multimap доступна функціональність? По суті, мені потрібна колекція, де записи закінчуються через певний час, наприклад, доступні в Cache але у мене є не унікальні ключі, і мені потрібно, щоб записи закінчувалися самостійно.


12
2018-03-05 12:23


походження




Відповіді:


Я думаю, що Луїс Вассерман представив відповідь у одному з вищезазначених зауважень, тобто, що немає додаткової комбінації 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;
}

Це просте рішення має певні обмеження, але це добре для мене.


5
2018-03-11 14:14



Як ви маєте справу з постійно зростаючим мультимейпом? - neu242
@ neu242 для SomeConfig частина поточної відповіді ви можете додати a .removalListener дзвоніть туди, який буде викликати кожного разу, коли щось буде виселено з кеш-пам'яті, так що ви також можете вилучити його з мультимапа - Philipp


З кеш-пам'яттю Гуави немає покласти Метод, кеш призначений для самозаповнення. Значення, повернуті з пошуку клавіш, обчислюються під час виконання. Подібний підхід використовується фабриками Commons Collections Transformer.

Я думаю, ви могли б легко реалізувати те, що шукаєте. Якщо ви дивитеся на звичайний приклад, що підтримує карту, наприклад Кіті-Кеш ви можете побачити, що ви можете замінити карту Multimap і переписати інші методи відповідним чином. Так в KittyCache.java Внутрішньо ви могли б мати щось на зразок:

Multimap<K, CacheEntry<V>> cache;

Хитрість цього типу кешу полягає в тому, що ніщо дійсно не закінчується, поки хтось не запитує його.


0
2018-03-05 13:02



"За допомогою кешу-гуави не існує методу" вкладеності ", кеш призначений для самозаповнення" - це не так. Це правда Cache Сам по собі не має методу "покласти" і це LoadingCache призначений для самозаповнення, але ви завжди можете використовувати кеш, що не завантажується, і дзвонити cache.asMap().put(...) щоб додати свої власні записи. Звичайно, це не означає, що ви мультимейп. Просто виправлення першого твердження. - Ray
Оскільки Гуава 11.0 існує [put method] (docs.guava-libraries.googlecode.com/git/javadoc/com/google/..., V)) в Cache. Приклад, який ви надали, є цікавим, але я не можу покладатися на термін дії запитів, я реалізую RemovalListenerотримувати повідомлення про закінчення терміну дії в Cache. - hgus1294
Дякую, що поставили цей прямий промінь. Я цитував: java.dzone.com/articles/google-guava-cache - Mark McLaren
Звичайно, hgus1294 правильно -put був доданий в 11.0. Моя помилка. - Ray
Все це сказано Multimap реалії надзвичайно нетривіальні, а наші внутрішні реалізації не призначені для обробки записів кеша, що закінчуються. Це буде досить великий проект. = / - Louis Wasserman


Поки ви говорите Cache і ні LoadingCache ти міг би пройти Cache.asMap() перегляд Multimaps.newMultimap.


0
2018-03-06 15:00



Цікаво. Я проводив деякі тестування, але не можу отримати записи самостійно. Я пройшов а Cache.asMap() в a Multimaps.newMultimap згідно з вашою пропозицією і здійснив кілька швидких тестування разом з expireAfterWriteвстановлено до 1000 мсек і виконується такий сценарій: map.put(1,Object1);  Thread.Sleep(700)  map.put(1,Object2);  Thread.Sleep(500). На цьому етапі я сподіваюся, що перший виїзд буде виселений, але другий залишиться, але я вважаю, що обидва записи повинні бути виселені. Може, я роблю щось не так, але якщо я не можу змінити поведінку, це не працює для мене. - hgus1294