如何迭代缓存条目

ray*_*man 6 java spring caching ehcache

我在独立的环境中使用Spring3.1.我正在使用@Cachable注释来缓存我的条目.

有时我需要迭代缓存列表以获取特定值(而不是键).

所以我设法检索缓存列表,但我怎么能迭代它的元素.

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;
}
Run Code Online (Sandbox Code Playgroud)

我使用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" />
Run Code Online (Sandbox Code Playgroud)

谢谢,雷.

Mat*_*ock 15

CacheManager.getCache()返回一个net.sf.ehcache.Cache,它有一个getKeys()方法,它返回一个可以迭代的缓存键列表.要检索已存储的实际对象(而不是包装的net.sf.ehcache.Element),请使用Element.getObjectValue().

编辑:根据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;
}
Run Code Online (Sandbox Code Playgroud)

  • 但我没有cache.getKeys()方法.我正在使用org.springframework.cache.Cache (2认同)
  • 您是否已投射到基础提供商? (2认同)

小智 7

另一种解决方案,使用 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);
    }
Run Code Online (Sandbox Code Playgroud)