EHCache 3.5 获取所有缓存键/条目
EHCache 3.5 Get All Cache Keys / Entries
我正在使用 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 中是可能的。
谢谢
我找到了一个方法,但是有点味道:
Set<String> keys = new HashSet<>();
cache.forEach(entry -> keys.add(entry.getKey()));
List<Foo> foos = cache.getAll(keys).values().stream().collect(toList())
为什么不是这样的?
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);
}
根据设计,这不是 Ehcache 中的简单 API 调用。由于它支持的分层模型,在堆上实现所有键或值可能会导致 JVM 运行 内存不足。
如其他答案所示,有多种方法可以实现。
但是必须一次获取缓存的全部内容被认为是一种缓存反模式。
我正在使用 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 中是可能的。
谢谢
我找到了一个方法,但是有点味道:
Set<String> keys = new HashSet<>();
cache.forEach(entry -> keys.add(entry.getKey()));
List<Foo> foos = cache.getAll(keys).values().stream().collect(toList())
为什么不是这样的?
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);
}
根据设计,这不是 Ehcache 中的简单 API 调用。由于它支持的分层模型,在堆上实现所有键或值可能会导致 JVM 运行 内存不足。
如其他答案所示,有多种方法可以实现。
但是必须一次获取缓存的全部内容被认为是一种缓存反模式。