创建缓存时如何将所有缓存名称及其数据放入 List<> 中?
Posted
技术标签:
【中文标题】创建缓存时如何将所有缓存名称及其数据放入 List<> 中?【英文标题】:How to put all the Cache names and their data in List<> when cache is created? 【发布时间】:2020-01-20 06:34:47 【问题描述】:我使用过 Ehcache 3,而且我是 Ehcache 3 的新手,我有一个缓存管理器,如下所示:
private CacheManager cacheManager;
现在当对象被创建时 cacheManager 被初始化:
public ListPlanImpl()
System.out.println("constructore being initalized");
System.getProperties().setProperty("java -Dnet.sf.ehcache.use.classic.lru", "true");
cacheManager = CacheManagerBuilder
.newCacheManagerBuilder().build();
cacheManager.init();
缓存管理器初始化后,这是我的主要类,所有获取和放入缓存的操作都在发生。我已将多个数据插入到不同的缓存中,例如:
@Stateless
public class ListPlanImpl implements CachePlan,ListPlan
private static final String CACHE_OPERATING_PARAMETER = "cache_key_operating_parameter";
private static final String CACHE_SECURITY_PARAMETER = "cache_security";
private static Cache<String, GenericClassForList> operatingParametersCache;
private static Cache<String, GenericClassForList> securitiesTradingParameterCache;
public void putInCache() throws ExecutionException, InterruptedException
System.out.println("putting in list");
this.operatingParametersCache = cacheManager
.createCache("cacheOfOperatingParameters", CacheConfigurationBuilder
.newCacheConfigurationBuilder(
String.class, GenericClassForList.class,
ResourcePoolsBuilder.heap(1000000000)).withExpiry(Expirations.timeToLiveExpiration(Duration.of(60000,
TimeUnit.SECONDS))));
operatingParametersCache.put(CACHE_OPERATING_PARAMETER, new GenericClassForList(this.operatingParamService.getOperatingParamDTO()));
this.securitiesTradingParameterCache = cacheManager
.createCache("cacheOfSecurityTrading", CacheConfigurationBuilder
.newCacheConfigurationBuilder(
String.class, GenericClassForList.class,
ResourcePoolsBuilder.heap(1000000000)).withExpiry(Expirations.timeToLiveExpiration(Duration.of(60000,
TimeUnit.SECONDS))));
securitiesTradingParameterCache.put(CACHE_SECURITY_PARAMETER, new GenericClassForList(this.securitiesTradingParamsService.getSecuritiesTradingParamDTO()));
我想要一个单独的函数,它将返回所有缓存名称和缓存中数据总数的计数,以便我可以在 UI 中显示包含数据的缓存。我搜索了问题,但我没有'没有找到解决方案。
【问题讨论】:
好吧,既然Cache 扩展了Iterable<Cache.Entry<K,V>>
,您可以使用iterate()
来检查条目并访问键和值来进行计数。
你能给我看看例子吗?
就像for( Cache.Entry<String, GenericClassForList> entry : operatingParametersCache) String key = entry.getKey(); GenericClassForList value = entry.getValue(); /*use those*/
。
尝试显示为 ans,以便我可以为你的 ans thomas 投票
【参考方案1】:
Cache
实现了Iterable<Cache.Entry<K,V>>
,因此您可以遍历条目以获取每个缓存的键和值,例如像这样:
for( Cache.Entry<String, GenericClassForList> entry : operatingParametersCache)
String key = entry.getKey();
GenericClassForList value = entry.getValue();
//if counting just increasing a counter might be sufficient,
//otherwise use the key and value as needed
由于您已经引用了缓存,只需将该方法应用于每个单独的缓存。
如果您手边没有参考资料,您可以在缓存的已用别名上保留一些注册表(您提供别名以便您可以使用这些别名从缓存管理器中获取缓存)。如果您不能这样做,您可能需要跟踪提供给缓存管理器的别名,例如通过用委托包装它。
【讨论】:
使用 lamda 表达式? @AshwinKarki 好吧,为此我需要知道你到底想做什么——除此之外请注意,流和 lambda 并不是万能的。如果您不熟悉它们,使用流和 lambdas 甚至可能会损害可读性,因为它更难维护和发现错误(至少现在 - 一旦您更熟悉这些概念,这可能会改变)。以上是关于创建缓存时如何将所有缓存名称及其数据放入 List<> 中?的主要内容,如果未能解决你的问题,请参考以下文章