2012-08-06 171 views
6

我在独立环境中使用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; 
} 

我使用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" /> 

谢谢, 射线。

回答

12

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

编辑: 根据春季it doesn't look like they will ever support 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; 
} 
+2

但我没有cache.getKeys()方法。我正在使用org.springframework.cache.Cache – rayman 2012-08-06 14:16:29

+0

您是否找到任何解决方案?如何迭代infinispan Cache。我需要钥匙。 – 2016-09-15 08:07:03

+1

您是否投向底层提供商? – 2016-09-15 15:01:54