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

Getting the size of disk persisted Ehcache data

我正在使用 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 用于返回磁盘持久数据的当前大小。有什么办法吗?当尺寸超过要求的尺寸时会发生什么?

如果您要求 20MB,磁盘 space 将达到 20MB,然后开始逐出。

然后,要知道大小,总要看磁盘。

此外,还有一个非官方统计数据API。所谓非官方,我的意思是它是内部的东西,可能会改变或消失。但现在,它就在那里。您可以检索缓存的统计信息,然后检索底层的统计信息。

这是一个例子。请注意,实际占用的磁盘 space 如果比分配的 space 高一点。这是实际 key/value 存储之上的存储开销。

@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();
}