创建缓存时如何将所有缓存名称及其数据放入 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&lt;Cache.Entry&lt;K,V&gt;&gt;,您可以使用iterate() 来检查条目并访问键和值来进行计数。 你能给我看看例子吗? 就像for( Cache.Entry&lt;String, GenericClassForList&gt; entry : operatingParametersCache) String key = entry.getKey(); GenericClassForList value = entry.getValue(); /*use those*/ 尝试显示为 ans,以便我可以为你的 ans thomas 投票 【参考方案1】:

Cache 实现了Iterable&lt;Cache.Entry&lt;K,V&gt;&gt;,因此您可以遍历条目以获取每个缓存的键和值,例如像这样:

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<> 中?的主要内容,如果未能解决你的问题,请参考以下文章

python 缓存

如何使putAll原子?

缓存 (商品分类数据) 和 (品牌数据和规格数据)

将数据存储在缓存/内存中,而不会在程序结束时销毁它们

Hibernate一级缓存

如何使用 htaccess 将 fontawesome 放入缓存中