我已經配置我的緩存如下:爲什麼我使用Spring緩存服務的高速緩存未命中
@Configuration
@EnableCaching
public class CacheConfig {
@Bean(name = "caffeineCachingProvider")
public CachingProvider caffeineCachingProvider() {
return Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider");
}
@Bean(name = "caffeineCacheManager")
public JCacheCacheManager getSpringCacheManager() {
CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
caffeineConfiguration.setCopierFactory(Copier::identity);
cacheManager.createCache("informerCache", caffeineConfiguration);
return new JCacheCacheManager(cacheManager);
}
}
而且我有一個使用它在下列方式@Service
:
@Service
public class InformerService {
@CacheResult(cacheName = "informerCache")
public List<Product> getProducts(@CacheKey String category, @CacheKey String countrySign, @CacheKey long townId) throws Exception {
Thread.sleep(5000);
// do some work
}
}
所以我有下一個行爲。
- 當我第一次調用服務方法時,它需要5秒鐘 然後按預期做一些工作。
- 調用方法的第二個時間相同的參數 - >緩存工程 - >立即返回
- 導致調用第三次用同樣的參數再次導致
Thread.sleep
而且一遍。
如何解決這個問題?這是關於代理的問題嗎?我錯過了什麼 ?
也許在緩存的過期邏輯中有一個錯誤?不幸的是,TCK在這裏沒有提供太多的覆蓋,所以對於JCache適配器來說,更多的測試是可取的。你可以把它包裝成一個樣本,以便我可以隨你調試嗎?還要注意版本[2.0.3](https://github.com/ben-manes/caffeine/releases)修復了一些JCache問題。 –
我想你找到了一個bug。當「訪問時間」在get後更新時(https://github.com/ben-manes/caffeine/blob/master/jcache/src/main/java/com/github/benmanes/caffeine/jcache/) CacheProxy.java#L173),新時間設置爲當前毫秒,[未調整](https://github.com/ben-manes/caffeine/blob/master/jcache/src/main/java/com/github /benmanes/caffeine/jcache/CacheProxy.java#L1065)到期時間。我會解決這個問題,並在週末添加一些額外的測試。對於那個很抱歉。 –
@BenManes目前我們正在使用版本2.0.3咖啡因lib – marknorkin