对于不同的cachedData值,它每次都从参数中的cachedData提取响应日期,而据我了解,对于特定的propertyId,如果已经调用了某些cachedData参数,则不应再次获取它,而应该从缓存中选择。

我的方法

@Cacheable(value = "responseCached", key="#propertyId", condition = "#result != null")
public Date fetchCachedData(String propertyId, Map<String, Date> cachedData) {
    return cachedData.get(propertyId);
}


ehCacheConfig



@EnableCaching
@Configuration
public class EhCacheConfig {

    @Bean
    public EhCacheManagerFactoryBean ehCacheManagerFactory(){
        EhCacheManagerFactoryBean ehCacheBean = new EhCacheManagerFactoryBean();
        ehCacheBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
        ehCacheBean.setShared(true);
        return ehCacheBean;
    }

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager cacheManager = new SimpleCacheManager();
        List<Cache> caches = new ArrayList<Cache>();
        caches.add(new ConcurrentMapCache("responseCached"));
        cacheManager.setCaches(caches);
        return cacheManager;
    }
}

最佳答案

我认为您对一般概念有误解。如果用@Cacheable注释方法,则在数据已经在缓存中的情况下,避免执行此方法。在您的示例中,缓存是ConcurrentMapCache而不是cachedData。简单的例子是:

@Cacheable(value = "responseCached", key="#propertyId")
public Date fetchData(String propertyId) {
    // computing or I/O intensive code to produce result here
    Date d = ...
    return d;
}


对于唯一的propertyId方法fetchData仅执行一次。您可以省略键定义,因为它是唯一的参数。

方法名称fetchCachedData的注释:Spring缓存抽象的思想是,方法的用户(理想情况下)不需要知道是否缓存了某些内容。最好以业务领域中的某些名称(例如fetchOfferDate)命名您的方法。

10-06 03:30