2012-08-06 74 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