EHCache 3.5 Получить все ключи / записи кэша - PullRequest
0 голосов
/ 16 мая 2018

Я использую EHCache 3.5.2 и у меня возникают проблемы с получением всех ключей и записей кэша.

Я использую CacheManager для создания кэша.Затем я заполняю его некоторыми данными.Затем я хотел бы получить все записи в кэше.

Пример кода:

Cache<String, Foo> cache = cacheManager.createCache("fooCache",
     CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, Foo.class,
         ResourcePoolsBuilder.heap(20)).build());

cache.putAll(repository.findAll().stream().collect(toMap(Foo::getId, foo -> foo)));

List<Foo> foos = cache.???
List<String> keys = cache.???

Возможно ли это с v3.5?Кажется, это было возможно в более старых версиях EHCache.

спасибо

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Почему бы не что-то подобное?

Map<String, Foo> foos = StreamSupport.stream(cache.spliterator(), false)
  .collect(Collectors.toMap(Cache.Entry::getKey, Cache.Entry::getValue));

или

List<Cache.Entry<String, Foo>> foos = StreamSupport.stream(cache.spliterator(), false)
  .collect(Collectors.toList());

или (по старому стилю)

List<Cache.Entry<String, Foo>> foos = new ArrayList<>();
for(Cache.Entry<String, Foo> entry : cache) {
  foos.add(entry);
}
0 голосов
/ 17 мая 2018

По замыслу, это не простой вызов API в Ehcache. Из-за поддерживаемой многоуровневой модели реализация всех ключей или значений в куче может привести к нехватке памяти JVM.

Как показывают другие ответы, есть способы достичь этого.

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

0 голосов
/ 16 мая 2018

Я нашел способ сделать это, но он немного пахнет:

Set<String> keys = new HashSet<>();
cache.forEach(entry -> keys.add(entry.getKey()));

List<Foo> foos = cache.getAll(keys).values().stream().collect(toList())
...