对于不同的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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!