获取磁盘大小持久化Ehcache数据

时间:2017-09-05 10:50:26

标签: java ehcache

我正在使用Ehcache 3.4在我的应用程序停机时将一些数据保存到磁盘并为磁盘持久性设置一些最大大小。 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。这有什么事吗?当尺寸超过所需尺寸时会发生什么?

1 个答案:

答案 0 :(得分: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();
}
相关问题