2014-02-21 177 views
0

我配置了Ehcache作爲下一:的Ehcache錯過數和命中率統計

<cache name="test-cache" 
     maxEntriesLocalHeap="50" 
     maxEntriesLocalDisk="50" 
     eternal="false" 
     diskSpoolBufferSizeMB="10" 
     timeToIdleSeconds="90" 
     timeToLiveSeconds="60" 
     memoryStoreEvictionPolicy="LFU" 
     transactionalMode="off"> 
    <persistence strategy="localTempSwap"/> 
</cache> 

而下面的代碼使用它:

Ehcache cache = CacheManager.getInstance().getCache("test-cache"); 
    cache.setStatisticsEnabled(true); 
    cache.setStatisticsAccuracy(Statistics.STATISTICS_ACCURACY_GUARANTEED); 

    /* put 100 elements */ 
    for (int i = 1; i <= 100; i++) { 
     cache.put(new Element("key-"+i, "value-"+i)); 
    } 

    /* hit 100 elements in cache 10000 times */ 
    for (int i = 1; i <= 100; i++) { 
     for (int j = 1; j <= 100 ; j++) { 
      cache.get("key-"+j); 
     } 
    } 

    /* consider values of misses, onDiskMisses, inMemoryMisses */ 
    System.out.println("Statistics = " + cache.getStatistics().toString()); 

我已經準備了簡單的一類演示中,你可以運行https://github.com/Bezuhlyi/ehcahce-statistics-test

你可以看到,錯過!= inMemoryMisses + offHeapMisses + onDiskMisses

問題是實際上Statistics.getCacheMisses()重要?

此外,自然緩存命中率=命中/(命中+未命中)。那麼知道Ehcache實例的實際命中率的正確方法是什麼?

我還沒有發現它在文檔中沒有任何用處,以及有關SampledCacheStatistics的用途。

回答

0

我可能應該閱讀代碼來說明問題,但我會說我認爲是從內存中發生的事情:高速緩存未命中是未找到映射的操作。因爲「層級」的缺失是每個層級上的個人錯失。因此,如果映射始終位於較低層中,那麼您可能會有許多「堆層未命中」,而從不會有單個緩存未命中。

現在我的答案可能會受到您使用的Ehcache的確切版本的影響,但留下一些古怪的東西,我希望這就是您所遇到的。

+0

'cacheHits = 5180' 'inMemoryHits = 4664' 'onDiskHits = 516' '命中= 4820' 'onDiskMisses = 4820' 'inMemoryMisses = 5336' 現在,看到這個數字,我可以說,你是對的。謝謝。 –

+0

當我們需要[** SampledCacheStatistics **](http://ehcache.org/apidocs/2.6.5/net/sf/ehcache/statistics/sampled/SampledCacheStatistics.html)或者它的用法是什麼時? –