java—如何迭代缓存条目

z9smfwbn  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(477)

我在独立环境中使用spring3.1。我正在使用@cacable注解缓存我的条目。
有时我需要迭代缓存列表以获得特定的值(而不是键)。
因此,我设法检索缓存列表,但我如何迭代它的元素。

private ClientDTO getClientDTOByClientId(Integer clientId)
{

    Cache clientCache = null;
    try
    {
        clientCache = ehCacheCacheManager.getCache("client");

          //need here to iterate on clientCache. how?

    }
    catch (Exception e)
    {
        log.error("Couldnt retrieve client from cache. clientId=" + clientId);
    }
    return clientDTO;
}

我正在使用ehcache机制。

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
        p:cache-manager-ref="ehcache" />

    <bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
        p:config-location="classpath:ehcache.xml" />

谢谢,雷。

6fe3ivhb

6fe3ivhb1#

getcache()返回一个net.sf.ehcache.cache,它有一个getkeys()方法,该方法返回可以迭代的缓存键列表。要检索已存储的实际对象(与 Package 的net.sf.ehcache.element相反),请使用element.getobjectvalue()。
edit:根据spring的说法,它们似乎永远都不支持cache.getkeys(),所以您必须强制转换到底层提供程序。
像这样:

public boolean contains(String cacheName, Object o) {
  net.sf.ehcache.EhCache cache = (net.sf.ehcache.EhCache) org.springframework.cache.CacheManager.getCache(cacheName).getNativeCache();
  for (Object key: cache.getKeys()) {
    Element element = cache.get(key);
    if (element != null && element.getObjectValue().equals(o)) {
      return true;
    }
  }
  return false;
}
kt06eoxx

kt06eoxx2#

另一个解决方案是使用getnativecache()方法将org.springframework.cache.cache解析为javax.cache.cache,并使用java迭代器,因为javax.cache.cache已经扩展了iterable>。
有关更多详细信息,请阅读javax.cache.cache javadoc

Cache cache = (Cache) cacheManager.getCache("yourCacheName").getNativeCache();
    Iterator<Cache.Entry> iterator = cache.iterator();

    while (iterator.hasNext()) {
        String key = (String) iterator.next().getKey();
        System.out.println(key);
    }
nafvub8i

nafvub8i3#

下面的方法将给出一组缓存对象的键,但是如果在这里添加带有键的缓存,则很容易检索(如果直接添加要缓存的对象列表,则无法检索)。
另外,我在缓存管理器中使用了guavacache,如下所示。

@Bean
public CacheManager cacheManager() {
    SimpleCacheManager simpleCacheManager = new SimpleCacheManager();

    GuavaCache userLabCache = new GuavaCache("yourCacheName",
            CacheBuilder.newBuilder().expireAfterAccess(5, TimeUnit.MINUTES).build());
    simpleCacheManager.setCaches(Arrays.asList(userLabCache));
    return simpleCacheManager;
}

然后它将返回作为对象的键列表,然后您将获得键,您可以遍历键并从缓存中逐个获取对象。
类中的autowire springboot cachemanager

@Autowired
CacheManager cacheManager;

下面是获取所有密钥的代码。

public Set<Object> getAllCachedUserLabKeys() {
    Set<Object> keys = null;
    try {
        GuavaCache cache = (GuavaCache) cacheManager.getCache("yourCacheName");
        if (cache != null) {
            ConcurrentMap<Object, Object> cachedMap = cache.getNativeCache().asMap();
            keys = cachedMap.keySet();
        }
    } catch (Exception e) {
        LOGGER.error("Unknown exception occured while fetchting all cached User Labs..!", e);
    }
    return keys;
}

相关问题