EHCache 3.5获取所有缓存密钥/条目

时间:2018-05-16 10:42:53

标签: java ehcache ehcache-3

我使用的是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 :(得分:3)

按照设计,这不是Ehcache中的简单API调用。由于它支持的分层模型,实现堆上的所有键或值可能导致JVM内存不足。

如其他答案所示,有办法实现这一目标。

但它被认为是一种缓存反模式,必须立即获取缓存的全部内容。

答案 1 :(得分:2)

为什么不是这样的?

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);
}

答案 2 :(得分:0)

我找到了一种方法来做到这一点,但它闻起来有点味道:

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

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