2016-01-15 97 views
2

我已經配置我的緩存如下:爲什麼我使用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 
    } 
} 

所以我有下一個行爲。

  1. 當我第一次調用服務方法時,它需要5秒鐘 然後按預期做一些工作。
  2. 調用方法的第二個時間相同的參數 - >緩存工程 - >立即返回
  3. 導致調用第三次用同樣的參數再次導致Thread.sleep

而且一遍。

如何解決這個問題?這是關於代理的問題嗎?我錯過了什麼 ?

+0

也許在緩存的過期邏輯中有一個錯誤?不幸的是,TCK在這裏沒有提供太多的覆蓋,所以對於JCache適配器來說,更多的測試是可取的。你可以把它包裝成一個樣本,以便我可以隨你調試嗎?還要注意版本[2.0.3](https://github.com/ben-manes/caffeine/releases)修復了一些JCache問題。 –

+1

我想你找到了一個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)到期時間。我會解決這個問題,並在週末添加一些額外的測試。對於那個很抱歉。 –

+0

@BenManes目前我們正在使用版本2.0.3咖啡因lib – marknorkin

回答

3

正如評論中所述,這是JCache適配器中的一個錯誤。感謝您讓我知道這個問題。我發佈了包含此修復程序的版本2.1.0。該版本還包含CaffeineConfiguration的友好初始設置,您在另一個post中找到該設置。

雖然核心庫經過嚴格測試,但JCache適配器過度依賴於JSR的TCK(測試兼容性套件)。不幸的是,測試套件不是非常有效,因此我添加了測試以幫助避免將來出現這些類型的錯誤。

此問題僅發生在JCache中,因爲其版本的過期不受Caffeine的核心庫支持。咖啡因更喜歡使用O(1)設計,通過使用固定持續時間來急切地清理過期條目。 JCache使用per-entry惰性期滿,規範作者假設容量約束用於最終放棄過期條目。我添加了一個warning到有關此功能的文檔,因爲它可能容易出錯。雖然其他JCache實現沒有超出這個範圍,但尚未完成的任務是決定一種機制來幫助緩解這種JCache設計缺陷。

再次感謝您報告此問題。與往常一樣,如果您有任何其他問題或反饋意見,請隨時與我們聯繫。

+0

感謝您快速修復錯誤,並詳細解釋發生了什麼,很高興看到! – marknorkin

相關問題