Spring @Cacheable 在 Spring 中无法与自定义键一起正常工作

Posted

技术标签:

【中文标题】Spring @Cacheable 在 Spring 中无法与自定义键一起正常工作【英文标题】:Spring @Cacheable not working properly with custom key in spring 【发布时间】:2020-01-13 11:45:54 【问题描述】:

对于 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;
    

【问题讨论】:

【参考方案1】:

我认为您对一般概念有误解。如果您使用@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

【讨论】:

以上是关于Spring @Cacheable 在 Spring 中无法与自定义键一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Spring 缓存注解@Cacheable的用法

如何让 Spring @Cacheable 在 AspectJ 方面工作?

使用@Cacheable 的Spring 缓存在启动@PostConstruct 时不起作用

在 Spring 中将 @Cacheable 用于非参数方法

@Cacheable使用spring缓存

Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)