簡體   English   中英

Spring @Cacheable在春季無法與自定義鍵一起正常使用

[英]Spring @Cacheable not working properly with custom key in spring

對於不同的cachedData值,它每次都從參數中的cachedData提取響應日期,而據我了解,對於特定的propertyId,如果已經調用了某些cachedData參數,則不應再次獲取,而應從緩存中選擇。

的MyMethod

@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來命名您的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM