EHCache 3.5 获取所有缓存键/条目

10

我正在使用 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中似乎是可以的。

谢谢


我有2.9.1版本,也找不到实现这个的方法。 - Line
3个回答

8
为什么不试试这样做呢?
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);
}

谢谢回复。我很惊讶居然没有简单的方法来做这件事,而且我认为我的解决方案更简单一些,但是我还是会点赞你的答案。 - robjwilkins
谢谢。这更与JDK相关。缓存是可迭代的,但不是集合。因此,forEach不可用。但是,我的解决方案实际上更高效和标准。收集所有键,然后获取它们将会消耗内存和CPU。如果需要,您也可以使用一个好老的for(:)。我会相应地更新答案。 - Henri

8

出于分层模式的原因,Ehcache 的 API 调用不是简单的操作。由于支持层次模型,实现所有键或值在 heap 上可能会导致 JVM 内存溢出。

正如其他答案所示,有方法可以实现这一点。

但是,一次性获取缓存的全部内容被认为是缓存反模式(caching anti-pattern)。


我在数据库中有一个配置,它是一个有5个字段和400条记录的表。我想先将其加载到类中(从ehCache中)然后再使用。这仍然是不良模式吗? - Line

4

我找到了一种方法来做这件事,但感觉有点不对劲:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接