2017-09-05 89 views
1

我使用的Ehcache 3.4時,我的應用程序正在下降,堅持一些數據到磁盤併爲磁盤持久一些最大規模的Ehcache數據。從文檔的Ehcache實例 :獲取磁盤的大小堅持

PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() 
.with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) 
.withCache("threeTieredCache", 
    CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, 
     ResourcePoolsBuilder.newResourcePoolsBuilder() 
      .heap(10, EntryUnit.ENTRIES) 
      .offheap(1, MemoryUnit.MB) 
      .disk(20, MemoryUnit.MB, true) 
     ) 
).build(true); 

我找不到在了Ehcache庫的API返回磁盤的當前大小保留的數據。這有什麼用嗎?當尺寸超過所需尺寸時會發生什麼?

回答

2

如果你問20MB,磁盤空間將高達20MB,然後將開始驅逐。

以後,才知道大小,總有看盤。

此外,還有一個非官方的統計 API。通過非官方的,我的意思是說內部的東西可能會改變或消失。但現在,它在那裏。您可以檢索緩存的統計信息,然後檢索底層的統計信息。

這裏是一個例子。請注意,如果實際佔用的磁盤空間高於所分配的空間。這是實際密鑰/值存儲上方的存儲開銷。

@Test 
public void test() throws IOException { 
    StatisticsService statisticsService = new DefaultStatisticsService(); 

    try(PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() 
    .with(CacheManagerBuilder.persistence("myData")) 
    .using(statisticsService) 
    .withCache("threeTieredCache", 
     CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, 
     ResourcePoolsBuilder.newResourcePoolsBuilder() 
      .heap(10, EntryUnit.ENTRIES) 
      .offheap(1, MemoryUnit.MB) 
      .disk(20, MemoryUnit.MB, true) 
    ) 
    ).build(true)) { 

    Cache<Long, String> cache = persistentCacheManager.getCache("threeTieredCache", Long.class, String.class); 
    for(long i = 0; i < 1000; i++) { 
     cache.put(i, "test"); 
    } 
    System.out.println("Length: " + getFolderSize("mydata")); 
    TierStatistics tierStatistics = statisticsService 
     .getCacheStatistics("threeTieredCache") 
     .getTierStatistics() 
     .get("Disk"); 
    System.out.println("Occupied: " + tierStatistics.getOccupiedByteSize()); 
    System.out.println("Allocated: " + tierStatistics.getAllocatedByteSize()); 
    } 
} 

private long getFolderSize(String folder) throws IOException { 
    return Files.walk(Paths.get(folder)) 
    .filter(p -> p.toFile().isFile()) 
    .mapToLong(p -> p.toFile().length()) 
    .sum(); 
} 
+0

正是我需要的 –